[Maverick SRU][PATCH] Fix memcpy oops after multiple S4 cycles

Colin King colin.king at canonical.com
Sat Jan 15 10:43:40 UTC 2011

From: Colin Ian King <colin.king at canonical.com>

SRU Request:

After repeated S4 cycles, a memcpy() Oops occurs in suspend_nvs_save.
This error occurs because the ioremap of the NVS region fails, returning
NULL and the subsequent memcpy() tries to copy to a NULL pointer,
hence the oops.

The ioremap fails because we run out of mappable regions. This is because
suspend_nvs_save() is called twice during hibernation, and yet the
unmapping via suspend_nvs_free() is only called once, hence we have a leak.

Looking at create_image() in kernel/power/hibernate.c, we can see that we
call the __acpi_pm_prepare() via arch_prepare_suspend() and this does the
first call to suspend_nvs_save(). A little later on we call 
platform_pre_snapshot() which calls acpi_hibernation_pre_snapshot() 
and this duplicates the call of suspend_nvs_save() and hence the double
ioremap. We need to drop one of these.

The following upstream patch addresses this issue.

BugLink: http://bugs.launchpad.net/bugs/703228

Impact: mempcpy() oops after multiple S4 cycles. Number of cycles depends
on how much (or little) mappable NVS region is available.

Fix: Remove extraneous call to suspend_nvs_save()

Testcase: Without this patch, a test machine fails after just 12 S4 cycles.
With the patch, it no longer gets the memcpy() oops.

I've also soak tested this patch overnight on a another machine with 250
S4 cycles: no regression with this patch is observed.

Rafael J. Wysocki (1):
  ACPI / Sleep: Consolidate suspend and hibernation routines

 drivers/acpi/sleep.c |   42 ++++++++++++++++--------------------------
 1 files changed, 16 insertions(+), 26 deletions(-)

More information about the kernel-team mailing list