裝置 DAX

device-dax 介面使用 用於 HugeTLB 和 Device DAX 的 vmemmap 精簡版 中解釋的尾部去重技術。

在 powerpc 上,vmemmap 去重僅與 radix 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。

以下是填充部分後設備-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。

以下是填充部分後設備-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。

以下是填充部分後設備-dax 上的外觀

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