mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
powerpc: Don't ignore errors from set_memory_{n}p() in __kernel_map_pages()
set_memory_p() and set_memory_np() can fail. As mentioned in linux/mm.h: /* * To support DEBUG_PAGEALLOC architecture must ensure that * __kernel_map_pages() never fails */ So panic in case set_memory_p() or set_memory_np() fail in __kernel_map_pages(). Link: https://github.com/KSPP/linux/issues/7 Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20ef75884aa6a636e8298736f3d1056b0793d3d9.1708078640.git.christophe.leroy@csgroup.eu
This commit is contained in:
parent
3c8016e681
commit
9cbacb834b
3 changed files with 10 additions and 5 deletions
|
@ -2172,7 +2172,7 @@ static void kernel_unmap_linear_page(unsigned long vaddr, unsigned long lmi)
|
||||||
mmu_kernel_ssize, 0);
|
mmu_kernel_ssize, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hash__kernel_map_pages(struct page *page, int numpages, int enable)
|
int hash__kernel_map_pages(struct page *page, int numpages, int enable)
|
||||||
{
|
{
|
||||||
unsigned long flags, vaddr, lmi;
|
unsigned long flags, vaddr, lmi;
|
||||||
int i;
|
int i;
|
||||||
|
@ -2189,6 +2189,7 @@ void hash__kernel_map_pages(struct page *page, int numpages, int enable)
|
||||||
kernel_unmap_linear_page(vaddr, lmi);
|
kernel_unmap_linear_page(vaddr, lmi);
|
||||||
}
|
}
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_DEBUG_PAGEALLOC || CONFIG_KFENCE */
|
#endif /* CONFIG_DEBUG_PAGEALLOC || CONFIG_KFENCE */
|
||||||
|
|
||||||
|
|
|
@ -187,4 +187,4 @@ int create_section_mapping(unsigned long start, unsigned long end,
|
||||||
int nid, pgprot_t prot);
|
int nid, pgprot_t prot);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void hash__kernel_map_pages(struct page *page, int numpages, int enable);
|
int hash__kernel_map_pages(struct page *page, int numpages, int enable);
|
||||||
|
|
|
@ -107,17 +107,21 @@ int change_memory_attr(unsigned long addr, int numpages, long action)
|
||||||
#ifdef CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC
|
#ifdef CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC
|
||||||
void __kernel_map_pages(struct page *page, int numpages, int enable)
|
void __kernel_map_pages(struct page *page, int numpages, int enable)
|
||||||
{
|
{
|
||||||
|
int err;
|
||||||
unsigned long addr = (unsigned long)page_address(page);
|
unsigned long addr = (unsigned long)page_address(page);
|
||||||
|
|
||||||
if (PageHighMem(page))
|
if (PageHighMem(page))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && !radix_enabled())
|
if (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && !radix_enabled())
|
||||||
hash__kernel_map_pages(page, numpages, enable);
|
err = hash__kernel_map_pages(page, numpages, enable);
|
||||||
else if (enable)
|
else if (enable)
|
||||||
set_memory_p(addr, numpages);
|
err = set_memory_p(addr, numpages);
|
||||||
else
|
else
|
||||||
set_memory_np(addr, numpages);
|
err = set_memory_np(addr, numpages);
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
panic("%s: changing memory protections failed\n", __func__);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue