git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
hwrng: core - Fix double unlock in rng_dev_read
[safe/jmp/linux-2.6]
/
drivers
/
xen
/
manage.c
diff --git
a/drivers/xen/manage.c
b/drivers/xen/manage.c
index
3ccd348
..
c499793
100644
(file)
--- a/
drivers/xen/manage.c
+++ b/
drivers/xen/manage.c
@@
-39,17
+39,10
@@
static int xen_suspend(void *data)
BUG_ON(!irqs_disabled());
BUG_ON(!irqs_disabled());
- err = device_power_down(PMSG_SUSPEND);
- if (err) {
- printk(KERN_ERR "xen_suspend: device_power_down failed: %d\n",
- err);
- return err;
- }
err = sysdev_suspend(PMSG_SUSPEND);
if (err) {
printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n",
err);
err = sysdev_suspend(PMSG_SUSPEND);
if (err) {
printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n",
err);
- device_power_up(PMSG_RESUME);
return err;
}
return err;
}
@@
-68,15
+61,14
@@
static int xen_suspend(void *data)
gnttab_resume();
xen_mm_unpin_all();
gnttab_resume();
xen_mm_unpin_all();
- sysdev_resume();
- device_power_up(PMSG_RESUME);
-
if (!*cancelled) {
xen_irq_resume();
xen_console_resume();
xen_timer_resume();
}
if (!*cancelled) {
xen_irq_resume();
xen_console_resume();
xen_timer_resume();
}
+ sysdev_resume();
+
return 0;
}
return 0;
}
@@
-87,6
+79,12
@@
static void do_suspend(void)
shutting_down = SHUTDOWN_SUSPEND;
shutting_down = SHUTDOWN_SUSPEND;
+ err = stop_machine_create();
+ if (err) {
+ printk(KERN_ERR "xen suspend: failed to setup stop_machine %d\n", err);
+ goto out;
+ }
+
#ifdef CONFIG_PREEMPT
/* If the kernel is preemptible, we need to freeze all the processes
to prevent them from being in the middle of a pagetable update
#ifdef CONFIG_PREEMPT
/* If the kernel is preemptible, we need to freeze all the processes
to prevent them from being in the middle of a pagetable update
@@
-94,40
+92,55
@@
static void do_suspend(void)
err = freeze_processes();
if (err) {
printk(KERN_ERR "xen suspend: freeze failed %d\n", err);
err = freeze_processes();
if (err) {
printk(KERN_ERR "xen suspend: freeze failed %d\n", err);
-
return
;
+
goto out_destroy_sm
;
}
#endif
}
#endif
- err = d
evice_suspend
(PMSG_SUSPEND);
+ err = d
pm_suspend_start
(PMSG_SUSPEND);
if (err) {
if (err) {
- printk(KERN_ERR "xen suspend: device_suspend %d\n", err);
- goto out;
+ printk(KERN_ERR "xen suspend: dpm_suspend_start %d\n", err);
+ goto out_thaw;
+ }
+
+ err = dpm_suspend_noirq(PMSG_SUSPEND);
+ if (err) {
+ printk(KERN_ERR "dpm_suspend_noirq failed: %d\n", err);
+ goto out_resume;
}
}
- printk("suspending xenbus...\n");
- /* XXX use normal device tree? */
- xenbus_suspend();
+ printk(KERN_DEBUG "suspending xenstore...\n");
+ xs_suspend();
err = stop_machine(xen_suspend, &cancelled, cpumask_of(0));
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);
if (err) {
printk(KERN_ERR "failed to start xen_suspend: %d\n", err);
-
goto out
;
+
cancelled = 1
;
}
if (!cancelled) {
xen_arch_resume();
}
if (!cancelled) {
xen_arch_resume();
- x
enbu
s_resume();
+ xs_resume();
} else
} else
- x
enbu
s_suspend_cancel();
+ xs_suspend_cancel();
- device_resume(PMSG_RESUME);
+out_resume:
+ dpm_resume_end(PMSG_RESUME);
/* Make sure timer events get retriggered on all CPUs */
clock_was_set();
/* Make sure timer events get retriggered on all CPUs */
clock_was_set();
-out:
+
+out_thaw:
#ifdef CONFIG_PREEMPT
thaw_processes();
#ifdef CONFIG_PREEMPT
thaw_processes();
+
+out_destroy_sm:
#endif
#endif
+ stop_machine_destroy();
+
+out:
shutting_down = SHUTDOWN_INVALID;
}
#endif /* CONFIG_PM_SLEEP */
shutting_down = SHUTDOWN_INVALID;
}
#endif /* CONFIG_PM_SLEEP */