powerpc: Refactor __kernel_map_pages()
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Fri, 16 Feb 2024 10:17:33 +0000 (11:17 +0100)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 3 Mar 2024 11:18:45 +0000 (22:18 +1100)
__kernel_map_pages() is almost identical for PPC32 and RADIX.

Refactor it.

On PPC32 it is not needed for KFENCE, but to keep it simple
just make it similar to PPC64.

Move the prototype of hash__kernel_map_pages() into mmu_decl.h to allow
IS_ENABLED() to work on 32-bit.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/3656d47c53bff577739dac536dbae31fff52f6d8.1708078640.git.christophe.leroy@csgroup.eu
arch/powerpc/include/asm/book3s/64/hash.h
arch/powerpc/include/asm/book3s/64/pgtable.h
arch/powerpc/include/asm/book3s/64/radix.h
arch/powerpc/mm/book3s64/radix_pgtable.c
arch/powerpc/mm/mmu_decl.h
arch/powerpc/mm/pageattr.c
arch/powerpc/mm/pgtable_32.c

index 6e70ae51163189449205a54dde22ea966df655de..faf3e3b4e4b2be4567739b9ea3b8534e3f784ebd 100644 (file)
@@ -269,8 +269,6 @@ int hash__create_section_mapping(unsigned long start, unsigned long end,
                                 int nid, pgprot_t prot);
 int hash__remove_section_mapping(unsigned long start, unsigned long end);
 
-void hash__kernel_map_pages(struct page *page, int numpages, int enable);
-
 #endif /* !__ASSEMBLY__ */
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_BOOK3S_64_HASH_H */
index 927d585652bc75c2e9d798ed439e5274dc7327ef..62c43d3d80ecc80aca60e7242399273af825dc1c 100644 (file)
@@ -1027,16 +1027,6 @@ static inline void vmemmap_remove_mapping(unsigned long start,
 }
 #endif
 
-#if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KFENCE)
-static inline void __kernel_map_pages(struct page *page, int numpages, int enable)
-{
-       if (radix_enabled())
-               radix__kernel_map_pages(page, numpages, enable);
-       else
-               hash__kernel_map_pages(page, numpages, enable);
-}
-#endif
-
 static inline pte_t pmd_pte(pmd_t pmd)
 {
        return __pte_raw(pmd_raw(pmd));
index 357e23a403d3413108e9084f07514c643d720774..8f55ff74bb680e4a21a40e022035528ab271b777 100644 (file)
@@ -362,8 +362,6 @@ int radix__create_section_mapping(unsigned long start, unsigned long end,
 int radix__remove_section_mapping(unsigned long start, unsigned long end);
 #endif /* CONFIG_MEMORY_HOTPLUG */
 
-void radix__kernel_map_pages(struct page *page, int numpages, int enable);
-
 #ifdef CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP
 #define vmemmap_can_optimize vmemmap_can_optimize
 bool vmemmap_can_optimize(struct vmem_altmap *altmap, struct dev_pagemap *pgmap);
index c6a4ac766b2bf95801533ff917130407be646cf2..e16e2fd104c553f4a196b07ead3232a7344779aa 100644 (file)
@@ -1339,20 +1339,6 @@ void __ref radix__vmemmap_free(unsigned long start, unsigned long end,
 #endif
 #endif
 
-#if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KFENCE)
-void radix__kernel_map_pages(struct page *page, int numpages, int enable)
-{
-       unsigned long addr;
-
-       addr = (unsigned long)page_address(page);
-
-       if (enable)
-               set_memory_p(addr, numpages);
-       else
-               set_memory_np(addr, numpages);
-}
-#endif
-
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 
 unsigned long radix__pmd_hugepage_update(struct mm_struct *mm, unsigned long addr,
index 72341b9fb5521ff6032d6b3998bb972714e6a1d0..4eb62bb51d49d34ac383797c51dc1e882da6157a 100644 (file)
@@ -186,3 +186,5 @@ static inline bool debug_pagealloc_enabled_or_kfence(void)
 int create_section_mapping(unsigned long start, unsigned long end,
                           int nid, pgprot_t prot);
 #endif
+
+void hash__kernel_map_pages(struct page *page, int numpages, int enable);
index 421db7c4f2a48c0499e4ffdc6164f13de848e279..8a9d24218b74ba79800ef8a47f364152dcec4092 100644 (file)
@@ -14,6 +14,7 @@
 #include <asm/page.h>
 #include <asm/pgtable.h>
 
+#include <mm/mmu_decl.h>
 
 static pte_basic_t pte_update_delta(pte_t *ptep, unsigned long addr,
                                    unsigned long old, unsigned long new)
@@ -101,3 +102,22 @@ int change_memory_attr(unsigned long addr, int numpages, long action)
        return apply_to_existing_page_range(&init_mm, start, size,
                                            change_page_attr, (void *)action);
 }
+
+#if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KFENCE)
+#ifdef CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC
+void __kernel_map_pages(struct page *page, int numpages, int enable)
+{
+       unsigned long addr = (unsigned long)page_address(page);
+
+       if (PageHighMem(page))
+               return;
+
+       if (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && !radix_enabled())
+               hash__kernel_map_pages(page, numpages, enable);
+       else if (enable)
+               set_memory_p(addr, numpages);
+       else
+               set_memory_np(addr, numpages);
+}
+#endif
+#endif
index 5c02fd08d61eff04253b5069a852f4da907348fe..04aec716aa0e1330720540b8e122801543162de8 100644 (file)
@@ -171,18 +171,3 @@ void mark_rodata_ro(void)
        ptdump_check_wx();
 }
 #endif
-
-#if defined(CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC) && defined(CONFIG_DEBUG_PAGEALLOC)
-void __kernel_map_pages(struct page *page, int numpages, int enable)
-{
-       unsigned long addr = (unsigned long)page_address(page);
-
-       if (PageHighMem(page))
-               return;
-
-       if (enable)
-               set_memory_p(addr, numpages);
-       else
-               set_memory_np(addr, numpages);
-}
-#endif /* CONFIG_DEBUG_PAGEALLOC */