요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. SPDX-License-Identifier: GPL-2.0
==========
Device DAX
==========
The device-dax interface uses the tail deduplication technique explained in
Documentation/mm/vmemmap_dedup.rst
On powerpc, vmemmap deduplication is only used with radix MMU translation. Also
with a 64K page size, only the devdax namespace with 1G alignment uses vmemmap
deduplication.
With 2M PMD level mapping, we require 32 struct pages and a single 64K vmemmap
page can contain 1024 struct pages (64K/sizeof(struct page)). Hence there is no
vmemmap deduplication possible.
With 1G PUD level mapping, we require 16384 struct pages and a single 64K
vmemmap page can contain 1024 struct pages (64K/sizeof(struct page)). Hence we
require 16 64K pages in vmemmap to map the struct page for 1G PUD level mapping.
Here's how things look like on device-dax after the sections are populated::
+-----------+ ---virt_to_page---> +-----------+ mapping to +-----------+
| | | 0 | -------------> | 0 |
| | +-----------+ +-----------+
| | | 1 | -------------> | 1 |
| | +-----------+ +-----------+
| | | 2 | ----------------^ ^ ^ ^ ^ ^
| | +-----------+ | | | | |
| | | 3 | ------------------+ | | | |
| | +-----------+ | | | |
| | | 4 | --------------------+ | | |
| PUD | +-----------+ | | |
| level | | . | ----------------------+ | |
| mapping | +-----------+ | |
| | | . | ------------------------+ |
| | +-----------+ |
| | | 15 | --------------------------+
| | +-----------+
| |
| |
| |
+-----------+
With 4K page size, 2M PMD level mapping requires 512 struct pages and a single
4K vmemmap page contains 64 struct pages(4K/sizeof(struct page)). Hence we
require 8 4K pages in vmemmap to map the struct page for 2M pmd level mapping.
Here's how things look like on device-dax after the sections are populated::
+-----------+ ---virt_to_page---> +-----------+ mapping to +-----------+
| | | 0 | -------------> | 0 |
| | +-----------+ +-----------+
| | | 1 | -------------> | 1 |
| | +-----------+ +-----------+
| | | 2 | ----------------^ ^ ^ ^ ^ ^
| | +-----------+ | | | | |
| | | 3 | ------------------+ | | | |
| | +-----------+ | | | |
| | | 4 | --------------------+ | | |
| PMD | +-----------+ | | |
| level | | 5 | ----------------------+ | |
| mapping | +-----------+ | |
| | | 6 | ------------------------+ |
| | +-----------+ |
| | | 7 | --------------------------+
| | +-----------+
| |
| |
| |
+-----------+
With 1G PUD level mapping, we require 262144 struct pages and a single 4K
vmemmap page can contain 64 struct pages (4K/sizeof(struct page)). Hence we
require 4096 4K pages in vmemmap to map the struct pages for 1G PUD level
mapping.
Here's how things look like on device-dax after the sections are populated::
+-----------+ ---virt_to_page---> +-----------+ mapping to +-----------+
| | | 0 | -------------> | 0 |
| | +-----------+ +-----------+
| | | 1 | -------------> | 1 |
| | +-----------+ +-----------+
| | | 2 | ----------------^ ^ ^ ^ ^ ^
| | +-----------+ | | | | |
| | | 3 | ------------------+ | | | |
| | +-----------+ | | | |
| | | 4 | --------------------+ | | |
| PUD | +-----------+ | | |
| level | | . | ----------------------+ | |
| mapping | +-----------+ | |
| | | . | ------------------------+ |
| | +-----------+ |
| | | 4095 | --------------------------+
| | +-----------+
| |
| |
| |
+-----------+
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
Device DAX
1-6PowerPC device-dax의 vmemmap tail deduplication 조건과 page-table mapping level별 vmemmap page 절감 구조를 설명합니다.
PowerPC vmemmap dedup 조건
7-21Device-dax interface는 `Documentation/mm/vmemmap_dedup.rst`의 tail deduplication 기법을 사용합니다. PowerPC에서는 radix MMU translation에서만 사용합니다.
64K page size에서는 1G alignment의 devdax namespace만 deduplication을 사용합니다. 2M PMD mapping에는 `struct page` 32개가 필요하지만 64K vmemmap page 하나가 1,024개를 담으므로 vmemmap page가 하나뿐이라 dedup할 tail이 없습니다.
1G PUD mapping에는 `struct page` 16,384개가 필요해 64K vmemmap page 16개가 필요하며 tail page deduplication이 가능합니다.
Base page와 mapping level에 따른 struct page 수 및 vmemmap page 수입니다.
64K page, 1G PUD mapping
22-45Section populate 뒤 `virt_to_page`가 보는 vmemmap page 0과 1은 각각 고유 backing page 0과 1에 mapping됩니다. Tail인 page 2부터 15까지는 page 1의 backing을 재사용합니다.
16개 virtual vmemmap page 중 head metadata만 고유 backing을 유지하고 tail이 page 1을 공유합니다.
4K page, 2M PMD 계산
46-492M PMD mapping에는 `struct page` 512개가 필요하고 4K vmemmap page 하나가 64개를 담으므로 vmemmap page 8개가 필요합니다.
4K page, 2M PMD mapping
50-73Virtual vmemmap page 0과 1은 고유 backing을 유지하고 page 2부터 7까지는 page 1 backing을 공유합니다.
8개 virtual vmemmap page의 tail alias 구조입니다.
4K page, 1G PUD 계산
74-781G PUD mapping에는 `struct page` 262,144개가 필요하고 4K vmemmap page 하나가 64개를 담으므로 vmemmap page 4,096개가 필요합니다.
4K page, 1G PUD mapping
79-101Virtual vmemmap page 0과 1은 고유 backing을 유지하고 page 2부터 4,095까지는 page 1 backing을 공유해 가장 큰 절감 효과를 냅니다.
4,096개 virtual vmemmap page 중 tail 4,094개가 같은 backing을 재사용합니다.
요약과 해설
vmemmap_dedup.rst:1-101PowerPC vmemmap dedup은 radix MMU에서만 사용되며 64K base page는 1G-aligned devdax에 한정됩니다. Mapping을 표현하는 virtual struct-page range의 tail이 같은 physical vmemmap backing을 공유해 metadata memory를 절약합니다.