+++ /dev/null
-From a9e859f937dab6d5940159d4166c2a1ef85d0c35 Mon Sep 17 00:00:00 2001
-From: Nathan Lynch <nathanl@linux.ibm.com>
-Date: Tue, 11 Jun 2019 23:45:05 -0500
-Subject: powerpc/pseries/mobility: prevent cpu hotplug during DT update
-
-[ Upstream commit e59a175faa8df9d674247946f2a5a9c29c835725 ]
-
-CPU online/offline code paths are sensitive to parts of the device
-tree (various cpu node properties, cache nodes) that can be changed as
-a result of a migration.
-
-Prevent CPU hotplug while the device tree potentially is inconsistent.
-
-Fixes: 410bccf97881 ("powerpc/pseries: Partition migration in the kernel")
-Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com>
-Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
-Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/powerpc/platforms/pseries/mobility.c | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c
-index c773396d0969..fcd1a32267c4 100644
---- a/arch/powerpc/platforms/pseries/mobility.c
-+++ b/arch/powerpc/platforms/pseries/mobility.c
-@@ -9,6 +9,7 @@
- * 2 as published by the Free Software Foundation.
- */
-
-+#include <linux/cpu.h>
- #include <linux/kernel.h>
- #include <linux/kobject.h>
- #include <linux/smp.h>
-@@ -309,11 +310,19 @@ void post_mobility_fixup(void)
- if (rc)
- printk(KERN_ERR "Post-mobility activate-fw failed: %d\n", rc);
-
-+ /*
-+ * We don't want CPUs to go online/offline while the device
-+ * tree is being updated.
-+ */
-+ cpus_read_lock();
-+
- rc = pseries_devicetree_update(MIGRATION_SCOPE);
- if (rc)
- printk(KERN_ERR "Post-mobility device tree update "
- "failed: %d\n", rc);
-
-+ cpus_read_unlock();
-+
- /* Possibly switch to a new RFI flush type */
- pseries_setup_rfi_flush();
-
---
-2.20.1
-
+++ /dev/null
-From e8a9c33c60901afec4ebabf63ea05ff7d18f1f4d Mon Sep 17 00:00:00 2001
-From: Nathan Lynch <nathanl@linux.ibm.com>
-Date: Tue, 11 Jun 2019 23:45:06 -0500
-Subject: powerpc/pseries/mobility: rebuild cacheinfo hierarchy post-migration
-
-[ Upstream commit e610a466d16a086e321f0bd421e2fc75cff28605 ]
-
-It's common for the platform to replace the cache device nodes after a
-migration. Since the cacheinfo code is never informed about this, it
-never drops its references to the source system's cache nodes, causing
-it to wind up in an inconsistent state resulting in warnings and oopses
-as soon as CPU online/offline occurs after the migration, e.g.
-
- cache for /cpus/l3-cache@3113(Unified) refers to cache for /cpus/l2-cache@200d(Unified)
- WARNING: CPU: 15 PID: 86 at arch/powerpc/kernel/cacheinfo.c:176 release_cache+0x1bc/0x1d0
- [...]
- NIP release_cache+0x1bc/0x1d0
- LR release_cache+0x1b8/0x1d0
- Call Trace:
- release_cache+0x1b8/0x1d0 (unreliable)
- cacheinfo_cpu_offline+0x1c4/0x2c0
- unregister_cpu_online+0x1b8/0x260
- cpuhp_invoke_callback+0x114/0xf40
- cpuhp_thread_fun+0x270/0x310
- smpboot_thread_fn+0x2c8/0x390
- kthread+0x1b8/0x1c0
- ret_from_kernel_thread+0x5c/0x68
-
-Using device tree notifiers won't work since we want to rebuild the
-hierarchy only after all the removals and additions have occurred and
-the device tree is in a consistent state. Call cacheinfo_teardown()
-before processing device tree updates, and rebuild the hierarchy
-afterward.
-
-Fixes: 410bccf97881 ("powerpc/pseries: Partition migration in the kernel")
-Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com>
-Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
-Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/powerpc/platforms/pseries/mobility.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c
-index fcd1a32267c4..e85767c74e81 100644
---- a/arch/powerpc/platforms/pseries/mobility.c
-+++ b/arch/powerpc/platforms/pseries/mobility.c
-@@ -22,6 +22,7 @@
- #include <asm/machdep.h>
- #include <asm/rtas.h>
- #include "pseries.h"
-+#include "../../kernel/cacheinfo.h"
-
- static struct kobject *mobility_kobj;
-
-@@ -316,11 +317,20 @@ void post_mobility_fixup(void)
- */
- cpus_read_lock();
-
-+ /*
-+ * It's common for the destination firmware to replace cache
-+ * nodes. Release all of the cacheinfo hierarchy's references
-+ * before updating the device tree.
-+ */
-+ cacheinfo_teardown();
-+
- rc = pseries_devicetree_update(MIGRATION_SCOPE);
- if (rc)
- printk(KERN_ERR "Post-mobility device tree update "
- "failed: %d\n", rc);
-
-+ cacheinfo_rebuild();
-+
- cpus_read_unlock();
-
- /* Possibly switch to a new RFI flush type */
---
-2.20.1
-