[커널 17차] 75주차
2022.02.05 23:16
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
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | [공지] 스터디 정리 노트 공간입니다. | woos | 2016.05.14 | 627 |
108 | [커널 17차] 81주차 | ㅇㅇㅇ | 2022.03.19 | 132 |
107 | [커널 17차] 77 ~ 80주차 | ㅇㅇㅇ | 2022.03.13 | 102 |
106 | [커널 17차] 76주차 [1] | ㅇㅇㅇ | 2022.02.19 | 139 |
» | [커널 17차] 75주차 | ㅇㅇㅇ | 2022.02.05 | 74 |
104 | [커널 17차] 73주차 | ㅇㅇㅇ | 2022.01.23 | 73 |
103 | [커널 17차] 72주차 | ㅇㅇㅇ | 2022.01.16 | 90 |
102 | [커널 17차] 71주차 | ㅇㅇㅇ | 2022.01.09 | 146 |
101 | [커널 17차] 70주차 | ㅇㅇㅇ | 2022.01.01 | 207 |
100 | [커널 17차] 68주차 | ㅇㅇㅇ | 2021.12.18 | 159 |
99 | [커널 17차] 66~67주차 | ㅇㅇㅇ | 2021.12.11 | 78 |
98 | [커널 17차] 65주차 | ㅇㅇㅇ | 2021.11.28 | 182 |
97 | [커널 17차] 64주차 | ㅇㅇㅇ | 2021.11.21 | 64 |
96 | [커널 17차] 63주차 | ㅇㅇㅇ | 2021.11.14 | 62 |
95 | [커널 17차] 62주차 | ㅇㅇㅇ | 2021.11.07 | 123 |
94 | [커널 17차] 61주차 | ㅇㅇㅇ | 2021.10.31 | 80 |
93 | [커널 17차] 60주차 | ㅇㅇㅇ | 2021.10.24 | 98 |
92 | [커널 17차] 59주차 | ㅇㅇㅇ | 2021.10.17 | 167 |
91 | [커널 17차] 58주차 | ㅇㅇㅇ | 2021.10.10 | 67 |
90 | [커널 17차] 57주차 | ㅇㅇㅇ | 2021.10.04 | 66 |
89 | [커널 17차] 56주차 | ㅇㅇㅇ | 2021.10.03 | 27526 |
.