powerpc/s64: Clarify that radix lacks DEBUG_PAGEALLOC
The page_alloc.c code will call into __kernel_map_pages() when DEBUG_PAGEALLOC is configured and enabled. As the implementation assumes hash, this should crash spectacularly if not for a bit of luck in __kernel_map_pages(). In this function linear_map_hash_count is always zero, the for loop exits without doing any damage. There are no other platforms that determine if they support debug_pagealloc at runtime. Instead of adding code to mm/page_alloc.c to do that, this change turns the map/unmap into a noop when in radix mode and prints a warning once. Signed-off-by: Joel Stanley <joel@jms.id.au> Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu> [mpe: Reformat if per Christophe's suggestion] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20211013213438.675095-1-joel@jms.id.au
This commit is contained in:
parent
3091f5fc5f
commit
4f703e7faa
|
@ -255,6 +255,8 @@ 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 */
|
||||
|
|
|
@ -1101,6 +1101,16 @@ static inline void vmemmap_remove_mapping(unsigned long start,
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
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));
|
||||
|
|
|
@ -316,5 +316,8 @@ int radix__create_section_mapping(unsigned long start, unsigned long end,
|
|||
int nid, pgprot_t prot);
|
||||
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);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif
|
||||
|
|
|
@ -1988,7 +1988,7 @@ static void kernel_unmap_linear_page(unsigned long vaddr, unsigned long lmi)
|
|||
mmu_kernel_ssize, 0);
|
||||
}
|
||||
|
||||
void __kernel_map_pages(struct page *page, int numpages, int enable)
|
||||
void hash__kernel_map_pages(struct page *page, int numpages, int enable)
|
||||
{
|
||||
unsigned long flags, vaddr, lmi;
|
||||
int i;
|
||||
|
|
|
@ -920,6 +920,13 @@ void __meminit radix__vmemmap_remove_mapping(unsigned long start, unsigned long
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
void radix__kernel_map_pages(struct page *page, int numpages, int enable)
|
||||
{
|
||||
pr_warn_once("DEBUG_PAGEALLOC not supported in radix mode\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
|
||||
unsigned long radix__pmd_hugepage_update(struct mm_struct *mm, unsigned long addr,
|
||||
|
|
Loading…
Reference in New Issue