xen: don't call dpm_resume_noirq() with interrupts disabled.
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Tue, 24 Nov 2009 17:58:49 +0000 (09:58 -0800)
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Thu, 3 Dec 2009 19:14:53 +0000 (11:14 -0800)
dpm_resume_noirq() takes a mutex, so it can't be called from a no-interrupt
context.  Don't call it from within the stop-machine function, but just
afterwards, since we're resuming anyway, regardless of what happened.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Stable Kernel <stable@kernel.org>
drivers/xen/manage.c

index 10d03d7..7b69a1a 100644 (file)
@@ -43,7 +43,6 @@ static int xen_suspend(void *data)
        if (err) {
                printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n",
                        err);
-               dpm_resume_noirq(PMSG_RESUME);
                return err;
        }
 
@@ -69,7 +68,6 @@ static int xen_suspend(void *data)
        }
 
        sysdev_resume();
-       dpm_resume_noirq(PMSG_RESUME);
 
        return 0;
 }
@@ -108,6 +106,9 @@ static void do_suspend(void)
        }
 
        err = stop_machine(xen_suspend, &cancelled, cpumask_of(0));
+
+       dpm_resume_noirq(PMSG_RESUME);
+
        if (err) {
                printk(KERN_ERR "failed to start xen_suspend: %d\n", err);
                goto out;
@@ -119,8 +120,6 @@ static void do_suspend(void)
        } else
                xs_suspend_cancel();
 
-       dpm_resume_noirq(PMSG_RESUME);
-
 resume_devices:
        dpm_resume_end(PMSG_RESUME);