mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-11-03 16:13:17 +01:00
powerpc/mm: Fix kernel crash on page table free
Fix the below crash on Book3E 64. pgtable_page_dtor expects struct
page *arg.
Also call the destructor on non book3s platforms correctly. This frees
up the split PTL locks correctly if we had allocated them before.
Call Trace:
.kmem_cache_free+0x9c/0x44c (unreliable)
.ptlock_free+0x1c/0x30
.tlb_remove_table+0xdc/0x224
.free_pgd_range+0x298/0x500
.shift_arg_pages+0x10c/0x1e0
.setup_arg_pages+0x200/0x25c
.load_elf_binary+0x450/0x16c8
.search_binary_handler.part.11+0x9c/0x248
.do_execveat_common.isra.13+0x868/0xc18
.run_init_process+0x34/0x4c
.try_to_run_init_process+0x1c/0x68
.kernel_init+0xdc/0x130
.ret_from_kernel_thread+0x58/0x7c
Fixes: 702346768 ("powerpc/mm/nohash: Remove pte fragment dependency from nohash")
Signed-off-by: Aneesh Kumar K.V <[email protected]>
Signed-off-by: Michael Ellerman <[email protected]>
This commit is contained in:
1 parent
8af1da4066
commit
667416f385
3 files changed
+3
-1
No files matched your search
@@ -99,6 +99,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
|
||||
static inline void pgtable_free(void *table, unsigned index_size)
|
||||
{
|
||||
if (!index_size) {
|
||||
pgtable_page_dtor(virt_to_page(table));
|
||||
free_page((unsigned long)table);
|
||||
} else {
|
||||
BUG_ON(index_size > MAX_PGTABLE_INDEX_SIZE);
|
||||
|
||||
@@ -100,6 +100,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
|
||||
static inline void pgtable_free(void *table, unsigned index_size)
|
||||
{
|
||||
if (!index_size) {
|
||||
pgtable_page_dtor(virt_to_page(table));
|
||||
free_page((unsigned long)table);
|
||||
} else {
|
||||
BUG_ON(index_size > MAX_PGTABLE_INDEX_SIZE);
|
||||
|
||||
@@ -133,7 +133,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
|
||||
static inline void pgtable_free(void *table, int shift)
|
||||
{
|
||||
if (!shift) {
|
||||
pgtable_page_dtor(table);
|
||||
pgtable_page_dtor(virt_to_page(table));
|
||||
free_page((unsigned long)table);
|
||||
} else {
|
||||
BUG_ON(shift > MAX_PGTABLE_INDEX_SIZE);
|
||||
|
||||
Reference in new issue
Block a user