Rearrange condition checks for better code readability and
        prevention of possible race conditions when
        preferred_offline_state can potentially change during the
        execution of pseries_mach_cpu_die().  The patch will make
        pseries_mach_cpu_die() put cpu in one of the consistent states
        and not hit the run over BUG()

Signed-off-by: Vaidyanathan Srinivasan <sva...@linux.vnet.ibm.com>
Cc: Gautham R Shenoy <e...@in.ibm.com>
---
 arch/powerpc/platforms/pseries/hotplug-cpu.c |   30 +++++++++++++-------------
 1 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c 
b/arch/powerpc/platforms/pseries/hotplug-cpu.c
index 9be7af4..39ecb40 100644
--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
+++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
@@ -140,25 +140,25 @@ static void pseries_mach_cpu_die(void)
                if (!get_lppaca()->shared_proc)
                        get_lppaca()->donate_dedicated_cpu = 0;
                get_lppaca()->idle = 0;
-       }
 
-       if (get_preferred_offline_state(cpu) == CPU_STATE_ONLINE) {
-               unregister_slb_shadow(hwcpu, __pa(get_slb_shadow()));
+               if (get_preferred_offline_state(cpu) == CPU_STATE_ONLINE) {
+                       unregister_slb_shadow(hwcpu, __pa(get_slb_shadow()));
 
-               /*
-                * Call to start_secondary_resume() will not return.
-                * Kernel stack will be reset and start_secondary()
-                * will be called to continue the online operation.
-                */
-               start_secondary_resume();
+                       /*
+                        * Call to start_secondary_resume() will not return.
+                        * Kernel stack will be reset and start_secondary()
+                        * will be called to continue the online operation.
+                        */
+                       start_secondary_resume();
+               }
+       }
 
-       } else if (get_preferred_offline_state(cpu) == CPU_STATE_OFFLINE) {
+       /* Requested state is CPU_STATE_OFFLINE at this point */
+       WARN_ON(get_preferred_offline_state(cpu) != CPU_STATE_OFFLINE);
 
-               set_cpu_current_state(cpu, CPU_STATE_OFFLINE);
-               unregister_slb_shadow(hard_smp_processor_id(),
-                                       __pa(get_slb_shadow()));
-               rtas_stop_self();
-       }
+       set_cpu_current_state(cpu, CPU_STATE_OFFLINE);
+       unregister_slb_shadow(hwcpu, __pa(get_slb_shadow()));
+       rtas_stop_self();
 
        /* Should never get here... */
        BUG();

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to