Device DAX

The device-dax interface uses the tail deduplication technique explained in A vmemmap diet for HugeTLB and Device DAX

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    | --------------------------+
|           |                     +-----------+
|           |
|           |
|           |
+-----------+