[커널 17차] 75주차

2022.02.05 23:16

ㅇㅇㅇ 조회 수:74

74주차는 구정 연휴로 휴식

 

버디 시스템 : http://jake.dothome.co.kr/zonned-allocator-alloc-pages-fastpath/
Page Flag : http://jake.dothome.co.kr/mem_map/

 

__free_one_page()
- 인자로 page, pfn, zone, order, migrate type, fpi_flags를 받는다

- 함수 task_capc()로 compaction을 수행해야 하는지 판단한다. 현재는 NULL이다.
- pageblock order로부터 max order를 구한다. 현재 설정은 9이다


- Sanity check를 수행한다
1) zone 초기화가 안되어 있으면 버그
2) page-flags가 hwpoison 제외하고 켜져 있으면 버그
3) migratetype이 -1이면 버그
4) pfn이 order에 aligned 안되어 있으면 버그
5) page가 zone에 제대로 포함되어 있지 않으면 버그

 

- migratetype이 isolate가 아닌 경우 함수 __mod_zone_freepage_state()로 free pages와 free cma pages에 대한 pcp->vm_stat_diff를 업데이트 해준다 (migratetype이 CMA인 경우)
- 만약 threshold를 넘어가면 글로벌 카운터인 zone->vm_stat[] 및 vm_zone_stat[]에 diff 값을 더해준다

 

- continue_mering 영역 :
- while 문을 돌면서 order가 max order 보다 작으면 다음을 수행한다
1) compaction_capture() 함수로 compaction 수행 여부를 판단한다. 현재는 false이므로 수행하지 않는다
2) 함수 __find_buddy_pfn()으로 buddy의 pfn을 구한다
3) buddy pfn과 pfn, page로부터 buddy page를 구한다
4) 함수 page_is_buddy()로 현재 page가 buddy와 merge 가능한지 판단하고, 불가능하면 done_merging으로 점프한다
5) 함수 del_page_from_free_list()로 buddy를 order 만큼 free list에서 제거한다
6) page와 buddy가 merge된 새 page, pfn을 구하고 order를 1 증가시킨다
7) 1)로 돌아간다

 

- 만약 loop를 모두 돌아서 order = 9가 된 경우 if문으로 들어간다
1) 만약 현재 zone에 isolate pageblock이 없는 경우 order를 1 증가시켜 10으로 만들고 다시 continue_mering로 점프한다. 즉 order = 10으로 merge를 시도한다
2) 만약 order = 9 상태에서 buddy와 page가 migratetype이 동일한 경우에도 order를 1 증가시켜 10으로 만들고 continue_mering로 점프한다.
3) page와 buddy가 둘 다 isolate migrate type이 아니면 order를 1 증가시켜 10으로 만들고 continue_mering로 점프한다.
4) buddy와 page가 migratetype이 다르고 둘 중 하나가 isolate migrate type이면 done_merging으로 점프한다

 

- done_merging 영역:
1) 함수set_buddy_order()로 page->private를 order로 업데이트하고 page->page_type의 PG_buddy를 set 한다
2) fpi_flags에 FPI_TO_TAIL이 있으면 (현재 있는 상태임) 새로 merge한 페이지를 free list의 tail에 추가한다
3) shuffle page allocation을 사용하도록 되어 있으면 새 페이지를 head/tail에 추가할 지 랜덤하게 결정한다
4) 그것도 아니면 함수 buddy_merge_likely()로 현재 order가 8 이하인 경우에는 1 레벨 더 높은 order의 page 및 그 buddy가 추후에라도 merge될 수 있는지 함수 page_is_buddy()로 체크해서 새 페이지의 head/tail 추가 여부를 결정한다. merge 될 수 있으면 tail로 정하게 된다
5) tail에 정해지면 함수 add_to_free_list_tail()로, head인 경우 함수 add_to_free_list()로 새 merge된 페이지를 free list에 추가한다

 

__find_buddy_pfn()
- 인자로 pfn, order를 받아 buddy pfn을 계산한다
- pfn ^ (1 << order)로 계산하며 pfn이 order에 맞게 align되었다는 가정하에 사용한다

 

page_is_buddy()
- page, buddy page, order를 인자로 받아서 다음을 체크한다
- buddy page가 buddy system에 있는지를 매크로 PageBuddy()로 체크한다
- 함수 buddy_order()로 buddy의 order가 현 page의 order와 같은지 체크한다
- page와 buddy가 같은 zone에 있는지 확인한다
- 셋 중에 하나라도 실패하면 false, 모두 성공하면 true를 리턴한다

 

page_is_guard()
- CONFIG_DEBUG_PAGEALLOC = n이므로 false이다

 

PageBuddy() 매크로
- 매크로 PAGE_TYPE_OPS()로 정의되어 있다
- PG_buddy, PG_offline, PG_table, PG_guard bit가 있음
- 1이면 clear이고 0이면 set으로 정의되어 있다
- page->page_type에 저장된다

 

buddy_order()
- 함수 page_private()를 통해 page->private를 리턴한다
- page->private는 다양한 용도로 사용되나 버디 관련해서는 버디 페이지의 order가 저장된다

 

del_page_from_free_list()
- page, zone, order를 인자로 받는다
- list_del()로 page->lru를 list에서 제거한다
- __ClearPageBuddy() 함수로 page의 PG_buddy를 clear한다
- 함수 set_page_private() page->private를 0으로 만든다
- zone->free_area[order].nr_free를 1 감소시킨다

 

__free_pages_ok() 계속
- 함수 __free_one_page()가 끝나면 spin lock (zone->lock)을 해제하고 함수 __count_vm_events()로 PGFREE counter를 order 만큼 증가시킨다

 

memblock_free_all() 계속
- 함수 free_low_memory_core_early()가 끝나면 free된 page수가 리턴되며, 이를 전역변수 _totalram_pages에 더해준다

 

mem_init() 계속
- memblock_free_all() 이후부터 계속
- 32bit user mode 지원하는 경우 빌드 타임에 가상 주소 공간이 32비트 공간보다 큰 것을 체크함
- Page table level 일관성을 체크한다
- Page 크기가 16KB 이상인데 물리 페이지 개수가 128개 이하인 경우에는 항상 overcommit을 사용하도록 설정한다
- overcommit : https://brunch.co.kr/@alden/16

 

mm_init() 계속
- mem_init() 이후부터
- 함수 mem_init_print_info()로 현재 메모리 상태를 로그로 출력한다
- 함수 page_ext_init_flatmem_late()는 SPARSEMEM = y이므로 빈 함수이다 <— 여기까지 진행

 

mem_init_print_info()
- 총 물리 메모리 크기 및 사용가능한 메모리 크기, kernel code, rw data, ro data, init 영역, bss 영역, reserved 영역 및 cma 영역 크기를 계산하여 로그에 출력한다

 

SLUB allocator 이론 스터디
- http://jake.dothome.co.kr/slub/
- https://events.static.linuxfound.org/images/stories/pdf/klf2012_kim.pdf

XE Login