Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f5e28a08 authored by Geoff Levand's avatar Geoff Levand Committed by Greg Kroah-Hartman
Browse files

powerpc/ps3: Fix kexec shutdown hang



[ 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: default avatarGeoff Levand <geoff@infradead.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/7325c4af2b4c989c19d6a26b90b1fec9c0615ddf.1589049250.git.geoff@infradead.org


Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 8f4372f4
Loading
Loading
Loading
Loading
+12 −10
Original line number Diff line number Diff line
@@ -200,13 +200,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;
	}
}
@@ -304,19 +305,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);
}