Thread (1 message) 1 message, 1 author, 2015-10-02

Re: [PATCH] powerpc/pseries: hibernation/migration should honor topology update policy

From: Tyrel Datwyler <hidden>
Date: 2015-10-02 20:57:55
Also in: stable

Ping?

Don't thing I ever saw anything happen with this patch. On another note
I notice in retrospect the patch subject isn't really stated in
imperative mood. Maybe it would be better as:

powerpc/pseries: make hibernation/migration honor topology update policy

-Tyrel

On 05/05/2015 10:53 AM, Tyrel Datwyler wrote:
quoted hunk
From: Tyrel Datwyler <redacted>

The suspend call paths for hibernation and migration operations call
stop_topology_update() and start_topology_update() respectively prior to
suspending the LPAR and upon resume. Topology updating can be
enabled/disabled from userspace and no check is currently done to determine
the current policy. This results in topology updates being started upon
resume from hibernation/migration even in the case where topology updates
were disabled initially.

This fixes the issue by storing the current policy and only calling
start_topology_update() in the case where either PRRN/VPHN were enabled to
start with.

Fixes: e04fa61214a3 (powerpc/pseries: Add /proc interface to control topology updates)

Signed-off-by: Tyrel Datwyler <redacted>
Cc: Nathan Fontenot <redacted>
Cc: Nishanth Aravamudan <redacted>
Cc: stable@vger.kernel.org
---
 arch/powerpc/include/asm/topology.h      | 5 +++++
 arch/powerpc/kernel/rtas.c               | 4 +++-
 arch/powerpc/mm/numa.c                   | 5 +++++
 arch/powerpc/platforms/pseries/suspend.c | 5 ++++-
 4 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h
index 5f1048e..44f6519 100644
--- a/arch/powerpc/include/asm/topology.h
+++ b/arch/powerpc/include/asm/topology.h
@@ -63,6 +63,7 @@ static inline void sysfs_remove_device_from_node(struct device *dev,
 extern int start_topology_update(void);
 extern int stop_topology_update(void);
 extern int prrn_is_enabled(void);
+extern int vphn_is_enabled(void);
 #else
 static inline int start_topology_update(void)
 {
@@ -76,6 +77,10 @@ static inline int prrn_is_enabled(void)
 {
 	return 0;
 }
+static inline int vphn_is_enabled(void)
+{
+	return 0;
+}
 #endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */

 #include <asm-generic/topology.h>
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index 7a488c1..7ae9992 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -906,6 +906,7 @@ int rtas_ibm_suspend_me(u64 handle)
 	DECLARE_COMPLETION_ONSTACK(done);
 	cpumask_var_t offline_mask;
 	int cpuret;
+	int restart_topology_updates = (prrn_is_enabled() || vphn_is_enabled());

 	if (!rtas_service_present("ibm,suspend-me"))
 		return -ENOSYS;
@@ -957,7 +958,8 @@ int rtas_ibm_suspend_me(u64 handle)
 	if (atomic_read(&data.error) != 0)
 		printk(KERN_ERR "Error doing global join\n");

-	start_topology_update();
+	if (restart_topology_updates)
+		start_topology_update();

 	/* Take down CPUs not online prior to suspend */
 	cpuret = rtas_offline_cpus_mask(offline_mask);
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index 5e80621..885d950 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -1593,6 +1593,11 @@ int prrn_is_enabled(void)
 	return prrn_enabled;
 }

+int vphn_is_enabled(void)
+{
+	return vphn_enabled;
+}
+
 static int topology_read(struct seq_file *file, void *v)
 {
 	if (vphn_enabled || prrn_enabled)
diff --git a/arch/powerpc/platforms/pseries/suspend.c b/arch/powerpc/platforms/pseries/suspend.c
index e76aefa..b5f92e2 100644
--- a/arch/powerpc/platforms/pseries/suspend.c
+++ b/arch/powerpc/platforms/pseries/suspend.c
@@ -147,6 +147,7 @@ static ssize_t store_hibernate(struct device *dev,
 {
 	cpumask_var_t offline_mask;
 	int rc;
+	int restart_topology_updates = (prrn_is_enabled() || vphn_is_enabled);

 	if (!capable(CAP_SYS_ADMIN))
 		return -EPERM;
@@ -175,7 +176,9 @@ static ssize_t store_hibernate(struct device *dev,

 		stop_topology_update();
 		rc = pm_suspend(PM_SUSPEND_MEM);
-		start_topology_update();
+
+		if (restart_topology_updates)
+			start_topology_update();

 		/* Take down CPUs not online prior to suspend */
 		if (!rtas_offline_cpus_mask(offline_mask))
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help