[커널 17차] 105~106주차

2022.09.18 20:58

ㅇㅇㅇ 조회 수:50

shrink_inactive_list()
- 인자로 nr_to_scan, lruvec, scan_control, lru_list를 받는다
- scan control 설정을 따라 lru list에 해당하는 lruvec에서 nr_to_scan 만큼의 page를 reclaim한다

 

- L2239 : 지역변수 page_list list head 선언
- L2246 : lruvec에 해당하는 pgdat node를 가져온다
- L2249 : too_many_isolated() 함수로 isolated page가 많은지 판정한다
- L2250 : 많은 경우 100 ms sleep한다. 이미 한 번 sleep 들어간 경우인데 또 isolate 많다고 뜨면 그냥 0 리턴한다
- L2258 : sleep에서 깨었는데 fatal signal이 현재 task에 도달하면 SWAP_CLUSTER_MAX = 32 리턴
- L2262 : lru_add_drain()으로 pagevec page들을 모두 flush한다
- L2264 : lru spinlock lock
- L2266 : isolate_lru_pages()로 lurvec에서 page_list로 isolate하고 그 수를 nr_taken에 기록. 그리고 스캔된 page수는 nr_scanned에 업데이트
- L2269 : NR_ISOLATED_FILE / NR_ISOLATED_ANON pgdat stat에 nr_taken을 더함
- L2270 : global reclaim이고 kswapd이면 PGSCAN_KSWAPD, memcg이면 PGSCAN_DIRECT stat에 nr_scanned 만큼 증가
- L2273 : lruvec memcg에 nr_scanned 만큼 업데이트 (PGSCAN_KSWAPD/PGSCAN_DIRECT)
- L2274 : PGSCAN_ANON / PGSCAN_FILE에 nr_scanned 만큼 업데이트
- L2276 : lru spinlock unlock
- L2281 : shrink_page_list()로 page_list에 있는 page들을 reclaim하고 그 수를 nr_reclaimed 기록. 그리고 reclaim 과정에서 발생한 결과는 stat에 저장
- L2283 : lru spinlock lock
- L2284 : page_list에 남아있는 page를 lruvec 자리로 돌려 놓는다
- L2286 : NR_ISOLATED_FILE / NR_ISOLATED_ANON pgdat stat에 nr_taken을 감소
- L2287 : global reclaim이고 kswapd이면 PGSTEAL_KSWAPD, memcg이면 PGSTEAL_DIRECT stat에 nr_reclaimed 만큼 증가
- L2290 : lruvec memcg에 nr_reclaimed 만큼 업데이트 (PGSTEAL_KSWAPD/PGSTEAL_DIRECT)
- L2291 : PGSTEAL_ANON / PGSTEAL_FILE에 nr_reclaimed 만큼 업데이트
- L2292 : lru spinlock unlock
- L2294 : lru_note_cost()로 lru cost 조정
- L2295 : mem_cgroup_uncharge_list()로 uncharge
- L2296 : free_unref_page_list()에서 refcount = 0이 된 page list 내의 page들 free
- L2309 : dirty인데 IO queue에 들어가지 못한 page 수가 isolated된 page 수와 같으면 flusher가 일을 하지 않고 있는 것이므로 flusher thread를 깨운다
- L2312 : shrink_page_list() 결과를 scan control에 전달
- L2318 : file lruvec의 경우 nr_taken도 같이 scan control에 전달
- L2321 : trace 관련
- L2323 : nr_reclaimed 리턴

 

too_many_isolated()
- 인자로 pgdat, file, scan control sc를 받는다
- 현재 direct reclaim이고, 너무 많은 page를 isolate했는지 체크한다
- 너무 많이 isolate하면 lruvec list가 작아져서 scan 속도가 너무 빨라진다. 그래서 swapping이 불필요하게 많아지고 thrashing, OOM도 증가하게 된다
- L2123 : kswapd인 경우, 즉 async reclaim인 경우 0 리턴
- L2126 : dirty throttling이 불가능하면 0 리턴
- L2129 : lruvec이 file인 경우 inactive file page 수와 isolated file page 수 저장
- L2132 : lurvec이 anon인 경우 inactive anon page 수와 isolated anon page 수 저장
- L2142 : GFP_IO, GFP_FS 설정된 경우 inactive를 감소시킨다. 즉 isolate가 더 많다고 보정한다
- L2145 : isolate > inactive인지 리턴한다

 

