aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2007-03-27 06:09:13 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-27 12:20:03 -0400
commit436ce71638eceb0f9dd7608157807c37b29c3db7 (patch)
tree9f1e70f14650a23363a90aa7a1cd35dc54ec93bb
parentc7f6d15ff2664467a2cb669abcabb5ffaf719b2d (diff)
[PATCH] Revert "swsusp: disable nonboot CPUs before entering platform suspend"
This reverts commit 94985134b7b46848267ed6b734320db01c974e72 and insteads removes the WARN_ON() that caused that commit in the first place. The problem is that we call disable_nonboot_cpus() in swsusp before powering down the system in order to avoid triggering the WARN_ON() in arch/x86_64/kernel/acpi/sleep.c:init_low_mapping() and this doesn't work well on Thomas' system. So instead, remove the WARN_ON() in arch/x86_64/kernel/acpi/sleep.c: init_low_mapping(), which triggers every time during the suspend to disk in the platform mode, as the potential problem it is related to doesn't seem to occur in practice. [ I think we might want to disallow the case of multiple users of that mm, or something. Normally, playing with the current process page tables on the current CPU should be fine as long as we don't have other threads using those tables at the same time.. Anyway, not pretty, but better than the warning or the lockup - Linus ] Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--arch/x86_64/kernel/acpi/sleep.c4
-rw-r--r--kernel/power/disk.c1
-rw-r--r--kernel/power/user.c3
3 files changed, 4 insertions, 4 deletions
diff --git a/arch/x86_64/kernel/acpi/sleep.c b/arch/x86_64/kernel/acpi/sleep.c
index 23178ce6c783..e1548fbe95ae 100644
--- a/arch/x86_64/kernel/acpi/sleep.c
+++ b/arch/x86_64/kernel/acpi/sleep.c
@@ -66,8 +66,10 @@ static void init_low_mapping(void)
66{ 66{
67 pgd_t *slot0 = pgd_offset(current->mm, 0UL); 67 pgd_t *slot0 = pgd_offset(current->mm, 0UL);
68 low_ptr = *slot0; 68 low_ptr = *slot0;
69 /* FIXME: We're playing with the current task's page tables here, which
70 * is potentially dangerous on SMP systems.
71 */
69 set_pgd(slot0, *pgd_offset(current->mm, PAGE_OFFSET)); 72 set_pgd(slot0, *pgd_offset(current->mm, PAGE_OFFSET));
70 WARN_ON(num_online_cpus() != 1);
71 local_flush_tlb(); 73 local_flush_tlb();
72} 74}
73 75
diff --git a/kernel/power/disk.c b/kernel/power/disk.c
index dee0ff40befd..aec19b063e3f 100644
--- a/kernel/power/disk.c
+++ b/kernel/power/disk.c
@@ -58,7 +58,6 @@ static inline int platform_prepare(void)
58 58
59static void power_down(suspend_disk_method_t mode) 59static void power_down(suspend_disk_method_t mode)
60{ 60{
61 disable_nonboot_cpus();
62 switch(mode) { 61 switch(mode) {
63 case PM_DISK_PLATFORM: 62 case PM_DISK_PLATFORM:
64 if (pm_ops && pm_ops->enter) { 63 if (pm_ops && pm_ops->enter) {
diff --git a/kernel/power/user.c b/kernel/power/user.c
index bf211fee1222..7cf6713b2325 100644
--- a/kernel/power/user.c
+++ b/kernel/power/user.c
@@ -401,10 +401,9 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
401 401
402 case PMOPS_ENTER: 402 case PMOPS_ENTER:
403 if (data->platform_suspend) { 403 if (data->platform_suspend) {
404 disable_nonboot_cpus();
405 kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK); 404 kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK);
406 error = pm_ops->enter(PM_SUSPEND_DISK); 405 error = pm_ops->enter(PM_SUSPEND_DISK);
407 enable_nonboot_cpus(); 406 error = 0;
408 } 407 }
409 break; 408 break;
410 409