[커널 17차] 100주차

2022.08.06 23:46

ㅇㅇㅇ 조회 수:100

lru_cache_add 호출 경로

1. File Page : add_to_page_cache_lru() —> lru_cache_add()
2. Anon Page : lru_cache_add_inactive_or_unevictable() —> lru_cache_add()

 

rotate pagevec local lock은 왜 따로 존재하는지?
- 나머지는 preemption만 끄고 irq는 안 끔
- rotate는 irq를 꺼야함
- rotate는 나머지와 달리 interrupt context에서도 불릴 수 있어서 그런듯 (ex. end_page_writeback() 등)
- 나머지는 migrate만 일어나지 않으면 문제 없다
- https://github.com/torvalds/linux/commit/b01b2141999936ac3e4746b7f76c0f204ae4b445
- https://github.com/torvalds/linux/commit/902aaed0d983dfd459fcb2b678608d4584782200

 

local_lock()
- RT 아니면 그냥 빈 함수
- RT 인 경우 migrate_disable()

 

lazy free 관련하여 unmapped 이후 write하면 어떻게 되는지
- 일단 get & clear pte 함수를 쓰기 때문에 atomic하게 pte는 zero가 되고 원래 pte는 따로 기록됨
- 그리고 PG 판정은 따로 기록된 pte로 판정하여 dirty 여부를 결정한다
- Dirty 이면 다시 swapbacked로 바꾸고 rmap을 이용하여 remapping을 수행, 되살린다
- 이 과정은 lock으로 보호된다

 

isolate_lru_pages()
- 인자로 nr_to_scan, lruvec, list head dst, nr_scanned, scan control sc, lru_list lru를 받는다
- L1975 : source lruvec을 가져온다
- L1981 : pages_skipped list head를 선언
- L1982 : sc->may_unmap에 따라 isolate mode를 정해준다. 현재 may_unmap = 0이므로 0으로 설정된다. may_unmap == 1이면 ISOLATE_UNMAPPED으로 설정하여 unmapped page들만 isolate하게 한다
- L1984 : 로컬 변수 scan, total_scan을 0으로 잡는다
- L1986 : scan이 nr_to_scan 이상이 되거나, src lruvec이 빌 때까지 while 문을 수행한다
- L1989 : src lruvec의 tail에서 page를 하나 가져온다
- L1990 : 함수 prefetchw_prev_lru_page()에서 page의 previous page를 prefetch한다
- L1992 : page의 compound page 수를 nr_pages로 가져온다 (THP -> 512 아니면 1)
- L1993 : total_scan에 nr_pages를 더해준다
- L1995 : page가 속한 zone index가 sc->reclaim_idx보다 크면 page를 pages_skipped list로 옮기고, nr_skipped[zone]에 nr_pages를 더해준다. 그리고 continue로 다음 page로 넘어간다
- L2011 : scan에 nr_pages 더함
- L2012 : 함수 __isolate_lru_page_prepare()로 현 page를 isolate할 수 있는지 판정하고 할 수 없으면 다음 page로 continue 한다
- L2022 : 함수 get_page_unless_zero()로 현 page refcount가 0이면 다음 page로 continue, 아니면 refcount를 1 증가시킨다
- L2027 : 함수 TestClearPageLRU()로 현 page가 PageLRU가 0이면 putpage()로 refcount 1 감소시키고 다음 page로 continue. 아니면 PageLRU clear.
- L2034 : nr_taken에 nr_pages 더함
- L2035 : nr_zone_taken[zone]에 nr_pages를 더해준다
- L2036 : page를 dst list head로 옮겨준다
- L2037 : while 문 종료
- L2046 : pages_skipped list head에 page가 있으면 if 문 진입
- L2049 : 함수 list_splice()로 pages_skipped에 있는 page들을 src lruvec의 head로 옮긴다
- L2050 : zone에 대해서 loop를 돌면서 각 zone의 PGSCAN_SKIP event에 nr_skipped[zone]를 더해준다. 그리고 skipped 변수에 nr_skipped[zone]를 더해준다.
- L2058 : nr_scanned에 total_scan을 넣어준다
- L2059 : trace 관련 처리 수행
- L2061 : 함수 update_lru_sizes()로 lruvec size update 수행
- L2062 : nr_taken 리턴

 

prefetchw_prev_lru_page()
- page의 previous page를 prefetch한다

 

