diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2008-01-12 14:40:46 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-01-24 23:40:04 -0500 |
commit | 775b64d2b6ca37697de925f70799c710aab5849a (patch) | |
tree | 09e91c89228c8d3c6928a1b2ef56711190c69836 /arch | |
parent | 7a83d456a86d559a6347115d206d23774bc152d9 (diff) |
PM: Acquire device locks on suspend
This patch reorganizes the way suspend and resume notifications are
sent to drivers. The major changes are that now the PM core acquires
every device semaphore before calling the methods, and calls to
device_add() during suspends will fail, while calls to device_del()
during suspends will block.
It also provides a way to safely remove a suspended device with the
help of the PM core, by using the device_pm_schedule_removal() callback
introduced specifically for this purpose, and updates two drivers (msr
and cpuid) that need to use it.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/cpuid.c | 6 | ||||
-rw-r--r-- | arch/x86/kernel/msr.c | 6 |
2 files changed, 6 insertions, 6 deletions
diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c index 05c9936a16cc..d387c770c518 100644 --- a/arch/x86/kernel/cpuid.c +++ b/arch/x86/kernel/cpuid.c | |||
@@ -157,15 +157,15 @@ static int __cpuinit cpuid_class_cpu_callback(struct notifier_block *nfb, | |||
157 | 157 | ||
158 | switch (action) { | 158 | switch (action) { |
159 | case CPU_UP_PREPARE: | 159 | case CPU_UP_PREPARE: |
160 | case CPU_UP_PREPARE_FROZEN: | ||
161 | err = cpuid_device_create(cpu); | 160 | err = cpuid_device_create(cpu); |
162 | break; | 161 | break; |
163 | case CPU_UP_CANCELED: | 162 | case CPU_UP_CANCELED: |
164 | case CPU_UP_CANCELED_FROZEN: | ||
165 | case CPU_DEAD: | 163 | case CPU_DEAD: |
166 | case CPU_DEAD_FROZEN: | ||
167 | cpuid_device_destroy(cpu); | 164 | cpuid_device_destroy(cpu); |
168 | break; | 165 | break; |
166 | case CPU_UP_CANCELED_FROZEN: | ||
167 | destroy_suspended_device(cpuid_class, MKDEV(CPUID_MAJOR, cpu)); | ||
168 | break; | ||
169 | } | 169 | } |
170 | return err ? NOTIFY_BAD : NOTIFY_OK; | 170 | return err ? NOTIFY_BAD : NOTIFY_OK; |
171 | } | 171 | } |
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index ee6eba4ecfea..21f6e3c0be18 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
@@ -155,15 +155,15 @@ static int __cpuinit msr_class_cpu_callback(struct notifier_block *nfb, | |||
155 | 155 | ||
156 | switch (action) { | 156 | switch (action) { |
157 | case CPU_UP_PREPARE: | 157 | case CPU_UP_PREPARE: |
158 | case CPU_UP_PREPARE_FROZEN: | ||
159 | err = msr_device_create(cpu); | 158 | err = msr_device_create(cpu); |
160 | break; | 159 | break; |
161 | case CPU_UP_CANCELED: | 160 | case CPU_UP_CANCELED: |
162 | case CPU_UP_CANCELED_FROZEN: | ||
163 | case CPU_DEAD: | 161 | case CPU_DEAD: |
164 | case CPU_DEAD_FROZEN: | ||
165 | msr_device_destroy(cpu); | 162 | msr_device_destroy(cpu); |
166 | break; | 163 | break; |
164 | case CPU_UP_CANCELED_FROZEN: | ||
165 | destroy_suspended_device(msr_class, MKDEV(MSR_MAJOR, cpu)); | ||
166 | break; | ||
167 | } | 167 | } |
168 | return err ? NOTIFY_BAD : NOTIFY_OK; | 168 | return err ? NOTIFY_BAD : NOTIFY_OK; |
169 | } | 169 | } |