Fix extending start/stop topology update scope during LPM Commit 65b9fdadfc4d ("powerpc/pseries/mobility: Extend start/stop topology update scope") made the change to the duration that topology updates are suppressed during LPM to allow the complete device tree update which leaves the property update notifier unregistered until device tree update completes. This prevents topology update during LPM.
Instead, use mutex_lock, which serializes LPM and PRRN operation in pseries_devicetree_update. Signed-off-by: Juliet Kim <juli...@linux.ibm.com> arch/powerpc/platforms/pseries/mobility.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c index 88925f8ca8a0..3a79ded056fd 100644 --- a/arch/powerpc/platforms/pseries/mobility.c +++ b/arch/powerpc/platforms/pseries/mobility.c @@ -42,6 +42,8 @@ struct update_props_workarea { #define MIGRATION_SCOPE (1) #define PRRN_SCOPE -2 +static DEFINE_MUTEX(dt_affinity_mutex); + static int mobility_rtas_call(int token, char *buf, s32 scope) { int rc; @@ -270,13 +272,19 @@ int pseries_devicetree_update(s32 scope) int update_nodes_token; int rc; + mutex_lock(&dt_affinity_mutex); + update_nodes_token = rtas_token("ibm,update-nodes"); - if (update_nodes_token == RTAS_UNKNOWN_SERVICE) + if (update_nodes_token == RTAS_UNKNOWN_SERVICE) { + mutex_unlock(&dt_affinity_mutex); return -EINVAL; + } rtas_buf = kzalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL); - if (!rtas_buf) + if (!rtas_buf) { + mutex_unlock(&dt_affinity_mutex); return -ENOMEM; + } do { rc = mobility_rtas_call(update_nodes_token, rtas_buf, scope); @@ -316,6 +324,7 @@ int pseries_devicetree_update(s32 scope) } while (rc == 1); kfree(rtas_buf); + mutex_unlock(&dt_affinity_mutex); return rc; } @@ -371,10 +380,10 @@ static ssize_t migration_store(struct class *class, if (rc) return rc; - post_mobility_fixup(); - start_topology_update(); + post_mobility_fixup(); + return count; } -- 2.12.3