diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-10 12:35:02 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-10 12:35:02 -0500 |
| commit | ab1831b0b87851c874a75e4b3a8538e3d76b37d7 (patch) | |
| tree | e2855518eb570ad09e2bdf5b3805cfa758e0abc3 /drivers/xen/manage.c | |
| parent | eae6fa9b0c3e2cb49cc157e906dd0ac52cfd7ca5 (diff) | |
| parent | bc2c0303226ec716854d3c208c7f84fe7aa35cd7 (diff) | |
Merge branch 'bugfix' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen
* 'bugfix' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen:
xen: try harder to balloon up under memory pressure.
Xen balloon: fix totalram_pages counting.
xen: explicitly create/destroy stop_machine workqueues outside suspend/resume region.
xen: improve error handling in do_suspend.
xen: don't leak IRQs over suspend/resume.
xen: call clock resume notifier on all CPUs
xen: use iret for return from 64b kernel to 32b usermode
xen: don't call dpm_resume_noirq() with interrupts disabled.
xen: register runstate info for boot CPU early
xen: register runstate on secondary CPUs
xen: register timer interrupt with IRQF_TIMER
xen: correctly restore pfn_to_mfn_list_list after resume
xen: restore runstate_info even if !have_vcpu_info_placement
xen: re-register runstate area earlier on resume.
xen: wait up to 5 minutes for device connetion
xen: improvement to wait_for_devices()
xen: fix is_disconnected_device/exists_disconnected_device
xen/xenbus: make DEVICE_ATTR()s static
Diffstat (limited to 'drivers/xen/manage.c')
| -rw-r--r-- | drivers/xen/manage.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c index 10d03d7931c4..c4997930afc7 100644 --- a/drivers/xen/manage.c +++ b/drivers/xen/manage.c | |||
| @@ -43,7 +43,6 @@ static int xen_suspend(void *data) | |||
| 43 | if (err) { | 43 | if (err) { |
| 44 | printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n", | 44 | printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n", |
| 45 | err); | 45 | err); |
| 46 | dpm_resume_noirq(PMSG_RESUME); | ||
| 47 | return err; | 46 | return err; |
| 48 | } | 47 | } |
| 49 | 48 | ||
| @@ -69,7 +68,6 @@ static int xen_suspend(void *data) | |||
| 69 | } | 68 | } |
| 70 | 69 | ||
| 71 | sysdev_resume(); | 70 | sysdev_resume(); |
| 72 | dpm_resume_noirq(PMSG_RESUME); | ||
| 73 | 71 | ||
| 74 | return 0; | 72 | return 0; |
| 75 | } | 73 | } |
| @@ -81,6 +79,12 @@ static void do_suspend(void) | |||
| 81 | 79 | ||
| 82 | shutting_down = SHUTDOWN_SUSPEND; | 80 | shutting_down = SHUTDOWN_SUSPEND; |
| 83 | 81 | ||
| 82 | err = stop_machine_create(); | ||
| 83 | if (err) { | ||
| 84 | printk(KERN_ERR "xen suspend: failed to setup stop_machine %d\n", err); | ||
| 85 | goto out; | ||
| 86 | } | ||
| 87 | |||
| 84 | #ifdef CONFIG_PREEMPT | 88 | #ifdef CONFIG_PREEMPT |
| 85 | /* If the kernel is preemptible, we need to freeze all the processes | 89 | /* If the kernel is preemptible, we need to freeze all the processes |
| 86 | to prevent them from being in the middle of a pagetable update | 90 | to prevent them from being in the middle of a pagetable update |
| @@ -88,29 +92,32 @@ static void do_suspend(void) | |||
| 88 | err = freeze_processes(); | 92 | err = freeze_processes(); |
| 89 | if (err) { | 93 | if (err) { |
| 90 | printk(KERN_ERR "xen suspend: freeze failed %d\n", err); | 94 | printk(KERN_ERR "xen suspend: freeze failed %d\n", err); |
| 91 | return; | 95 | goto out_destroy_sm; |
| 92 | } | 96 | } |
| 93 | #endif | 97 | #endif |
| 94 | 98 | ||
| 95 | err = dpm_suspend_start(PMSG_SUSPEND); | 99 | err = dpm_suspend_start(PMSG_SUSPEND); |
| 96 | if (err) { | 100 | if (err) { |
| 97 | printk(KERN_ERR "xen suspend: dpm_suspend_start %d\n", err); | 101 | printk(KERN_ERR "xen suspend: dpm_suspend_start %d\n", err); |
| 98 | goto out; | 102 | goto out_thaw; |
| 99 | } | 103 | } |
| 100 | 104 | ||
| 101 | printk(KERN_DEBUG "suspending xenstore...\n"); | ||
| 102 | xs_suspend(); | ||
| 103 | |||
| 104 | err = dpm_suspend_noirq(PMSG_SUSPEND); | 105 | err = dpm_suspend_noirq(PMSG_SUSPEND); |
| 105 | if (err) { | 106 | if (err) { |
| 106 | printk(KERN_ERR "dpm_suspend_noirq failed: %d\n", err); | 107 | printk(KERN_ERR "dpm_suspend_noirq failed: %d\n", err); |
| 107 | goto resume_devices; | 108 | goto out_resume; |
| 108 | } | 109 | } |
| 109 | 110 | ||
| 111 | printk(KERN_DEBUG "suspending xenstore...\n"); | ||
| 112 | xs_suspend(); | ||
| 113 | |||
| 110 | err = stop_machine(xen_suspend, &cancelled, cpumask_of(0)); | 114 | err = stop_machine(xen_suspend, &cancelled, cpumask_of(0)); |
| 115 | |||
| 116 | dpm_resume_noirq(PMSG_RESUME); | ||
| 117 | |||
| 111 | if (err) { | 118 | if (err) { |
| 112 | printk(KERN_ERR "failed to start xen_suspend: %d\n", err); | 119 | printk(KERN_ERR "failed to start xen_suspend: %d\n", err); |
| 113 | goto out; | 120 | cancelled = 1; |
| 114 | } | 121 | } |
| 115 | 122 | ||
| 116 | if (!cancelled) { | 123 | if (!cancelled) { |
| @@ -119,17 +126,21 @@ static void do_suspend(void) | |||
| 119 | } else | 126 | } else |
| 120 | xs_suspend_cancel(); | 127 | xs_suspend_cancel(); |
| 121 | 128 | ||
| 122 | dpm_resume_noirq(PMSG_RESUME); | 129 | out_resume: |
| 123 | |||
| 124 | resume_devices: | ||
| 125 | dpm_resume_end(PMSG_RESUME); | 130 | dpm_resume_end(PMSG_RESUME); |
| 126 | 131 | ||
| 127 | /* Make sure timer events get retriggered on all CPUs */ | 132 | /* Make sure timer events get retriggered on all CPUs */ |
| 128 | clock_was_set(); | 133 | clock_was_set(); |
| 129 | out: | 134 | |
| 135 | out_thaw: | ||
| 130 | #ifdef CONFIG_PREEMPT | 136 | #ifdef CONFIG_PREEMPT |
| 131 | thaw_processes(); | 137 | thaw_processes(); |
| 138 | |||
| 139 | out_destroy_sm: | ||
| 132 | #endif | 140 | #endif |
| 141 | stop_machine_destroy(); | ||
| 142 | |||
| 143 | out: | ||
| 133 | shutting_down = SHUTDOWN_INVALID; | 144 | shutting_down = SHUTDOWN_INVALID; |
| 134 | } | 145 | } |
| 135 | #endif /* CONFIG_PM_SLEEP */ | 146 | #endif /* CONFIG_PM_SLEEP */ |
