mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 00:53:34 +02:00
x86/mm: Always "broadcast" PMD setting operations
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
This commit is contained in:
parent
780f97e309
commit
b0cc4d19f1
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user