writeback_throttling_sane()
- Dirty page에 대한 throttling mechanism이 구현되어 있는지 체크한다
- L451 : global reclaim이면 true 리턴
- L454 : CONFIG_CGROUP_WRITEBACK = y이므로 true 리턴
- L457 : CONFIG_CGROUP_WRITEBACK = n이고 memcg reclaim이면 false 리턴

 

lru_note_cost()
- 인자로 lruvec, file, nr_pages를 받는다
- L264 : lruvec lock
- L266 : lruvec 종류에 따라 lruvec->file_cost / anon_cost를 nr_pages 만큼 증가시킨다
- L279 : lrusize 전체를 계산한다 (active/inactive + file/anon)
- L284 : file cost와 anon cost의 합이 lrusize 전체의 25% 이상이면 cost를 각가 절반으로 감소시킨다
- L288 : lruvec unlock
- L289 : 부모 memcg의 lruvec에 대해서 반복

 

shrink_page_list()
- 인자로 page_list, pgdat, scan control, stat, ignore_references를 받는다
- 이 시점에서 ignore_references는 false이다

- L1370 : ret_pages, free_pages, demote_pages list head 선언
- L1377 : stat 영역을 memset으로 초기화
- L1378 : cond_resched()로 might_sleep() 수행
- L1379 : demote 관련은 pass
- L1381 : retry 시작
- L1382 : page_list가 빌 때까지 while 루프를 수행한다
- L1389 : cond_reshed()
- L1391 : page_list의 tail page를 가져온다
- L1392 : page_list에서 page를 제거
- L1394 : page에 대해 trylock을 수행
- L1395 : 실패하면 keep으로 이동
- L1399 : page의 compound page 수를 nr_pages로 가져옴
- L1402 : sc->nr_scanned에 nr_pages를 더한다
- L1404 : page가 unevictable이면 activate_locked로 이동
- L1407 : sc->may_unmap == false이고 page가 mapped되어 있으면 keep_locked
- L1410 : sc->gfp_mask == GFP_FS이거나 PageSwapCache인데 sc->gfp_mask == GFP_IO이면 may_enter_fs = true
- L1419 : page_check_dirty_writeback() 수행하여 dirty, writeback에 저장
- L1420 : dirty 또는 writeback이면 stat->nr_dirty 1 증가
- L1423 : dirty 이면서 writeback이 아니면 stat->nr_unqueued_dirty 1 증가
- L1432 : dirty 또는 writeback이면서 inode write congested 이거나 writeback이고 PageReclaim()이면 stat->nr_congested 1 증가
- L1480 : page가 PageWriteback()이면 if 문 진입
- L1482 : kswapd == async reclaim이고, PageRelcaim() == 1, pgdat->flags == PGDAT_WRITEBACK이면 (즉 writeback하고 있는 page 수가 너무 많으면) stat->nr_immediate 1 증가시키고 activate_locked로 이동
- L1489 : writeback_throttling_sane()이거나 PageReclaim() == 0이거나 may_enter_fs == 0이면 SetPageReclaim() 수행하고, stat->nr_writeback 1 증가 후 activate_locked로 이동
- L1507 : legacy memcg를 위한 것으로 page unlock 후 wait_on_page_writeback()으로 writeback 끝날 때까지 wait하고 다시 page_list에 page 추가 후 continue로 while 문 재수행. 현재는 사용되지 않음
- L1516 : ignore_references == false이면 page_check_references() 수행해서 결과를 references로 가져온다
- L1519 : references 값에 따라 다음과 같이 이동
- L1520 : PAGEREF_ACTIVATE —> activate_locked
- L1522 : PAGEREF_KEEP —> stat->nr_ref_keep을 nr_pages 만큼 증가시키고 keep_locked로 이동
- L1525 : PAGEREF_RECLAIM / PAGEREF_RECLAIM_CLEAN은 계속 수행
- L1534 : demote 관련으로 pass <-- 여기까지 진행

 

