| From 738f2169e016009875c940581adb0c99219b84e9 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 21 Aug 2025 08:30:18 +0200 |
| Subject: powerpc/603: Really copy kernel PGD entries into all PGDIRs |
| |
| From: Christophe Leroy <christophe.leroy@csgroup.eu> |
| |
| [ Upstream commit f2863371f017eb03c230addc253783fa4c7e90f5 ] |
| |
| Commit 82ef440f9a38 ("powerpc/603: Copy kernel PGD entries into all |
| PGDIRs and preallocate execmem page tables") was supposed to extend |
| to powerpc 603 the copy of kernel PGD entries into all PGDIRs |
| implemented in a previous patch on the 8xx. But 603 is book3s/32 and |
| uses a duplicate of pgd_alloc() defined in another header. |
| |
| So really do the copy at the correct place for the 603. |
| |
| Fixes: 82ef440f9a38 ("powerpc/603: Copy kernel PGD entries into all PGDIRs and preallocate execmem page tables") |
| Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> |
| Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com> |
| Link: https://patch.msgid.link/752ab7514cae089a2dd7cc0f3d5e35849f76adb9.1755757797.git.christophe.leroy@csgroup.eu |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/include/asm/book3s/32/pgalloc.h | 10 ++++++++-- |
| arch/powerpc/include/asm/nohash/pgalloc.h | 2 +- |
| 2 files changed, 9 insertions(+), 3 deletions(-) |
| |
| diff --git a/arch/powerpc/include/asm/book3s/32/pgalloc.h b/arch/powerpc/include/asm/book3s/32/pgalloc.h |
| index dd4eb30631758..f4390704d5ba2 100644 |
| --- a/arch/powerpc/include/asm/book3s/32/pgalloc.h |
| +++ b/arch/powerpc/include/asm/book3s/32/pgalloc.h |
| @@ -7,8 +7,14 @@ |
| |
| static inline pgd_t *pgd_alloc(struct mm_struct *mm) |
| { |
| - return kmem_cache_alloc(PGT_CACHE(PGD_INDEX_SIZE), |
| - pgtable_gfp_flags(mm, GFP_KERNEL)); |
| + pgd_t *pgd = kmem_cache_alloc(PGT_CACHE(PGD_INDEX_SIZE), |
| + pgtable_gfp_flags(mm, GFP_KERNEL)); |
| + |
| +#ifdef CONFIG_PPC_BOOK3S_603 |
| + memcpy(pgd + USER_PTRS_PER_PGD, swapper_pg_dir + USER_PTRS_PER_PGD, |
| + (MAX_PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); |
| +#endif |
| + return pgd; |
| } |
| |
| static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) |
| diff --git a/arch/powerpc/include/asm/nohash/pgalloc.h b/arch/powerpc/include/asm/nohash/pgalloc.h |
| index bb5f3e8ea912d..4ef780b291bc3 100644 |
| --- a/arch/powerpc/include/asm/nohash/pgalloc.h |
| +++ b/arch/powerpc/include/asm/nohash/pgalloc.h |
| @@ -22,7 +22,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm) |
| pgd_t *pgd = kmem_cache_alloc(PGT_CACHE(PGD_INDEX_SIZE), |
| pgtable_gfp_flags(mm, GFP_KERNEL)); |
| |
| -#if defined(CONFIG_PPC_8xx) || defined(CONFIG_PPC_BOOK3S_603) |
| +#ifdef CONFIG_PPC_8xx |
| memcpy(pgd + USER_PTRS_PER_PGD, swapper_pg_dir + USER_PTRS_PER_PGD, |
| (MAX_PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); |
| #endif |
| -- |
| 2.51.0 |
| |