设备 DAX¶
device-dax 接口使用 用于 HugeTLB 和设备 DAX 的 vmemmap 精简方案 中解释的尾部去重技术。
在 powerpc 上,vmemmap 去重仅用于基数 MMU 转换。 同样,对于 64K 页面大小,只有具有 1G 对齐的 devdax 命名空间使用 vmemmap 去重。
使用 2M PMD 级别映射,我们需要 32 个 struct page,而单个 64K vmemmap 页面可以包含 1024 个 struct page (64K/sizeof(struct page))。 因此,不可能进行 vmemmap 去重。
使用 1G PUD 级别映射,我们需要 16384 个 struct page,而单个 64K vmemmap 页面可以包含 1024 个 struct page (64K/sizeof(struct page))。 因此,我们需要 vmemmap 中的 16 个 64K 页面来映射 1G PUD 级别映射的 struct page。
- 以下是填充 sections 后 device-dax 上的外观:
+-----------+ ---virt_to_page---> +-----------+ 映射到 +-----------+ | | | 0 | -------------> | 0 | | | +-----------+ +-----------+ | | | 1 | -------------> | 1 | | | +-----------+ +-----------+ | | | 2 | ----------------^ ^ ^ ^ ^ ^ | | +-----------+ | | | | | | | | 3 | ------------------+ | | | | | | +-----------+ | | | | | | | 4 | --------------------+ | | | | PUD | +-----------+ | | | | 级别 | | . | ----------------------+ | | | 映射 | +-----------+ | | | | | . | ------------------------+ | | | +-----------+ | | | | 15 | --------------------------+ | | +-----------+ | | | | | | +-----------+
对于 4K 页面大小,2M PMD 级别映射需要 512 个 struct page,而单个 4K vmemmap 页面包含 64 个 struct page (4K/sizeof(struct page))。 因此,我们需要 vmemmap 中的 8 个 4K 页面来映射 2M pmd 级别映射的 struct page。
以下是填充 sections 后 device-dax 上的外观
+-----------+ ---virt_to_page---> +-----------+ mapping to +-----------+
| | | 0 | -------------> | 0 |
| | +-----------+ +-----------+
| | | 1 | -------------> | 1 |
| | +-----------+ +-----------+
| | | 2 | ----------------^ ^ ^ ^ ^ ^
| | +-----------+ | | | | |
| | | 3 | ------------------+ | | | |
| | +-----------+ | | | |
| | | 4 | --------------------+ | | |
| PMD | +-----------+ | | |
| level | | 5 | ----------------------+ | |
| mapping | +-----------+ | |
| | | 6 | ------------------------+ |
| | +-----------+ |
| | | 7 | --------------------------+
| | +-----------+
| |
| |
| |
+-----------+
使用 1G PUD 级别映射,我们需要 262144 个 struct page,而单个 4K vmemmap 页面可以包含 64 个 struct page (4K/sizeof(struct page))。 因此,我们需要 vmemmap 中的 4096 个 4K 页面来映射 1G PUD 级别映射的 struct page。
以下是填充 sections 后 device-dax 上的外观
+-----------+ ---virt_to_page---> +-----------+ mapping to +-----------+
| | | 0 | -------------> | 0 |
| | +-----------+ +-----------+
| | | 1 | -------------> | 1 |
| | +-----------+ +-----------+
| | | 2 | ----------------^ ^ ^ ^ ^ ^
| | +-----------+ | | | | |
| | | 3 | ------------------+ | | | |
| | +-----------+ | | | |
| | | 4 | --------------------+ | | |
| PUD | +-----------+ | | |
| level | | . | ----------------------+ | |
| mapping | +-----------+ | |
| | | . | ------------------------+ |
| | +-----------+ |
| | | 4095 | --------------------------+
| | +-----------+
| |
| |
| |
+-----------+