리눅스 커널 mm 서브시스템 동향 (2) — 7.0~7.4에 머지된 변화

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 -8
83
 - "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.0swap table phase II: unify swapin useKairui Song스왑인 경로를 스왑 테이블로 통일
7.0zram: introduce compressed data writebackRichard Chang, Sergey Senozhatskyzram이 압축을 풀지 않고 백킹 디바이스에 기록
7.1swap table phase III: remove swap_mapKairui Song정적 swap_map 배열 제거. 페이지당 오버헤드가 3~11바이트에서 2~10바이트로 줄었다
7.2swap table phase IV: unify allocationKairui Song익명 메모리와 shmem의 스왑인 할당·과금을 통일. 정적 메타데이터 오버헤드가 0에 가까워졌다
7.3swap_ops updates, better block swap batchingChristoph Hellwig스왑 백엔드 추상화 swap_ops. 파일시스템이 자체 swap_ops를 내보낼 수 있다
7.3preparatory patches for PMD level swap entriesUsama ArifTHP를 쪼개지 않고 PMD 단위로 스왑하기 위한 준비
7.4zswap: free cold writeback folios promptlyAlexandre Ghitizswap 쓰기 완료 folio를 LRU에 올리지 않고 바로 해제
7.4avoid large folio splits when swap is unavailableJohannes Weiner스왑 공간이 없으면 대형 folio를 쪼개지 않음
7.4zswap: shrink zswap_entry via a pool idJianyue Wu엔트리의 풀 포인터를 작은 ID로 바꿔 메타데이터 축소

스왑 공간 가상화(vswap/xswap)는 아직 머지되지 않았다. 이 쟁점은 3편에서 다룬다.

THP와 mTHP

2MB PMD 크기에 묶이지 않는 multi-size THP(mTHP)를 자동으로 쓰게 하는 작업이 이어졌다. 가장 큰 변화는 7.2의 khugepaged mTHP collapse다.

버전시리즈작성자내용
7.0folio_zero_user: clear page rangesDavid Hildenbrandhuge page를 연속 범위로 0 초기화해 폴트 처리 속도 향상
7.1khugepaged cleanups and mTHP prerequisitesNico PachemTHP collapse 사전 정리
7.2khugepaged: add mTHP collapse supportNico PachePMD collapse에 실패하면 더 작은 mTHP 크기로 다시 시도
7.2Remove CONFIG_READ_ONLY_THP_FOR_FSZi Yan쓰기 가능한 파일에도 파일 THP 허용. 대형 folio를 지원하지 않는 파일시스템은 성능이 떨어질 수 있다
7.2switch THP shrinker to list_lruJohannes Weinerdeferred split 큐를 list_lru로 교체해 NUMA 인식 문제 해결
7.2improve large folio readahead for exec memoryUsama Arif실행 파일 매핑에 대형 folio readahead 적용
7.4mm/collapse: separate a collapse from its callersKiryl Shutsemaucollapse 동작과 호출자 정책 분리
7.4make unused huge shrinker memcg awareQi Zhengshmem 미사용 huge folio shrinker를 memcg 단위로 동작
7.4DAMON huge page collapsing using auto tuningAsier GutierrezDAMON 모니터링 결과로 collapse 여부 결정

mTHP collapse는 2MB 구간마다 사용 중인 페이지 비트맵을 만든다. PMD 크기로 합칠 수 없으면 크기를 줄여 가며 다시 시도한다. 시도할 크기는 sysfs로 고른다. 자세한 내용은 Documentation/admin-guide/mm/transhuge.rst에 있다.

메모리 cgroup(memcg)

버전시리즈작성자내용
7.0memcg: separate private and public ID namespacesShakeel Butt내부 전용 ID가 사용자 공간에 노출되지 않게 분리
7.1Eliminate Dying Memory CgroupQi Zheng, Muchun Songfolio가 memcg를 고정하지 않게 해 “죽은 memcg” 누적 문제 해결. 2019년부터 LSFMM 단골 주제였다
7.2memcg: shrink obj_stock_pcp and cache multiple objcgsShakeel Buttper-CPU 과금 캐시 개선
7.4memcg: remove the v1 soft limitShakeel Buttcgroup v1 soft limit 회수 경로 제거
7.4memcg: move memcgid refcount to objcgBingfang Guo스왑된 shmem이 ID를 잡고 있어도 죽은 memcg를 해제
7.4memcg: group struct fields by access patternShakeel Butthot/cold 필드를 나눠 캐시 라인 경합 감소

VMA, 잠금, 페이지 테이블

Lorenzo Stoakes와 Suren Baghdasaryan의 작업이 이 영역을 이끈다. mmap_lock 의존을 줄이고 VMA 플래그를 비트맵 타입으로 옮기는 작업이 릴리스마다 이어진다.

