[커널 17차] 89주차

2022.05.15 00:20

ㅇㅇㅇ 조회 수:63

rmqueue()
- CMA가 config로 켜져 있고 alloc flags에 ALLOC_CMA가 없고 migrate movable이면 rmqueue_pcplist()를 pass한다
- 그런데 그 이전 current_gfp_context()에서 CMA config가 켜져 있고 migrate movable이면 alloc flags에 ALLOC_CMA를 추가해 줌 —> 그러면 위에 rmqueue_pcplist()를 pass하는 경우가 발생하지 못할 것 같은데 뭐임?
- 지금은 일련의 패치로 인해 CMA config 되어 있고 movable migrate type이면 무조건 ALLOC_CMA 설정되어 있음
- https://github.com/torvalds/linux/commit/8510e69c8efef82f2b37ea3e8ea19a27122c533e
- https://github.com/torvalds/linux/commit/8e3560d963d22

 

PF_MEMALLOC_PIN
- Movable에서 CMA 영역을 쓸 수 있는데 PF_MEMALLOC_PIN 설정이 되면 이 요청은 할당받은 메모리를 오래 쓸 거니깐 CMA 영역을 쓰지 말자는 것
- 왜냐하면 CMA 영역은 DMA 같은 애들이 쓰게 되면 반납해야 하기 때문
- 지금은 이게 설정되어 있으면 그냥 unmovable로 만들어버림
- 현 패치 기준 pinnable page이면 unmovable이면서 migrate cma도 아닌 상태임

 

Page Flags
- 아래 플래그들은 1이 clear, 0이 set이다
- PG_buddy
- PG_offline
- PG_table
- PG_guard
- 그리고 이것들은 mapcount와 union되어 있고 -1로 처음 세팅하여 모두 클리어하도록 되어 있다
- https://github.com/torvalds/linux/commit/ef2b4b95a63a1d23958dcb99eb2c6898eddc87d0

 

can_steal_fallback()
- reclaimable 및 unmovable인 요청이 movable인 pageblock을 쪼개면 나중에 compaction이 비효율적으로 된다
- 그러므로 이 경우에는 pageblock 전체를 steal한다
- 그러나 movable인 놈이 reclaimable/unmovable인 놈에게서 쪼개가는 건 괜찮다

 

steal_suitable_fallback()
- L2668 : order가 pageblock order보다 크면 어차피 자동 스틸이나 마찬가지이므로 그냥 옮기면 됨
- L2678 : 이 시점은 migrate type steal이 필요한 상태인데, 그렇다는 것은 이미 특정 migrate type에서 메모리가 부족해서 다른 migrate type으로부터 메모리를 뺏어오는 것이고, 그러므로 KSWAPD를 돌려서 정리를 하겠다는 의미
- 그런데 KSWAPD가 잘 안깨어나므로, 인위적으로 watermark boost를 통해서 KSWAPD를 깨우겠다

 

move_freepages()
- PageLRU(), __PageMovable : 유저 메모리임 —> 유저 메모리는 기본적으로 movable 하다고 생각한다

 

KSM
- Kernel Samepage Merging
- 앱의 메모리 중 내용이 같은 페이지들을 페이지 테이블을 정리해서 하나의 페이지를 가리키게 하고 중복된 페이지는 제거하여 메모리 사용 줄이는 기술
- XXHASH 사용
- 앱에서 뭔가 요청을 해야 하는데 라이브러리 API 등에서 호출할 수도 있음 (libc 등)
- https://android.googlesource.com/platform/bionic/+/master/libc/bionic/mmap.cpp
- https://lwn.net/Articles/330589/

 

page->mapping
- 설정에 따라 다른 것을 가리킴
- anonymous page가 user 가상 주소에 매핑되 경우 PAGE_MAPPING_ANON bit set되어 있으면 anon vma를 가리킨다
- CONFIG_KSM = y이고 PAGE_MAPPING_KSM = PAGE_MAPPING_ANON | PAGE_MAPPING_MOVABLE 둘 다 set이고 anonymous page가 VM_MERGEABLE 영역 안에 있으면 KSM merged page의 관련 구조체를 가리킨다
- PAGE_MAPPING_ANON가 없는 PAGE_MAPPING_KSM은 non-lru movable page에 대해서 쓰이고 address_space 구조체를 가리킨다
- https://github.com/torvalds/linux/commit/bda807d4445414e8e77da704f116bb0880fe0c76

 

rmqueue()
- L3700 : gfp_flags가 __GFP_NOFAIL인데 order > 1 이면 경고를 한다
- L3701 : zone->lock spinlock을 건다
- L3711 : order > 0, alloc_flags가 ALLOC_HARDER이면 함수 __rmqueue_smallest()로 MIGRATE_HIGHATOMIC으로 page를 할당받는다
- L3717 : ALLOC_HARDER가 실패하거나 위 alloc harder case가 아니면 함수 __rmqueue()로 page를 할당받는다
- L3718 : 할당 실패하거나 할당받은 페이지가 bad page이면 while문으로 재시도한다
- L3719 : 최종 할당 실패하면 failed로 이동한다
- L3722 : 함수 __mod_zone_freepage_state()로 zone의 NR_FREE_PAGES를 감소시키고 만약 migrate type이 cma였으면 NR_FREE_CMA_PAGES도 감소시킨다
- L3724 : zone->lock spinlock을 푼다
- L3726 : 함수 __count_zid_vm_events()로 PGALLOC 이벤트 카운트 증가
- L3727 : 함수 zone_statistics()로 preferred zone과 현재 zone이 같은 노드인지 보고 NUMA_HIT / NUMA_MISS 통계를 1 증가시킨다
- L3729 : out
- L3730 : zone->flags에 ZONE_BOOSTED_WATERMARK가 set되어 있으면 clear하고, 함수 wakeup_kswapd()으로 kswapd() task를 깨운다
- L3737 : 할당된 page를 리턴한다
- L3739 : failed
- L3740 :  zone->lock spinlock을 풀고 irq_enable()한 뒤, NULL을 리턴한다

 

get_page_from_freelist()
- L4152 : rmqueue() 종료
- L4154 : page 할당 성공하면 if 문 진입
- L4155 : 함수 prep_new_page() <— 진행 중

 

Memory Tag Extension
- White paper : https://developer.arm.com/-/media/Arm%20Developer%20Community/PDF/Arm_Memory_Tagging_Extension_Whitepaper.pdf
- Cortex X-2에 구현됨 : https://developer.arm.com/documentation/101803/0201/The-Cortex-X2--core/Supported-standards-and-specifications
- https://www.usenix.org/system/files/login/articles/login_summer19_03_serebryany.pdf
- https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/enhancing-memory-safety
- https://lwn.net/Articles/834289/
- Tag Read/Write Pseudo-Code : https://developer.arm.com/documentation/ddi0602/2021-12/Shared-Pseudocode/AArch64-Functions?lang=en#impl-aarch64.PhysMemTagWrite.3
- MTE PPT : https://llvm.org/devmtg/2018-10/slides/Serebryany-Stepanov-Tsyrklevich-Memory-Tagging-Slides-LLVM-2018.pdf
- Learn the architecture : https://developer.arm.com/documentation/102433/0100/Detecting-memory-safety-violations
- Anandtech : https://www.anandtech.com/show/16759/sponsored-post-keep-your-apps-memory-safe-with-arm-memory-tagging-extension-mte
- https://github.com/torvalds/linux/commit/013bb59dbb7cf876449df860946458a595a96d51

XE Login