mm 서브시스템은 릴리스마다 수십 개의 패치 시리즈를 받는다. 머지 메시지만 읽어서는 어떤 흐름이 몇 릴리스에 걸쳐 이어지는지 보이지 않는다. 예를 들어 스왑 테이블 작업은 7.0부터 7.2까지 네 단계로 나뉘어 들어왔고, 7.4에서도 후속 정리가 이어졌다.
이 글에서는 7.0(2026년 4월)부터 7.4 머지 윈도우(2026년 10월)까지 메인라인에 들어간 mm 변경을 주제별로 정리한다. 출처는 각 머지 윈도우의 mm-stable 풀 리퀘스트 메시지와 LWN 기사다. 7.4는 아직 rc1 전이라 이후 rc에서 일부가 되돌려질 수 있다.
이 시리즈의 다른 글
머지 메시지에서 시리즈 목록 뽑기
Morton은 머지 윈도우마다 mm-stable 태그를 1~2개 보낸다. 태그 메시지에 시리즈 제목과 작성자, 한두 문장 요약이 들어 있어 학습 자료로 쓰기 좋다.
git log --merges --format='%h %cs %s' v6.19..origin/master \
| grep "tag 'mm-stable" | sed 's/ of git:.*//'8a36f53fd5e 2026-10-27 Merge tag 'mm-stable-2026-10-25-19-27'
c5fd5e67c78 2026-10-23 Merge tag 'mm-stable-2026-10-19-21-33'
18fbf5151d2 2026-08-27 Merge tag 'mm-stable-2026-08-26-15-22'
ed3b875bea5 2026-08-20 Merge tag 'mm-stable-2026-08-18-18-39'
a1a8bab7417 2026-06-23 Merge tag 'mm-stable-2026-06-23-08-55'
a552c81ff4a 2026-06-19 Merge tag 'mm-stable-2026-06-18-09-26'
40735a683bf 2026-04-19 Merge tag 'mm-stable-2026-04-18-02-14'
334fbe734e6 2026-04-15 Merge tag 'mm-stable-2026-04-13-21-45'
eeccf287a2a 2026-02-18 Merge tag 'mm-stable-2026-02-18-19-48'
4cff5c05e07 2026-02-12 Merge tag 'mm-stable-2026-02-11-19-22'
날짜가 각 릴리스의 머지 윈도우와 겹친다. 2월은 7.0, 4월은 7.1, 6월은 7.2, 8월은 7.3, 10월은 7.4다. 머지 커밋 하나를 열어 시리즈 제목만 걸러 본다.
git log -1 --format=%B c5fd5e67c78 | grep -c '^ - "'
git log -1 --format=%B c5fd5e67c78 | grep '^ - "' | head -883
- "selftests/mm: improve khugepaged coverage" (Kiryl Shutsemau):
- "selftests/mm: separate GUP microbenchmarking from functional testing"
- "mm: Switch device DAX to section-based vmemmap optimization" (Muchun
- "mm: Introduce section-based vmemmap optimization for HugeTLB"
- "mm/huge_memory: clean up and decouple the anon and file split
- "mm: Unconditional per-VMA locks and cleanups" (Dave Hansen):
- "memcg: remove the v1 soft limit" (Shakeel Butt):
- "read proc/pid/smaps_rollup under per-vma lock" (Suren Baghdasaryan):
7.4 1차 풀 리퀘스트 하나에만 시리즈가 83개다. 아래 표들은 이렇게 뽑은 7.0~7.4 시리즈를 주제별로 묶은 것이다.
스왑, zswap, zram
오래 손대지 않던 스왑 계층이 지난 1년 동안 가장 크게 바뀌었다. 중심에는 Kairui Song의 스왑 테이블(swap table)이 있다. 스왑 캐시와 슬롯 메타데이터를 클러스터 단위 테이블 하나로 합치는 작업이다.
| 버전 | 시리즈 | 작성자 | 내용 |
|---|---|---|---|
| 7.0 | swap table phase II: unify swapin use | Kairui Song | 스왑인 경로를 스왑 테이블로 통일 |
| 7.0 | zram: introduce compressed data writeback | Richard Chang, Sergey Senozhatsky | zram이 압축을 풀지 않고 백킹 디바이스에 기록 |
| 7.1 | swap table phase III: remove swap_map | Kairui Song | 정적 swap_map 배열 제거. 페이지당 오버헤드가 3~11바이트에서 2~10바이트로 줄었다 |
| 7.2 | swap table phase IV: unify allocation | Kairui Song | 익명 메모리와 shmem의 스왑인 할당·과금을 통일. 정적 메타데이터 오버헤드가 0에 가까워졌다 |
| 7.3 | swap_ops updates, better block swap batching | Christoph Hellwig | 스왑 백엔드 추상화 swap_ops. 파일시스템이 자체 swap_ops를 내보낼 수 있다 |
| 7.3 | preparatory patches for PMD level swap entries | Usama Arif | THP를 쪼개지 않고 PMD 단위로 스왑하기 위한 준비 |
| 7.4 | zswap: free cold writeback folios promptly | Alexandre Ghiti | zswap 쓰기 완료 folio를 LRU에 올리지 않고 바로 해제 |
| 7.4 | avoid large folio splits when swap is unavailable | Johannes Weiner | 스왑 공간이 없으면 대형 folio를 쪼개지 않음 |
| 7.4 | zswap: shrink zswap_entry via a pool id | Jianyue Wu | 엔트리의 풀 포인터를 작은 ID로 바꿔 메타데이터 축소 |
스왑 공간 가상화(vswap/xswap)는 아직 머지되지 않았다. 이 쟁점은 3편에서 다룬다.
THP와 mTHP
2MB PMD 크기에 묶이지 않는 multi-size THP(mTHP)를 자동으로 쓰게 하는 작업이 이어졌다. 가장 큰 변화는 7.2의 khugepaged mTHP collapse다.
| 버전 | 시리즈 | 작성자 | 내용 |
|---|---|---|---|
| 7.0 | folio_zero_user: clear page ranges | David Hildenbrand | huge page를 연속 범위로 0 초기화해 폴트 처리 속도 향상 |
| 7.1 | khugepaged cleanups and mTHP prerequisites | Nico Pache | mTHP collapse 사전 정리 |
| 7.2 | khugepaged: add mTHP collapse support | Nico Pache | PMD collapse에 실패하면 더 작은 mTHP 크기로 다시 시도 |
| 7.2 | Remove CONFIG_READ_ONLY_THP_FOR_FS | Zi Yan | 쓰기 가능한 파일에도 파일 THP 허용. 대형 folio를 지원하지 않는 파일시스템은 성능이 떨어질 수 있다 |
| 7.2 | switch THP shrinker to list_lru | Johannes Weiner | deferred split 큐를 list_lru로 교체해 NUMA 인식 문제 해결 |
| 7.2 | improve large folio readahead for exec memory | Usama Arif | 실행 파일 매핑에 대형 folio readahead 적용 |
| 7.4 | mm/collapse: separate a collapse from its callers | Kiryl Shutsemau | collapse 동작과 호출자 정책 분리 |
| 7.4 | make unused huge shrinker memcg aware | Qi Zheng | shmem 미사용 huge folio shrinker를 memcg 단위로 동작 |
| 7.4 | DAMON huge page collapsing using auto tuning | Asier Gutierrez | DAMON 모니터링 결과로 collapse 여부 결정 |
mTHP collapse는 2MB 구간마다 사용 중인 페이지 비트맵을 만든다. PMD 크기로 합칠 수 없으면 크기를 줄여 가며 다시 시도한다. 시도할 크기는 sysfs로 고른다. 자세한 내용은 Documentation/admin-guide/mm/transhuge.rst에 있다.
메모리 cgroup(memcg)
| 버전 | 시리즈 | 작성자 | 내용 |
|---|---|---|---|
| 7.0 | memcg: separate private and public ID namespaces | Shakeel Butt | 내부 전용 ID가 사용자 공간에 노출되지 않게 분리 |
| 7.1 | Eliminate Dying Memory Cgroup | Qi Zheng, Muchun Song | folio가 memcg를 고정하지 않게 해 “죽은 memcg” 누적 문제 해결. 2019년부터 LSFMM 단골 주제였다 |
| 7.2 | memcg: shrink obj_stock_pcp and cache multiple objcgs | Shakeel Butt | per-CPU 과금 캐시 개선 |
| 7.4 | memcg: remove the v1 soft limit | Shakeel Butt | cgroup v1 soft limit 회수 경로 제거 |
| 7.4 | memcg: move memcgid refcount to objcg | Bingfang Guo | 스왑된 shmem이 ID를 잡고 있어도 죽은 memcg를 해제 |
| 7.4 | memcg: group struct fields by access pattern | Shakeel Butt | hot/cold 필드를 나눠 캐시 라인 경합 감소 |
VMA, 잠금, 페이지 테이블
Lorenzo Stoakes와 Suren Baghdasaryan의 작업이 이 영역을 이끈다. mmap_lock 의존을 줄이고 VMA 플래그를 비트맵 타입으로 옮기는 작업이 릴리스마다 이어진다.
| 버전 | 시리즈 | 작성자 | 내용 |
|---|---|---|---|
| 7.1~7.3 | convert vm_flags_t to vma_flags_t | Lorenzo Stoakes | 낡은 vm_flags_t를 비트맵 기반 vma_flags_t로 교체 |
| 7.1 | expand mmap_prepare functionality and usage | Lorenzo Stoakes | 버그가 잦던 f_op->mmap을 mmap_prepare로 대체 |
| 7.2 | use vma locks for /proc/pid/{smaps,numa_maps} | Suren Baghdasaryan | per-VMA 락으로 읽어 mmap_lock 경합 감소 |
| 7.2 | merge fs/userfaultfd.c into mm/userfaultfd.c | Mike Rapoport | userfaultfd 코드를 mm/으로 이동 |
| 7.3 | index MAP_PRIVATE file-backed folios by anonymous pgoff | Lorenzo Stoakes | COW된 파일 매핑 folio의 역매핑(rmap) 혼란 해소 |
| 7.3 | userfaultfd: working set tracking for VM guest memory | Kiryl Shutsemau | VMM이 게스트의 hot/cold 페이지를 파악하는 uffd 모드 |
| 7.4 | Unconditional per-VMA locks and cleanups | Dave Hansen | per-VMA 락을 설정과 무관하게 항상 사용 |
| 7.4 | read /proc/pid/smaps_rollup under per-vma lock | Suren Baghdasaryan | smaps_rollup도 per-VMA 락으로 전환 |
| 7.4 | make userland page table freeing RCU-safe | Lorenzo Stoakes | RCU 독자가 해제된 페이지 테이블을 밟지 않게 수명 규칙 정리 |
| 7.4 | make VMA flag semantics explicit, eliminate VM_SPECIAL | Lorenzo Stoakes | VM_SPECIAL을 의미가 분명한 헬퍼로 교체 |
회수(reclaim)와 MGLRU
| 버전 | 시리즈 | 작성자 | 내용 |
|---|---|---|---|
| 7.0 | support batch checking of references and unmapping for large folios | Baolin Wang | 대형 folio의 참조 확인과 언맵을 일괄 처리 |
| 7.1 | support batched checking of the young flag for MGLRU | Baolin Wang | arm64에서 큰 성능 향상 보고 |
| 7.2 | mm/mglru: improve reclaim loop and dirty folio | Kairui Song 외 | MGLRU 회수 루프와 dirty folio 처리 개선 |
| 7.3 | promote mapped executable folios after first usage for MGLRU | Baolin Wang | 전통 LRU처럼 실행 코드 folio를 첫 사용 후 보호 |
| 7.3 | reduce lru_lock contention via vmstat-derived scan-balance cost | Usama Arif | 회수 경로의 lru_lock 경합 감소 |
| 7.4 | mm/mglru: speed up inc_min_seq() and fix cold/hot inversions | Barry Song | 세대(generation) 전진 비용 감소, hot/cold 역전 수정 |
| 7.4 | workingset: fix the shadow node budget under MGLRU | Hui Zhu | MGLRU에서 shadow 엔트리가 한도를 넘던 문제 수정 |
struct page, folio, vmemmap
struct page를 8바이트 메모리 디스크립터(memdesc)로 줄이려는 장기 프로젝트의 정리 작업이다. 이 영역의 패치는 크기는 작아도 범위가 넓다.
| 버전 | 시리즈 | 작성자 | 내용 |
|---|---|---|---|
| 7.1 | Eliminate fake head pages from vmemmap optimization | Kiryl Shutsemau | HugeTLB vmemmap 최적화(HVO)에서 tail page가 head를 가리키는 방식 단순화 |
| 7.2 | mm: remove page_mapped() | David Hildenbrand | page 단위 매핑 확인 API 제거 |
| 7.2 | Free contiguous order-0 pages efficiently | Ryan Roberts | vfree() 등에서 연속 페이지를 묶어 해제 |
| 7.4 | section-based vmemmap optimization for HugeTLB / device DAX | Muchun Song | 섹션 단위로 struct page 배열 메모리 절감 |
| 7.4 | Remove PG_private | Zi Yan | 페이지 플래그 대신 folio->private 포인터로 판단 |
| 7.4 | slab: Remove slab_folio() | Matthew Wilcox | slab 코드의 마지막 struct folio 사용 제거 |
slab과 kmalloc
7.0에서는 Kees Cook이 8,000개 넘는 파일을 고쳐 타입 안전 할당 매크로를 도입했다. 머지 직후 리누스가 gfp 인자를 생략하면 GFP_KERNEL이 되도록 바꿨다.
struct foo *ptr;
ptr = kmalloc(sizeof(ptr), GFP_KERNEL); /* 버그: 포인터 크기만 할당 */
ptr = kmalloc_obj(*ptr); /* 7.0+: 타입에서 크기 계산, GFP_KERNEL 기본 */
ptr = kmalloc_obj(ptr); /* 컴파일러가 타입 불일치로 거부 */
arr = kzalloc_objs(struct cftype, n); /* 배열 할당 */
s = kmalloc_flex(*s, entries, n, gfp); /* flexible array member 구조체 */mm/ 안에서도 이미 141곳이 새 매크로를 쓴다. 그중 gfp 인자를 명시한 곳은 18곳뿐이다.
P="kmalloc_obj\|kzalloc_obj\|kmalloc_flex"
grep -rn "$P" mm/ | wc -l
grep -rn "$P" mm/ | grep -c "GFP_\|gfp)"
grep -rn "$P" mm/ | head -8141
18
mm/gup_test.c:387: data = kzalloc_obj(*data);
mm/hugetlb_cgroup.c:892: dfl_files = kzalloc_objs(struct cftype, cft_count);
mm/hugetlb_cgroup.c:895: legacy_files = kzalloc_objs(struct cftype, cft_count);
mm/slub.c:2732: delayed_free = kmalloc_obj(*delayed_free, GFP_NOWAIT);
mm/slub.c:9592: int *data = kmalloc_objs(int, nr_cpu_ids);
mm/slub.c:9915: al = kmalloc_obj(struct saved_alias);
mm/cma_sysfs.c:124: cma_kobj = kzalloc_obj(*cma_kobj);
mm/vmalloc.c:5075: vms = kzalloc_objs(vms[0], nr_vms, gfp);
| 버전 | 변경 | 작성자 |
|---|---|---|
| 7.0 | kmalloc_obj(), kmalloc_objs(), kmalloc_flex() 도입과 트리 전체 변환 | Kees Cook, Linus Torvalds |
| 7.4 | sheaf prefill이 barn에서 다시 채움. will-it-scale mmap1 처리량 24% 향상 | Hao Li |
| 7.4 | KMALLOC_MAX_SIZE를 넘는 요청을 경고와 함께 NULL로 거부 | Zi Yan |
| 7.4 | kmem_cache_destroy()와 slab_late_init() 사이 경쟁 수정 | Imre Kaloz |
DAMON
DAMON은 7.4 mm/ 커밋 1위 영역이다. 접근 모니터링에서 “데이터 속성(data attribute)” 모니터링으로 범위를 넓히는 중이다.
| 버전 | 기능 |
|---|---|
| 7.0 | DAMOS 기반 LRU 정렬 개선, 쿼터·모니터링 간격 자동 튜닝 |
| 7.1 | 목표 기반 쿼터 튜닝 알고리즘을 여러 개 중 선택 |
| 7.2 | DAMON 일시 정지/재개, 데이터 속성 모니터링 도입, reclaim/lru_sort가 기본으로 전체 RAM 모니터링 |
| 7.3 | 데이터 속성만 모니터링하는 모드 (페이지 크기, cgroup 등에 가중치) |
| 7.4 | 접근 여부 자체를 데이터 속성으로 노출, pgidle_set·hugepage_size probe 필터, hugetlb 메모리 모니터링, 쿼터 목표의 보수(complement) 플래그 |
KHO와 라이브 업데이트
kexec handover(KHO)와 라이브 업데이트 오케스트레이터(LUO)는 6.19에 들어왔다. 호스트 커널을 바꿔도 VM 메모리를 유지하는 것이 목표다.
| 버전 | 시리즈 | 내용 |
|---|---|---|
| 7.1 | Make KHO Stateless (Jason Miu) | xarray 직렬화 대신 다음 커널에 바로 넘기는 radix tree로 교체 |
| 7.1 | memfd_luo: preserve file seals (Pratyush Yadav) | 보존된 memfd의 seal 유지 |
| 7.1 | liveupdate: prevent double preservation (Pasha Tatashin) | 같은 자원을 두 번 보존하는 문제 방지 |
| 7.3 | 부팅 시 할당한 huge page 보존 | 라이브 업데이트 후에도 hugetlb 페이지 유지 |
주의사항
- 7.4 항목은 rc 기간에 되돌려질 수 있다. 정식 릴리스 뒤에
git log v7.3..v7.4 -- mm/로 다시 확인할 것. - 머지 메시지 요약만 보고 동작을 단정하지 말 것. 요약은 Morton이 한두 문장으로 줄인 것이라 제약 조건이 빠진다. 커밋의
Link:를 따라가 커버 레터를 읽는다. CONFIG_READ_ONLY_THP_FOR_FS를 쓰던 시스템은 7.2로 올릴 때 파일 THP 동작을 다시 확인할 것. 대형 folio를 지원하지 않는 파일시스템에서는 성능이 떨어질 수 있다.- cgroup v1 soft limit에 의존하는 구성은 7.4에서 동작이 바뀐다. v2 인터페이스(
memory.low,memory.high)로 옮길 것.
마무리
7.0~7.4의 큰 흐름은 다섯 가지다. 스왑 계층 재작성, mTHP 자동화, memcg 수명 문제 해결, mmap_lock에서 per-VMA 락으로의 이동, struct page 축소다. 각 흐름에는 아직 머지되지 않은 다음 단계가 있다. 다음 글에서는 그 다음 단계와 리뷰 중인 쟁점을 정리한다.