Re: swsusp intermittent failures in 2.6.15-rc3-mm1

From: Rafael J. Wysocki
Date: Thu Dec 01 2005 - 16:41:19 EST


Hi,

On Thursday, 1 of December 2005 18:36, Andy Isaacson wrote:
> My Thinkpad X40 (1.25 GB, ipw2200) has had fairly reliable swsusp since
> 2.6.13 or thereabouts, and as recently as 2.6.15-rc1-mm1 I had about 20
> successful suspend/resume cycles. But now that I'm running
> 2.6.15-rc3-mm1 I'm seeing intermittent failures like this:

Thanks a lot for the report.

The problem is apparently caused by my recent patch intended to speed up
suspend. Could you please apply the appended debug patch, try to reproduce
the problem and send full dmesg output back to me?

Rafael


Index: linux-2.6.15-rc3-mm1/kernel/power/swsusp.c
===================================================================
--- linux-2.6.15-rc3-mm1.orig/kernel/power/swsusp.c 2005-12-01 22:13:17.000000000 +0100
+++ linux-2.6.15-rc3-mm1/kernel/power/swsusp.c 2005-12-01 22:24:56.000000000 +0100
@@ -635,12 +635,18 @@
printk("Shrinking memory... ");
do {
#ifdef FAST_FREE
- tmp = count_data_pages() + count_highmem_pages();
+ tmp = count_data_pages();
+ printk("Data pages: %ld\n", tmp);
+ tmp += count_highmem_pages();
+ printk("Data and highmem pages: %ld\n", tmp);
tmp += (tmp + PBES_PER_PAGE - 1) / PBES_PER_PAGE +
PAGES_FOR_IO;
+ printk("Total pages: %ld\n", tmp);
for_each_zone (zone)
- if (!is_highmem(zone))
+ if (!is_highmem(zone)) {
tmp -= zone->free_pages;
+ printk("Pages to free: %ld\n", tmp);
+ }
if (tmp > 0) {
tmp = shrink_all_memory(SHRINK_BITE);
if (!tmp)
Index: linux-2.6.15-rc3-mm1/kernel/power/snapshot.c
===================================================================
--- linux-2.6.15-rc3-mm1.orig/kernel/power/snapshot.c 2005-12-01 22:13:58.000000000 +0100
+++ linux-2.6.15-rc3-mm1/kernel/power/snapshot.c 2005-12-01 22:39:01.000000000 +0100
@@ -437,8 +437,14 @@

static int enough_free_mem(unsigned int nr_pages)
{
- pr_debug("swsusp: available memory: %u pages\n", nr_free_pages());
- return nr_free_pages() > (nr_pages + PAGES_FOR_IO +
+ struct zone *zone;
+ unsigned int n = 0;
+
+ for_each_zone (zone)
+ if (!is_highmem(zone))
+ n += zone->free_pages;
+ printk("swsusp: available memory: %u pages\n", n);
+ return n > (nr_pages + PAGES_FOR_IO +
(nr_pages + PBES_PER_PAGE - 1) / PBES_PER_PAGE);
}



--
Beer is proof that God loves us and wants us to be happy - Benjamin Franklin
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/