Skip to content

Commit

Permalink
[PATCH] Revert "swsusp: disable nonboot CPUs before entering platform…
Browse files Browse the repository at this point in the history
… suspend"

This reverts commit 9498513 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>
  • Loading branch information
Rafael J. Wysocki authored and Linus Torvalds committed Mar 27, 2007
1 parent c7f6d15 commit 436ce71
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 4 deletions.
4 changes: 3 additions & 1 deletion arch/x86_64/kernel/acpi/sleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,10 @@ static void init_low_mapping(void)
{
pgd_t *slot0 = pgd_offset(current->mm, 0UL);
low_ptr = *slot0;
/* FIXME: We're playing with the current task's page tables here, which
* is potentially dangerous on SMP systems.
*/
set_pgd(slot0, *pgd_offset(current->mm, PAGE_OFFSET));
WARN_ON(num_online_cpus() != 1);
local_flush_tlb();
}

Expand Down
1 change: 0 additions & 1 deletion kernel/power/disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ static inline int platform_prepare(void)

static void power_down(suspend_disk_method_t mode)
{
disable_nonboot_cpus();
switch(mode) {
case PM_DISK_PLATFORM:
if (pm_ops && pm_ops->enter) {
Expand Down
3 changes: 1 addition & 2 deletions kernel/power/user.c
Original file line number Diff line number Diff line change
Expand Up @@ -401,10 +401,9 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,

case PMOPS_ENTER:
if (data->platform_suspend) {
disable_nonboot_cpus();
kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK);
error = pm_ops->enter(PM_SUSPEND_DISK);
enable_nonboot_cpus();
error = 0;
}
break;

Expand Down

0 comments on commit 436ce71

Please sign in to comment.