Re: [PATCH 2/8] x86/mm: Always "broadcast" PMD setting operations
From: Kirill A. Shutemov
Date: Tue Apr 15 2025 - 04:29:56 EST
On Mon, Apr 14, 2025 at 10:32:35AM -0700, Dave Hansen wrote:
>
> From: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
>
> 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@xxxxxxxxxxxxxxx>
> ---
>
> b/arch/x86/mm/pat/set_memory.c | 4 ++--
> b/arch/x86/mm/pgtable.c | 11 +++--------
> 2 files changed, 5 insertions(+), 10 deletions(-)
>
> diff -puN arch/x86/mm/pat/set_memory.c~always-sync-kernel-mapping-updates arch/x86/mm/pat/set_memory.c
> --- a/arch/x86/mm/pat/set_memory.c~always-sync-kernel-mapping-updates 2025-04-09 12:00:17.126319212 -0700
> +++ b/arch/x86/mm/pat/set_memory.c 2025-04-09 12:53:28.082212490 -0700
> @@ -889,7 +889,7 @@ static void __set_pmd_pte(pte_t *kpte, u
> /* 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) {
Removing the condition, but leaving the block looks sloppy.
Maybe convert #ifdef to IS_ENABLED() while you are there, so it would
justify the block?
--
Kiryl Shutsemau / Kirill A. Shutemov