On Wed, 20 May 2026, at 11:59, Christophe Leroy (CS GROUP) wrote: > Le 20/05/2026 à 11:40, Ard Biesheuvel a écrit : >> >> On Wed, 20 May 2026, at 11:36, Christophe Leroy (CS GROUP) wrote: >>> Le 20/05/2026 à 10:54, Ard Biesheuvel a écrit : >>>> The only remaining use of map_patch_area() is mapping the zero page, and >>>> immediately unmapping it again so that the intermediate page table >>>> levels are all guaranteed to be populated. >>>> >>>> The use of the zero page here is completely arbitrary, and not harmful >>>> per se, but currently, it creates a writable mapping, and does so in a >>>> manner that requires that the empty_zero_page[] symbol is not >>>> const-qualified. >>>> >>>> Given that this is about to change, and that map_patch_area() now never >>>> maps anything other than the zero page, let's simplify the code and >>>> - take the PA of empty_zero_page directly >>>> - create a read-only temporary mapping. >>>> >>>> This allows empty_zero_page[] to be repainted as const u8[] in a >>>> subsequent patch, without making substantial changes to this code >>>> patching logic. >>>> >>>> Cc: Madhavan Srinivasan <[email protected]> >>>> Cc: Michael Ellerman <[email protected]> >>>> Cc: Nicholas Piggin <[email protected]> >>>> Cc: "Christophe Leroy (CS GROUP)" <[email protected]> >>>> Signed-off-by: Ard Biesheuvel <[email protected]> >>>> --- >>>> Build tested only (Clang) >>>> >>>> Resending from my non-Google email. Apologies if you are receiving this >>>> twice. >>>> >>>> arch/powerpc/lib/code-patching.c | 11 +++++------ >>>> 1 file changed, 5 insertions(+), 6 deletions(-) >>>> >>>> diff --git a/arch/powerpc/lib/code-patching.c >>>> b/arch/powerpc/lib/code-patching.c >>>> index f84e0337cc02..13a8acf851f1 100644 >>>> --- a/arch/powerpc/lib/code-patching.c >>>> +++ b/arch/powerpc/lib/code-patching.c >>>> @@ -60,7 +60,7 @@ struct patch_context { >>>> >>>> static DEFINE_PER_CPU(struct patch_context, cpu_patching_context); >>>> >>>> -static int map_patch_area(void *addr, unsigned long text_poke_addr); >>>> +static int map_patch_area(unsigned long text_poke_addr); >>>> static void unmap_patch_area(unsigned long addr); >>>> >>>> static bool mm_patch_enabled(void) >>>> @@ -117,7 +117,7 @@ static int text_area_cpu_up(unsigned int cpu) >>>> >>>> // Map/unmap the area to ensure all page tables are >>>> pre-allocated >>>> addr = (unsigned long)area->addr; >>>> - err = map_patch_area(empty_zero_page, addr); >>>> + err = map_patch_area(addr); >>> >>> I would get rid of map_patch_area() completely and just do: >>> >>> err = map_kernel_page(addr, __pa_symbol(empty_zero_page), >>> PAGE_KERNEL_RO); >>> >> >> I think retaining the symmetry of map_patch_area() and unmap_patch_area() >> makes sense too. > > Could also drop unmap_patch_area() and use unmap_kernel_page() instead. >
Good point. That way, we'll end up with arch/powerpc/lib/code-patching.c | 52 ++-------------------------------------- 1 file changed, 2 insertions(+), 50 deletions(- I'll spin a v2 with those changes once everyone on cc has had the opportunity to chime in.