버전시리즈작성자내용
7.1~7.3convert vm_flags_t to vma_flags_tLorenzo Stoakes낡은 vm_flags_t를 비트맵 기반 vma_flags_t로 교체
7.1expand mmap_prepare functionality and usageLorenzo Stoakes버그가 잦던 f_op->mmap을 mmap_prepare로 대체
7.2use vma locks for /proc/pid/{smaps,numa_maps}Suren Baghdasaryanper-VMA 락으로 읽어 mmap_lock 경합 감소
7.2merge fs/userfaultfd.c into mm/userfaultfd.cMike Rapoportuserfaultfd 코드를 mm/으로 이동
7.3index MAP_PRIVATE file-backed folios by anonymous pgoffLorenzo StoakesCOW된 파일 매핑 folio의 역매핑(rmap) 혼란 해소
7.3userfaultfd: working set tracking for VM guest memoryKiryl ShutsemauVMM이 게스트의 hot/cold 페이지를 파악하는 uffd 모드
7.4Unconditional per-VMA locks and cleanupsDave Hansenper-VMA 락을 설정과 무관하게 항상 사용
7.4read /proc/pid/smaps_rollup under per-vma lockSuren Baghdasaryansmaps_rollup도 per-VMA 락으로 전환
7.4make userland page table freeing RCU-safeLorenzo StoakesRCU 독자가 해제된 페이지 테이블을 밟지 않게 수명 규칙 정리
7.4make VMA flag semantics explicit, eliminate VM_SPECIALLorenzo StoakesVM_SPECIAL을 의미가 분명한 헬퍼로 교체

회수(reclaim)와 MGLRU

버전시리즈작성자내용
7.0support batch checking of references and unmapping for large foliosBaolin Wang대형 folio의 참조 확인과 언맵을 일괄 처리
7.1support batched checking of the young flag for MGLRUBaolin Wangarm64에서 큰 성능 향상 보고
7.2mm/mglru: improve reclaim loop and dirty folioKairui Song 외MGLRU 회수 루프와 dirty folio 처리 개선
7.3promote mapped executable folios after first usage for MGLRUBaolin Wang전통 LRU처럼 실행 코드 folio를 첫 사용 후 보호
7.3reduce lru_lock contention via vmstat-derived scan-balance costUsama Arif회수 경로의 lru_lock 경합 감소
7.4mm/mglru: speed up inc_min_seq() and fix cold/hot inversionsBarry Song세대(generation) 전진 비용 감소, hot/cold 역전 수정
7.4workingset: fix the shadow node budget under MGLRUHui ZhuMGLRU에서 shadow 엔트리가 한도를 넘던 문제 수정

struct page, folio, vmemmap

struct page를 8바이트 메모리 디스크립터(memdesc)로 줄이려는 장기 프로젝트의 정리 작업이다. 이 영역의 패치는 크기는 작아도 범위가 넓다.

버전시리즈작성자내용
7.1Eliminate fake head pages from vmemmap optimizationKiryl ShutsemauHugeTLB vmemmap 최적화(HVO)에서 tail page가 head를 가리키는 방식 단순화
7.2mm: remove page_mapped()David Hildenbrandpage 단위 매핑 확인 API 제거
7.2Free contiguous order-0 pages efficientlyRyan Robertsvfree() 등에서 연속 페이지를 묶어 해제
7.4section-based vmemmap optimization for HugeTLB / device DAXMuchun Song섹션 단위로 struct page 배열 메모리 절감
7.4Remove PG_privateZi Yan페이지 플래그 대신 folio->private 포인터로 판단
7.4slab: Remove slab_folio()Matthew Wilcoxslab 코드의 마지막 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 -8
141
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.0kmalloc_obj(), kmalloc_objs(), kmalloc_flex() 도입과 트리 전체 변환Kees Cook, Linus Torvalds
7.4sheaf prefill이 barn에서 다시 채움. will-it-scale mmap1 처리량 24% 향상Hao Li
7.4KMALLOC_MAX_SIZE를 넘는 요청을 경고와 함께 NULL로 거부Zi Yan
7.4kmem_cache_destroy()와 slab_late_init() 사이 경쟁 수정Imre Kaloz

DAMON

DAMON은 7.4 mm/ 커밋 1위 영역이다. 접근 모니터링에서 “데이터 속성(data attribute)” 모니터링으로 범위를 넓히는 중이다.

버전기능
7.0DAMOS 기반 LRU 정렬 개선, 쿼터·모니터링 간격 자동 튜닝
7.1목표 기반 쿼터 튜닝 알고리즘을 여러 개 중 선택
7.2DAMON 일시 정지/재개, 데이터 속성 모니터링 도입, 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.1Make KHO Stateless (Jason Miu)xarray 직렬화 대신 다음 커널에 바로 넘기는 radix tree로 교체
7.1memfd_luo: preserve file seals (Pratyush Yadav)보존된 memfd의 seal 유지
7.1liveupdate: 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 축소다. 각 흐름에는 아직 머지되지 않은 다음 단계가 있다. 다음 글에서는 그 다음 단계와 리뷰 중인 쟁점을 정리한다.

참고

답글 남기기