| From 3da237a75e7da8c6e603defbdd6dc8ee3f5985ed Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 9 May 2020 18:58:32 +0000 |
| Subject: powerpc/ps3: Fix kexec shutdown hang |
| |
| From: Geoff Levand <geoff@infradead.org> |
| |
| [ Upstream commit 126554465d93b10662742128918a5fc338cda4aa ] |
| |
| The ps3_mm_region_destroy() and ps3_mm_vas_destroy() routines |
| are called very late in the shutdown via kexec's mmu_cleanup_all |
| routine. By the time mmu_cleanup_all runs it is too late to use |
| udbg_printf, and calling it will cause PS3 systems to hang. |
| |
| Remove all debugging statements from ps3_mm_region_destroy() and |
| ps3_mm_vas_destroy() and replace any error reporting with calls |
| to lv1_panic. |
| |
| With this change builds with 'DEBUG' defined will not cause kexec |
| reboots to hang, and builds with 'DEBUG' defined or not will end |
| in lv1_panic if an error is encountered. |
| |
| Signed-off-by: Geoff Levand <geoff@infradead.org> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/7325c4af2b4c989c19d6a26b90b1fec9c0615ddf.1589049250.git.geoff@infradead.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/platforms/ps3/mm.c | 22 ++++++++++++---------- |
| 1 file changed, 12 insertions(+), 10 deletions(-) |
| |
| diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c |
| index b0f34663b1aec..19bae78b1f25b 100644 |
| --- a/arch/powerpc/platforms/ps3/mm.c |
| +++ b/arch/powerpc/platforms/ps3/mm.c |
| @@ -212,13 +212,14 @@ void ps3_mm_vas_destroy(void) |
| { |
| int result; |
| |
| - DBG("%s:%d: map.vas_id = %llu\n", __func__, __LINE__, map.vas_id); |
| - |
| if (map.vas_id) { |
| result = lv1_select_virtual_address_space(0); |
| - BUG_ON(result); |
| - result = lv1_destruct_virtual_address_space(map.vas_id); |
| - BUG_ON(result); |
| + result += lv1_destruct_virtual_address_space(map.vas_id); |
| + |
| + if (result) { |
| + lv1_panic(0); |
| + } |
| + |
| map.vas_id = 0; |
| } |
| } |
| @@ -316,19 +317,20 @@ static void ps3_mm_region_destroy(struct mem_region *r) |
| int result; |
| |
| if (!r->destroy) { |
| - pr_info("%s:%d: Not destroying high region: %llxh %llxh\n", |
| - __func__, __LINE__, r->base, r->size); |
| return; |
| } |
| |
| - DBG("%s:%d: r->base = %llxh\n", __func__, __LINE__, r->base); |
| - |
| if (r->base) { |
| result = lv1_release_memory(r->base); |
| - BUG_ON(result); |
| + |
| + if (result) { |
| + lv1_panic(0); |
| + } |
| + |
| r->size = r->base = r->offset = 0; |
| map.total = map.rm.size; |
| } |
| + |
| ps3_mm_set_repository_highmem(NULL); |
| } |
| |
| -- |
| 2.25.1 |
| |