kexec: Change kexec jump code ordering
authorRafael J. Wysocki <rjw@sisk.pl>
Mon, 16 Mar 2009 21:34:35 +0000 (22:34 +0100)
committerRafael J. Wysocki <rjw@sisk.pl>
Mon, 30 Mar 2009 19:46:55 +0000 (21:46 +0200)
Change the ordering of the kexec jump code so that the nonboot CPUs
are disabled after calling device drivers' "late suspend" methods.

This change reflects the recent modifications of the power management
code that is also used by kexec jump.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Ingo Molnar <mingo@elte.hu>
kernel/kexec.c

index dade9af6bf21fafac9f94528ba659e7925593850..93eed85fe017b3be1109c95bdc78fc16f54bf806 100644 (file)
@@ -1450,9 +1450,6 @@ int kernel_kexec(void)
                error = device_suspend(PMSG_FREEZE);
                if (error)
                        goto Resume_console;
-               error = disable_nonboot_cpus();
-               if (error)
-                       goto Resume_devices;
                device_pm_lock();
                /* At this point, device_suspend() has been called,
                 * but *not* device_power_down(). We *must*
@@ -1463,13 +1460,15 @@ int kernel_kexec(void)
                 */
                error = device_power_down(PMSG_FREEZE);
                if (error)
-                       goto Unlock_pm;
-
+                       goto Resume_devices;
+               error = disable_nonboot_cpus();
+               if (error)
+                       goto Enable_cpus;
                local_irq_disable();
                /* Suspend system devices */
                error = sysdev_suspend(PMSG_FREEZE);
                if (error)
-                       goto Power_up_devices;
+                       goto Enable_irqs;
        } else
 #endif
        {
@@ -1483,13 +1482,13 @@ int kernel_kexec(void)
 #ifdef CONFIG_KEXEC_JUMP
        if (kexec_image->preserve_context) {
                sysdev_resume();
Power_up_devices:
Enable_irqs:
                local_irq_enable();
-               device_power_up(PMSG_RESTORE);
- Unlock_pm:
-               device_pm_unlock();
+ Enable_cpus:
                enable_nonboot_cpus();
+               device_power_up(PMSG_RESTORE);
  Resume_devices:
+               device_pm_unlock();
                device_resume(PMSG_RESTORE);
  Resume_console:
                resume_console();