- activate_locked : L1777
- L1779 : page가 PageSwapCache이면서 memcg swap full이거나 PageMlocked이면 try_to_free_swap() 수행
- L1783 : PageMlocked == 0이면 SetPageActive() 수행 후 stat->nr_activate를 nr_pages 만큼 증가, memcg stat의 PGACTIVATE도 1 증가시킴

 

- keep_locked : L1789
- L1790 : unlock_page()

 

- keep : L1791
- L1792: ret_pages에 page를 넣고 다시 while 문 수행


page_evictable()
- page를 인자로 받는다
- L82 : rcu read lock
- L83 : page가 PageMlocked가 아니고 page->mapping->flags == AS_UNEVICTABLE이면 ret = 1
- L84 : rcu read unlock
- L85 : ret 리턴

 

page_check_dirty_writeback()
- L1293 : page가 정상적인 anon (PageSwapBacked() == true) 이거나 lazy free anon인 경우 dirty / writeback = false로 하고 그냥 리턴
- L1301 : dirty, writeback에 PageDirty(), PageWriteBack()인지를 저장
- L1305 : page_has_private()가 거짓이면 그냥 리턴
- L1308 : private가 있으면 page->mapping->a_ops->is_dirty_writeback()을 수행

 

page_check_references()
- 인자로 page, scan control sc를 받는다
- L1236 : page_referenced()를 수행하여 referenced_ptes를 구한다
- L1238 : page에 대해 TestClearPageReferenced() 수행하여 referenced_page를 구한다
- L1244 : vm_flags == VM_LOCKED이면 PAGEREF_RECLAIM 리턴
- L1247 : referenced_ptes가 존재하면 if 문 진입
- L1262 : SetPageReferenced() 수행
- L1264 : referenced_page == 1 이거나 referenced_ptes > 1 이면 PAGEREF_ACTIVATE 리턴
- L1270 : vm_flags == VM_EXEC이고 PageSwapBacked() == 0이면 PAGEREF_ACTIVATE 리턴
- L1273 : PAGEREF_KEEP 리턴
- L1274 : if 문 종료
- L1277 : referenced_page == 1이고 PageSwapBacked() == 0이면 PAGEREF_RECLAIM_CLEAN 리턴
- L1280 : PAGEREF_RECLAIM 리턴

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 스터디 정리 노트 공간입니다. woos 2016.05.14 623
165 [커널 19차] 27 주차 Min 2022.11.22 82
164 [커널 18차] 78주차 kkr 2022.11.19 186
163 [커널 19차] 25 ~ 26 주차 Min 2022.11.14 71
162 [커널 18차] 76-77주차 kkr 2022.11.12 385
161 [커널 19차] 24주차 Min 2022.10.31 108
160 [커널 17차] 112주차 ㅇㅇㅇ 2022.10.30 81
159 [커널 18차] 75주차 kkr 2022.10.29 40
158 [커널 17차] 107 ~ 111주차 ㅇㅇㅇ 2022.10.23 71
157 [커널 19차] 22주차 Min 2022.10.17 76
156 [커널 18차] 73주차 kkr 2022.10.15 44
155 [커널 18차] 72주차 kkr 2022.10.09 182
154 [커널 18차] 71주차 kkr 2022.10.01 74
153 [커널 18차] 70주차 kkr 2022.09.24 76
152 [커널 18차] 69주차 kkr 2022.09.22 58
» [커널 17차] 105~106주차 ㅇㅇㅇ 2022.09.18 50
150 [커널 17차] 104주차 ㅇㅇㅇ 2022.09.04 87
149 [커널 18차] 67주차 kkr 2022.09.03 138
148 [커널 17차] 103주차 ㅇㅇㅇ 2022.08.28 35
147 [커널 18차] 66주차 kkr 2022.08.27 75
146 [커널 17차] 101~102주차 ㅇㅇㅇ 2022.08.21 45
XE Login