On Thursday 24 August 2006 00:08, Jon Escombe wrote:
> Jon Escombe wrote:
> >
> > Have dug a little deeper in to my resume problem, and found out that
> > it's failing in snapshot.c / copy_data_pages(). BUG_ON(!pbe) is
> > invoked on the 2nd iteration, when zone_pfn == 1.
>
> Sorry, may have jumped the gun a little there. After a few more attempts
> it's not so clear cut...
>
> printk's scattered through the resume code are always getting to the
> "for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn)" loop in
> copy_data_pages() before the reboot. However, it's not always the same
> iteration, and I don't think the BUG_ON in this loop can be the cause -
> as at least once it's rebooted after this line.. Back to the drawing
> board....
Could you please try the appended patch and see if it changes anything?
Rafael
---
arch/i386/kernel/setup.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
Index: linux-2.6.18-rc2/arch/i386/kernel/setup.c
===================================================================
--- linux-2.6.18-rc2.orig/arch/i386/kernel/setup.c 2006-07-28
10:27:44.000000000 +0200
+++ linux-2.6.18-rc2/arch/i386/kernel/setup.c 2006-07-28 10:51:33.000000000
+0200
@@ -1301,14 +1301,33 @@ void __init remapped_pgdat_init(void)
}
}
+/* Mark pages corresponding to given address range as nosave */
+static void __init
+e820_mark_nosave_range(unsigned long start, unsigned long end)
+{
+ unsigned long pfn, max_pfn;
+
+ if (start >= end)
+ return;
+
+ printk("Nosave address range: %016lx - %016lx\n", start, end);
+ max_pfn = end >> PAGE_SHIFT;
+ for (pfn = start >> PAGE_SHIFT; pfn < max_pfn; pfn++)
+ if(pfn_valid(pfn))
+ SetPageNosave(pfn_to_page(pfn));
+}
+
/*
* Request address space for all standard RAM and ROM resources
* and also for regions reported as reserved by the e820.
+ *
+ * Mark memory gaps and the reserved regions as nosave.
*/
static void __init
legacy_init_iomem_resources(struct resource *code_resource, struct resource
*data_resource)
{
int i;
+ unsigned long paddr;
probe_roms();
for (i = 0; i < e820.nr_map; i++) {
@@ -1344,6 +1363,21 @@ legacy_init_iomem_resources(struct resou
#endif
}
}
+
+ paddr = (e820.map[0].addr + e820.map[0].size) & ~(PAGE_SIZE - 1);
+ for (i = 1; i < e820.nr_map; i++) {
+ struct e820entry *ei = &e820.map[i];
+ unsigned long base;
+
+ /* Check if we have any nosave pages here */
+ base = (ei->addr + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
+ if (paddr < ei->addr)
+ e820_mark_nosave_range(paddr, base);
+
+ paddr = (ei->addr + ei->size) & ~(PAGE_SIZE - 1);
+ if (ei->type != E820_RAM)
+ e820_mark_nosave_range(base, paddr);
+ }
}
/*
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Suspend-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/suspend-devel