__isolate_lru_page_prepare()
- 인자로 page, isolate mode를 받는다
- page를 isolate 할 수 있는지 판정한다
- L1881 : PageLRU가 0이면 false 리턴
- L1885 : page가 unevictable이고 mode가 ISOLATE_UNEVICTABLE가 아니면 false 리턴
- L1896 : mode가 ISOLATE_ASYNC_MIGRATE 면 if 문 진입. 이 경우 blocking 없이 migration이 가능한 page들만 isolate한다
- L1898 : PageWriteback 이면 block해야 하므로 false 리턴
- L1901 : PageDirty 이면 page mapping이 NULL 이거나 migratepage callback이 설정되어 있는 경우에만 isolate. 아니면 false 리턴
- L1925 : mode가 ISOLATE_UNMAPPED이고 page mapped이면 false 리턴
- L1928 : true 리턴

 

 Premature OOM 관련
- https://github.com/torvalds/linux/commit/c2135f7c570bc274035834848d9bf46ea89ba763
- https://github.com/torvalds/linux/commit/9df41314390b81a541ca6e84c8340bad0959e4b5
- https://github.com/torvalds/linux/commit/d25b5bd8a8f420b15517c19c4626c0c009f72a63

 

mlock_vma_page()
- 인자 page를 unevictable로 만들고 lruvec에 추가한다
- L94 : PageLocked가 아니면 버그
- L96 : page가 tail page면 버그
- L97 : page가 compound이면서 double map (pet & pmd에 동시 매핑) 이면 버그
- L99 : TestSetPageMlocked()으로 locked이 아닌 페이지를 locked로 바꿔준다. 만약 locked이었으면 그냥 리턴한다
- L100 : page의 thp page 수를 가져온다
- L102 : NR_MLOCK stat accounting
- L103 : UNEVICTABLE_PGMLOCKED 이벤트를 page 수만큼 업데이트
- L104 : 함수 isolate_lru_page()로 page를 isolate한다
- L105 : isolate 성공하면 putback_lru_page()로 page를 unevictable lruvec으로 넣는다

 

isolate_lru_page()
- L2098 : TestClearPageLRU()로 PageLRU를 클리어. 원래 클리어되어 있었으면 에러 리턴
- L2101 : get_page()로 refcount 1 증가
- L2102 : page의 lruvec lock을 잡고 lruvec을 가져온다
- L2103 : lurvec에서 page 제거
- L2104 : lruvec unlock
- L2105 : 0 리턴

 

putback_lru_page()
- L1219 : lru_cache_add()로 page를 pagevec에 추가
- L1220 : put_page()로 refcount 1 감소

 

shrink_active_list()
- L2393 : page_referenced() 부분에서 rmap 등장 —> rmap 스터디 중

 

Reverse Mapping
- http://jake.dothome.co.kr/rmap-1/
- https://www.slideshare.net/AdrianHuang/reverse-mapping-rmap-in-linux-kernel

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 스터디 정리 노트 공간입니다. woos 2016.05.14 626
148 [커널 17차] 103주차 ㅇㅇㅇ 2022.08.28 35
147 [커널 18차] 66주차 kkr 2022.08.27 76
146 [커널 17차] 101~102주차 ㅇㅇㅇ 2022.08.21 47
145 [커널 18차] 65주차 kkr 2022.08.20 28
144 [커널 18차] 64주차 kkr 2022.08.13 75
» [커널 17차] 100주차 [1] ㅇㅇㅇ 2022.08.06 100
142 [커널 18차] 63주차 kkr 2022.08.06 102
141 [커널 17차] 99주차 ㅇㅇㅇ 2022.07.31 35
140 [커널 18차] 62주차 kkr 2022.07.30 26
139 [커널 17차] 97~98주차 ㅇㅇㅇ 2022.07.24 52
138 [커널 18차] 61주차 kkr 2022.07.23 113
137 [커널 18차] 60주차 kkr 2022.07.16 129
136 [커널 17차] 95~96주차 ㅇㅇㅇ 2022.07.10 105
135 [커널 18차] 59주차 kkr 2022.07.09 126
134 [커널 19차] 8주차 kanlee 2022.07.02 160
133 [커널 19차] 7주차 kanlee 2022.07.02 95
132 [커널 19차] 6주차 kanlee 2022.07.02 42
131 [커널 19차] 5주차 kanlee 2022.07.02 38
130 [커널 19차] 4주차 kanlee 2022.07.02 106
129 [커널 18차] 57주차 kkr 2022.06.25 129
XE Login