Re: 2.6.38.2 breaks suspend to disk

From: Yinghai Lu
Date: Fri Apr 01 2011 - 15:55:32 EST


On 04/01/2011 12:36 PM, H. Peter Anvin wrote:
On 04/01/2011 12:32 PM, Yinghai Lu wrote:

So for 32 bit, PAE support is not compiled in for old 486 cpus.
mmu_cr4_feautres will be used to make sure head_32.S will not access cr4.

that could be the reason why 32 bit does not do read back at beginning.


Yes, but that doesn't explain why we shouldn't set new bits like NX and
PSE in this register.

ok, please check if you are happy with this one.

From: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>

[PATCH -v3] x86: Save cr4 to mmu_cr4_features at boot time

Save cr4 to mmu_cr4_features at boot time

Michael reported 2.6.38.2 hibernation is broken by one backported patch.
it cause a freeze when resuming from hibernation

| "x86: Cleanup highmap after brk is concluded"
| commit id e5f15b45ddf3afa2bbbb10c7ea34fb32b6de0a0e.

it turns out the mmu_cr4 save it lost somehow.

-v3: read back cr4 for 32bit too according to HPA

Bisected-and-tested-by: Michael Leun <lkml20101129@xxxxxxxxxxxxxxx>
Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx>

---
arch/x86/kernel/setup.c | 12 ++++++++++++
1 file changed, 12 insertions(+)

Index: linux-2.6/arch/x86/kernel/setup.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/setup.c
+++ linux-2.6/arch/x86/kernel/setup.c
@@ -219,6 +219,17 @@ unsigned long mmu_cr4_features;
unsigned long mmu_cr4_features = X86_CR4_PAE;
#endif
+#if defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64)
+static void __init read_back_mmu_cr4(void)
+{
+ mmu_cr4_features = read_cr4();
+}
+#else
+static void __init read_back_mmu_cr4(void)
+{
+}
+#endif
+
/* Boot loader ID and version as integers, for the benefit of proc_dointvec */
int bootloader_type, bootloader_version;
@@ -892,6 +903,7 @@ void __init setup_arch(char **cmdline_p)
high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1;
#endif
+ read_back_mmu_cr4();
/*
* Find and reserve possible boot-time SMP configuration:
--
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/