162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci===============================
462306a36Sopenharmony_ciArchitecture Page Table Helpers
562306a36Sopenharmony_ci===============================
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciGeneric MM expects architectures (with MMU) to provide helpers to create, access
862306a36Sopenharmony_ciand modify page table entries at various level for different memory functions.
962306a36Sopenharmony_ciThese page table helpers need to conform to a common semantics across platforms.
1062306a36Sopenharmony_ciFollowing tables describe the expected semantics which can also be tested during
1162306a36Sopenharmony_ciboot via CONFIG_DEBUG_VM_PGTABLE option. All future changes in here or the debug
1262306a36Sopenharmony_citest need to be in sync.
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciPTE Page Table Helpers
1662306a36Sopenharmony_ci======================
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
1962306a36Sopenharmony_ci| pte_same                  | Tests whether both PTE entries are the same      |
2062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
2162306a36Sopenharmony_ci| pte_bad                   | Tests a non-table mapped PTE                     |
2262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
2362306a36Sopenharmony_ci| pte_present               | Tests a valid mapped PTE                         |
2462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
2562306a36Sopenharmony_ci| pte_young                 | Tests a young PTE                                |
2662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
2762306a36Sopenharmony_ci| pte_dirty                 | Tests a dirty PTE                                |
2862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
2962306a36Sopenharmony_ci| pte_write                 | Tests a writable PTE                             |
3062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
3162306a36Sopenharmony_ci| pte_special               | Tests a special PTE                              |
3262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
3362306a36Sopenharmony_ci| pte_protnone              | Tests a PROT_NONE PTE                            |
3462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
3562306a36Sopenharmony_ci| pte_devmap                | Tests a ZONE_DEVICE mapped PTE                   |
3662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
3762306a36Sopenharmony_ci| pte_soft_dirty            | Tests a soft dirty PTE                           |
3862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
3962306a36Sopenharmony_ci| pte_swp_soft_dirty        | Tests a soft dirty swapped PTE                   |
4062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
4162306a36Sopenharmony_ci| pte_mkyoung               | Creates a young PTE                              |
4262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
4362306a36Sopenharmony_ci| pte_mkold                 | Creates an old PTE                               |
4462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
4562306a36Sopenharmony_ci| pte_mkdirty               | Creates a dirty PTE                              |
4662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
4762306a36Sopenharmony_ci| pte_mkclean               | Creates a clean PTE                              |
4862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
4962306a36Sopenharmony_ci| pte_mkwrite               | Creates a writable PTE of the type specified by  |
5062306a36Sopenharmony_ci|                           | the VMA.                                         |
5162306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
5262306a36Sopenharmony_ci| pte_mkwrite_novma         | Creates a writable PTE, of the conventional type |
5362306a36Sopenharmony_ci|                           | of writable.                                     |
5462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
5562306a36Sopenharmony_ci| pte_wrprotect             | Creates a write protected PTE                    |
5662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
5762306a36Sopenharmony_ci| pte_mkspecial             | Creates a special PTE                            |
5862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
5962306a36Sopenharmony_ci| pte_mkdevmap              | Creates a ZONE_DEVICE mapped PTE                 |
6062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
6162306a36Sopenharmony_ci| pte_mksoft_dirty          | Creates a soft dirty PTE                         |
6262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
6362306a36Sopenharmony_ci| pte_clear_soft_dirty      | Clears a soft dirty PTE                          |
6462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
6562306a36Sopenharmony_ci| pte_swp_mksoft_dirty      | Creates a soft dirty swapped PTE                 |
6662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
6762306a36Sopenharmony_ci| pte_swp_clear_soft_dirty  | Clears a soft dirty swapped PTE                  |
6862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
6962306a36Sopenharmony_ci| pte_mknotpresent          | Invalidates a mapped PTE                         |
7062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
7162306a36Sopenharmony_ci| ptep_clear                | Clears a PTE                                     |
7262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
7362306a36Sopenharmony_ci| ptep_get_and_clear        | Clears and returns PTE                           |
7462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
7562306a36Sopenharmony_ci| ptep_get_and_clear_full   | Clears and returns PTE (batched PTE unmap)       |
7662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
7762306a36Sopenharmony_ci| ptep_test_and_clear_young | Clears young from a PTE                          |
7862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
7962306a36Sopenharmony_ci| ptep_set_wrprotect        | Converts into a write protected PTE              |
8062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
8162306a36Sopenharmony_ci| ptep_set_access_flags     | Converts into a more permissive PTE              |
8262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ciPMD Page Table Helpers
8662306a36Sopenharmony_ci======================
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
8962306a36Sopenharmony_ci| pmd_same                  | Tests whether both PMD entries are the same      |
9062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
9162306a36Sopenharmony_ci| pmd_bad                   | Tests a non-table mapped PMD                     |
9262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
9362306a36Sopenharmony_ci| pmd_leaf                  | Tests a leaf mapped PMD                          |
9462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
9562306a36Sopenharmony_ci| pmd_huge                  | Tests a HugeTLB mapped PMD                       |
9662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
9762306a36Sopenharmony_ci| pmd_trans_huge            | Tests a Transparent Huge Page (THP) at PMD       |
9862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
9962306a36Sopenharmony_ci| pmd_present               | Tests whether pmd_page() points to valid memory  |
10062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
10162306a36Sopenharmony_ci| pmd_young                 | Tests a young PMD                                |
10262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
10362306a36Sopenharmony_ci| pmd_dirty                 | Tests a dirty PMD                                |
10462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
10562306a36Sopenharmony_ci| pmd_write                 | Tests a writable PMD                             |
10662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
10762306a36Sopenharmony_ci| pmd_special               | Tests a special PMD                              |
10862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
10962306a36Sopenharmony_ci| pmd_protnone              | Tests a PROT_NONE PMD                            |
11062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
11162306a36Sopenharmony_ci| pmd_devmap                | Tests a ZONE_DEVICE mapped PMD                   |
11262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
11362306a36Sopenharmony_ci| pmd_soft_dirty            | Tests a soft dirty PMD                           |
11462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
11562306a36Sopenharmony_ci| pmd_swp_soft_dirty        | Tests a soft dirty swapped PMD                   |
11662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
11762306a36Sopenharmony_ci| pmd_mkyoung               | Creates a young PMD                              |
11862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
11962306a36Sopenharmony_ci| pmd_mkold                 | Creates an old PMD                               |
12062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
12162306a36Sopenharmony_ci| pmd_mkdirty               | Creates a dirty PMD                              |
12262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
12362306a36Sopenharmony_ci| pmd_mkclean               | Creates a clean PMD                              |
12462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
12562306a36Sopenharmony_ci| pmd_mkwrite               | Creates a writable PMD of the type specified by  |
12662306a36Sopenharmony_ci|                           | the VMA.                                         |
12762306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
12862306a36Sopenharmony_ci| pmd_mkwrite_novma         | Creates a writable PMD, of the conventional type |
12962306a36Sopenharmony_ci|                           | of writable.                                     |
13062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
13162306a36Sopenharmony_ci| pmd_wrprotect             | Creates a write protected PMD                    |
13262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
13362306a36Sopenharmony_ci| pmd_mkspecial             | Creates a special PMD                            |
13462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
13562306a36Sopenharmony_ci| pmd_mkdevmap              | Creates a ZONE_DEVICE mapped PMD                 |
13662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
13762306a36Sopenharmony_ci| pmd_mksoft_dirty          | Creates a soft dirty PMD                         |
13862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
13962306a36Sopenharmony_ci| pmd_clear_soft_dirty      | Clears a soft dirty PMD                          |
14062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
14162306a36Sopenharmony_ci| pmd_swp_mksoft_dirty      | Creates a soft dirty swapped PMD                 |
14262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
14362306a36Sopenharmony_ci| pmd_swp_clear_soft_dirty  | Clears a soft dirty swapped PMD                  |
14462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
14562306a36Sopenharmony_ci| pmd_mkinvalid             | Invalidates a mapped PMD [1]                     |
14662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
14762306a36Sopenharmony_ci| pmd_set_huge              | Creates a PMD huge mapping                       |
14862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
14962306a36Sopenharmony_ci| pmd_clear_huge            | Clears a PMD huge mapping                        |
15062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
15162306a36Sopenharmony_ci| pmdp_get_and_clear        | Clears a PMD                                     |
15262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
15362306a36Sopenharmony_ci| pmdp_get_and_clear_full   | Clears a PMD                                     |
15462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
15562306a36Sopenharmony_ci| pmdp_test_and_clear_young | Clears young from a PMD                          |
15662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
15762306a36Sopenharmony_ci| pmdp_set_wrprotect        | Converts into a write protected PMD              |
15862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
15962306a36Sopenharmony_ci| pmdp_set_access_flags     | Converts into a more permissive PMD              |
16062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ciPUD Page Table Helpers
16462306a36Sopenharmony_ci======================
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
16762306a36Sopenharmony_ci| pud_same                  | Tests whether both PUD entries are the same      |
16862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
16962306a36Sopenharmony_ci| pud_bad                   | Tests a non-table mapped PUD                     |
17062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
17162306a36Sopenharmony_ci| pud_leaf                  | Tests a leaf mapped PUD                          |
17262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
17362306a36Sopenharmony_ci| pud_huge                  | Tests a HugeTLB mapped PUD                       |
17462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
17562306a36Sopenharmony_ci| pud_trans_huge            | Tests a Transparent Huge Page (THP) at PUD       |
17662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
17762306a36Sopenharmony_ci| pud_present               | Tests a valid mapped PUD                         |
17862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
17962306a36Sopenharmony_ci| pud_young                 | Tests a young PUD                                |
18062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
18162306a36Sopenharmony_ci| pud_dirty                 | Tests a dirty PUD                                |
18262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
18362306a36Sopenharmony_ci| pud_write                 | Tests a writable PUD                             |
18462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
18562306a36Sopenharmony_ci| pud_devmap                | Tests a ZONE_DEVICE mapped PUD                   |
18662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
18762306a36Sopenharmony_ci| pud_mkyoung               | Creates a young PUD                              |
18862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
18962306a36Sopenharmony_ci| pud_mkold                 | Creates an old PUD                               |
19062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
19162306a36Sopenharmony_ci| pud_mkdirty               | Creates a dirty PUD                              |
19262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
19362306a36Sopenharmony_ci| pud_mkclean               | Creates a clean PUD                              |
19462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
19562306a36Sopenharmony_ci| pud_mkwrite               | Creates a writable PUD                           |
19662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
19762306a36Sopenharmony_ci| pud_wrprotect             | Creates a write protected PUD                    |
19862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
19962306a36Sopenharmony_ci| pud_mkdevmap              | Creates a ZONE_DEVICE mapped PUD                 |
20062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
20162306a36Sopenharmony_ci| pud_mkinvalid             | Invalidates a mapped PUD [1]                     |
20262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
20362306a36Sopenharmony_ci| pud_set_huge              | Creates a PUD huge mapping                       |
20462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
20562306a36Sopenharmony_ci| pud_clear_huge            | Clears a PUD huge mapping                        |
20662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
20762306a36Sopenharmony_ci| pudp_get_and_clear        | Clears a PUD                                     |
20862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
20962306a36Sopenharmony_ci| pudp_get_and_clear_full   | Clears a PUD                                     |
21062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
21162306a36Sopenharmony_ci| pudp_test_and_clear_young | Clears young from a PUD                          |
21262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
21362306a36Sopenharmony_ci| pudp_set_wrprotect        | Converts into a write protected PUD              |
21462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
21562306a36Sopenharmony_ci| pudp_set_access_flags     | Converts into a more permissive PUD              |
21662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ciHugeTLB Page Table Helpers
22062306a36Sopenharmony_ci==========================
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
22362306a36Sopenharmony_ci| pte_huge                  | Tests a HugeTLB                                  |
22462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
22562306a36Sopenharmony_ci| arch_make_huge_pte        | Creates a HugeTLB                                |
22662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
22762306a36Sopenharmony_ci| huge_pte_dirty            | Tests a dirty HugeTLB                            |
22862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
22962306a36Sopenharmony_ci| huge_pte_write            | Tests a writable HugeTLB                         |
23062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
23162306a36Sopenharmony_ci| huge_pte_mkdirty          | Creates a dirty HugeTLB                          |
23262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
23362306a36Sopenharmony_ci| huge_pte_mkwrite          | Creates a writable HugeTLB                       |
23462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
23562306a36Sopenharmony_ci| huge_pte_wrprotect        | Creates a write protected HugeTLB                |
23662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
23762306a36Sopenharmony_ci| huge_ptep_get_and_clear   | Clears a HugeTLB                                 |
23862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
23962306a36Sopenharmony_ci| huge_ptep_set_wrprotect   | Converts into a write protected HugeTLB          |
24062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
24162306a36Sopenharmony_ci| huge_ptep_set_access_flags  | Converts into a more permissive HugeTLB        |
24262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ciSWAP Page Table Helpers
24662306a36Sopenharmony_ci========================
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
24962306a36Sopenharmony_ci| __pte_to_swp_entry        | Creates a swapped entry (arch) from a mapped PTE |
25062306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
25162306a36Sopenharmony_ci| __swp_to_pte_entry        | Creates a mapped PTE from a swapped entry (arch) |
25262306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
25362306a36Sopenharmony_ci| __pmd_to_swp_entry        | Creates a swapped entry (arch) from a mapped PMD |
25462306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
25562306a36Sopenharmony_ci| __swp_to_pmd_entry        | Creates a mapped PMD from a swapped entry (arch) |
25662306a36Sopenharmony_ci+---------------------------+--------------------------------------------------+
25762306a36Sopenharmony_ci| is_migration_entry        | Tests a migration (read or write) swapped entry  |
25862306a36Sopenharmony_ci+-------------------------------+----------------------------------------------+
25962306a36Sopenharmony_ci| is_writable_migration_entry   | Tests a write migration swapped entry        |
26062306a36Sopenharmony_ci+-------------------------------+----------------------------------------------+
26162306a36Sopenharmony_ci| make_readable_migration_entry | Creates a read migration swapped entry       |
26262306a36Sopenharmony_ci+-------------------------------+----------------------------------------------+
26362306a36Sopenharmony_ci| make_writable_migration_entry | Creates a write migration swapped entry      |
26462306a36Sopenharmony_ci+-------------------------------+----------------------------------------------+
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci[1] https://lore.kernel.org/linux-mm/20181017020930.GN30832@redhat.com/
267