Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

authored by

Christophe Leroy and committed by
Michael Ellerman
9cbacb83 3c8016e6

+10 -5
+2 -1
arch/powerpc/mm/book3s64/hash_utils.c
··· 2172 2172 mmu_kernel_ssize, 0); 2173 2173 } 2174 2174 2175 - void hash__kernel_map_pages(struct page *page, int numpages, int enable) 2175 + int hash__kernel_map_pages(struct page *page, int numpages, int enable) 2176 2176 { 2177 2177 unsigned long flags, vaddr, lmi; 2178 2178 int i; ··· 2189 2189 kernel_unmap_linear_page(vaddr, lmi); 2190 2190 } 2191 2191 local_irq_restore(flags); 2192 + return 0; 2192 2193 } 2193 2194 #endif /* CONFIG_DEBUG_PAGEALLOC || CONFIG_KFENCE */ 2194 2195
+1 -1
arch/powerpc/mm/mmu_decl.h
··· 187 187 int nid, pgprot_t prot); 188 188 #endif 189 189 190 - void hash__kernel_map_pages(struct page *page, int numpages, int enable); 190 + int hash__kernel_map_pages(struct page *page, int numpages, int enable);
+7 -3
arch/powerpc/mm/pageattr.c
··· 107 107 #ifdef CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC 108 108 void __kernel_map_pages(struct page *page, int numpages, int enable) 109 109 { 110 + int err; 110 111 unsigned long addr = (unsigned long)page_address(page); 111 112 112 113 if (PageHighMem(page)) 113 114 return; 114 115 115 116 if (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && !radix_enabled()) 116 - hash__kernel_map_pages(page, numpages, enable); 117 + err = hash__kernel_map_pages(page, numpages, enable); 117 118 else if (enable) 118 - set_memory_p(addr, numpages); 119 + err = set_memory_p(addr, numpages); 119 120 else 120 - set_memory_np(addr, numpages); 121 + err = set_memory_np(addr, numpages); 122 + 123 + if (err) 124 + panic("%s: changing memory protections failed\n", __func__); 121 125 } 122 126 #endif 123 127 #endif