Device DAX

device-dax 接口使用了针对 HugeTLB 和 Device DAX 的 vmemmap 精简中所述的尾部去重技术。

在 powerpc 上,vmemmap 去重仅用于 radix MMU 转换。此外,在 64K 页面大小时,只有具备 1G 对齐的 devdax 命名空间会使用 vmemmap 去重。

对于 2M PMD 级映射,我们需要 32 个 struct pages,而单个 64K vmemmap 页面可以包含 1024 个 struct pages(64K/sizeof(struct page))。因此,vmemmap 去重是不可行的。

对于 1G PUD 级映射,我们需要 16384 个 struct pages,而单个 64K vmemmap 页面可以包含 1024 个 struct pages(64K/sizeof(struct page))。因此,我们需要 16 个 64K vmemmap 页面来映射 1G PUD 级映射所需的 struct page

以下是填充节(sections)后 device-dax 的样子:

+-----------+ ---virt_to_page---> +-----------+ mapping to +-----------+ | | | 0 | -------------> | 0 | | | +-----------+ +-----------+ | | | 1 | -------------> | 1 | | | +-----------+ +-----------+ | | | 2 | ----------------^ ^ ^ ^ ^ ^ | | +-----------+ | | | | | | | | 3 | ------------------+ | | | | | | +-----------+ | | | | | | 4 | --------------------+ | | | | PUD | +-----------+ | | | | level | | . | ----------------------+ | | | mapping | +-----------+ | | | | | . | ------------------------+ | | | +-----------+ | | | | 15 | --------------------------+ | | +-----------+ | | | | | | +-----------+

在 4K 页面大小时,2M PMD 级映射需要 512 个 struct pages,而单个 4K vmemmap 页面包含 64 个 struct pages(4K/sizeof(struct page))。因此,我们需要 8 个 4K vmemmap 页面来映射 2M PMD 级映射所需的 struct page

以下是填充节后 device-dax 的样子

+-----------+ ---virt_to_page---> +-----------+   mapping to   +-----------+
|           |                     |     0     | -------------> |     0     |
|           |                     +-----------+                +-----------+
|           |                     |     1     | -------------> |     1     |
|           |                     +-----------+                +-----------+
|           |                     |     2     | ----------------^ ^ ^ ^ ^ ^
|           |                     +-----------+                   | | | | |
|           |                     |     3     | ------------------+ | | | |
|           |                     +-----------+                     | | | |
|           |                     |     4     | --------------------+ | | |
|    PMD    |                     +-----------+                       | | |
|   level   |                     |     5     | ----------------------+ | |
|  mapping  |                     +-----------+                         | |
|           |                     |     6     | ------------------------+ |
|           |                     +-----------+                           |
|           |                     |     7     | --------------------------+
|           |                     +-----------+
|           |
|           |
|           |
+-----------+

对于 1G PUD 级映射,我们需要 262144 个 struct pages,而单个 4K vmemmap 页面可以包含 64 个 struct pages(4K/sizeof(struct page))。因此,我们需要 4096 个 4K vmemmap 页面来映射 1G PUD 级映射所需的 struct pages

以下是填充节后 device-dax 的样子

+-----------+ ---virt_to_page---> +-----------+   mapping to   +-----------+
|           |                     |     0     | -------------> |     0     |
|           |                     +-----------+                +-----------+
|           |                     |     1     | -------------> |     1     |
|           |                     +-----------+                +-----------+
|           |                     |     2     | ----------------^ ^ ^ ^ ^ ^
|           |                     +-----------+                   | | | | |
|           |                     |     3     | ------------------+ | | | |
|           |                     +-----------+                     | | | |
|           |                     |     4     | --------------------+ | | |
|    PUD    |                     +-----------+                       | | |
|   level   |                     |     .     | ----------------------+ | |
|  mapping  |                     +-----------+                         | |
|           |                     |     .     | ------------------------+ |
|           |                     +-----------+                           |
|           |                     |   4095    | --------------------------+
|           |                     +-----------+
|           |
|           |
|           |
+-----------+