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