]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/mm: Always "broadcast" PMD setting operations
authorDave Hansen <dave.hansen@linux.intel.com>
Mon, 14 Apr 2025 17:32:35 +0000 (10:32 -0700)
committerDave Hansen <dave.hansen@linux.intel.com>
Thu, 17 Apr 2025 17:39:25 +0000 (10:39 -0700)
Kernel PMDs can either be shared across processes or private to a
process.  On 64-bit, they are always shared.  32-bit non-PAE hardware
does not have PMDs, but the kernel logically squishes them into the
PGD and treats them as private. Here are the four cases:

64-bit:                Shared
32-bit: non-PAE:       Private
32-bit:     PAE+  PTI: Private
32-bit:     PAE+noPTI: Shared

Note that 32-bit is all "Private" except for PAE+noPTI being an
oddball.  The 32-bit+PAE+noPTI case will be made like the rest of
32-bit shortly.

But until that can be done, temporarily treat the 32-bit+PAE+noPTI
case as Private. This will do unnecessary walks across pgd_list and
unnecessary PTE setting but should be otherwise harmless.

Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Link: https://lore.kernel.org/all/20250414173235.F63F50D1%40davehans-spike.ostc.intel.com
arch/x86/mm/pat/set_memory.c
arch/x86/mm/pgtable.c

index def3d928425422921769aecb68fa4ea9f71adf04..30ab4aced761bb424d12fc4d3127fbf31d8c9fe5 100644 (file)
@@ -889,7 +889,7 @@ static void __set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte)
        /* change init_mm */
        set_pte_atomic(kpte, pte);
 #ifdef CONFIG_X86_32
-       if (!SHARED_KERNEL_PMD) {
+       {
                struct page *page;
 
                list_for_each_entry(page, &pgd_list, lru) {
@@ -1293,7 +1293,7 @@ static int collapse_pmd_page(pmd_t *pmd, unsigned long addr,
        /* Queue the page table to be freed after TLB flush */
        list_add(&page_ptdesc(pmd_page(old_pmd))->pt_list, pgtables);
 
-       if (IS_ENABLED(CONFIG_X86_32) && !SHARED_KERNEL_PMD) {
+       if (IS_ENABLED(CONFIG_X86_32)) {
                struct page *page;
 
                /* Update all PGD tables to use the same large page */
index ea01b55724428b87b2045f37b677135838c11e5a..f1c58860b9261f71ee187c2650c6866e861ecdfa 100644 (file)
@@ -97,18 +97,13 @@ static void pgd_ctor(struct mm_struct *mm, pgd_t *pgd)
                                KERNEL_PGD_PTRS);
        }
 
-       /* list required to sync kernel mapping updates */
-       if (!SHARED_KERNEL_PMD) {
-               pgd_set_mm(pgd, mm);
-               pgd_list_add(pgd);
-       }
+       /* List used to sync kernel mapping updates */
+       pgd_set_mm(pgd, mm);
+       pgd_list_add(pgd);
 }
 
 static void pgd_dtor(pgd_t *pgd)
 {
-       if (SHARED_KERNEL_PMD)
-               return;
-
        spin_lock(&pgd_lock);
        pgd_list_del(pgd);
        spin_unlock(&pgd_lock);