All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] i386: do a global tlb flush in S4 resume
@ 2010-03-04  1:23 Shaohua Li
  2010-03-04  2:30 ` H. Peter Anvin
  0 siblings, 1 reply; 11+ messages in thread
From: Shaohua Li @ 2010-03-04  1:23 UTC (permalink / raw)
  To: linux-kernel; +Cc: rjw, mingo, hpa, colin.king, Shaohua Li

Colin reported a strange oops in S4 resume code path (see below). The test
system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
The oops always happen a virtual address 0xc03ff000, which is mapped to the
last 4k of first 4M memory. Doing a global tlb flush fixes the issue.

EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
EIP is at copy_loop+0xe/0x15
EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
 DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
...
...
CR2: 00000000c03ff000

Tested-by: Colin Ian King <colin.king@canonical.com>
Signed-off-by: Shaohua Li <shaohua.li@intel.com>
---
 arch/x86/power/hibernate_asm_32.S |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
index b641388..9e4ef64 100644
--- a/arch/x86/power/hibernate_asm_32.S
+++ b/arch/x86/power/hibernate_asm_32.S
@@ -27,10 +27,21 @@ ENTRY(swsusp_arch_suspend)
 	ret
 
 ENTRY(restore_image)
+	movl	mmu_cr4_features, %ecx
 	movl	resume_pg_dir, %eax
 	subl	$__PAGE_OFFSET, %eax
 	movl	%eax, %cr3
 
+	jecxz	1f	# cr4 Pentium and higher, skip if zero
+	movl	%ecx, %edx
+	andl	$~(X86_CR4_PGE), %edx
+	movl	%edx, %cr4;  # turn off PGE
+1:
+	movl	%cr3, %eax;  # flush TLB
+	movl	%eax, %cr3
+	jecxz	1f	# cr4 Pentium and higher, skip if zero
+	movl	%ecx, %cr4;  # turn PGE back on
+1:
 	movl	restore_pblist, %edx
 	.p2align 4,,7
 
-- 
1.6.3.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] i386: do a global tlb flush in S4 resume
  2010-03-04  1:23 [PATCH] i386: do a global tlb flush in S4 resume Shaohua Li
@ 2010-03-04  2:30 ` H. Peter Anvin
  2010-03-04  2:41   ` Shaohua Li
  0 siblings, 1 reply; 11+ messages in thread
From: H. Peter Anvin @ 2010-03-04  2:30 UTC (permalink / raw)
  To: Shaohua Li; +Cc: linux-kernel, rjw, mingo, colin.king

On 03/03/2010 05:23 PM, Shaohua Li wrote:
> Colin reported a strange oops in S4 resume code path (see below). The test
> system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
> The oops always happen a virtual address 0xc03ff000, which is mapped to the
> last 4k of first 4M memory. Doing a global tlb flush fixes the issue.
> 
> EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
> EIP is at copy_loop+0xe/0x15
> EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
> ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
>  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
> ...
> ...
> CR2: 00000000c03ff000
> 
> Tested-by: Colin Ian King <colin.king@canonical.com>
> Signed-off-by: Shaohua Li <shaohua.li@intel.com>
> ---
>  arch/x86/power/hibernate_asm_32.S |   11 +++++++++++
>  1 files changed, 11 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
> index b641388..9e4ef64 100644
> --- a/arch/x86/power/hibernate_asm_32.S
> +++ b/arch/x86/power/hibernate_asm_32.S
> @@ -27,10 +27,21 @@ ENTRY(swsusp_arch_suspend)
>  	ret
>  
>  ENTRY(restore_image)
> +	movl	mmu_cr4_features, %ecx
>  	movl	resume_pg_dir, %eax
>  	subl	$__PAGE_OFFSET, %eax
>  	movl	%eax, %cr3
>  
> +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> +	movl	%ecx, %edx
> +	andl	$~(X86_CR4_PGE), %edx
> +	movl	%edx, %cr4;  # turn off PGE
> +1:
> +	movl	%cr3, %eax;  # flush TLB
> +	movl	%eax, %cr3
> +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> +	movl	%ecx, %cr4;  # turn PGE back on
> +1:
>  	movl	restore_pblist, %edx
>  	.p2align 4,,7
>  

Since we're about to do another global page flush a bit further down in
the same code, why not just leave PGE off until then?

	-hpa

-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] i386: do a global tlb flush in S4 resume
  2010-03-04  2:30 ` H. Peter Anvin
@ 2010-03-04  2:41   ` Shaohua Li
  2010-03-04 19:49     ` Rafael J. Wysocki
  0 siblings, 1 reply; 11+ messages in thread
From: Shaohua Li @ 2010-03-04  2:41 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: linux-kernel, rjw, mingo, colin.king

On Thu, Mar 04, 2010 at 10:30:02AM +0800, H. Peter Anvin wrote:
> On 03/03/2010 05:23 PM, Shaohua Li wrote:
> > Colin reported a strange oops in S4 resume code path (see below). The test
> > system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
> > The oops always happen a virtual address 0xc03ff000, which is mapped to the
> > last 4k of first 4M memory. Doing a global tlb flush fixes the issue.
> > 
> > EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
> > EIP is at copy_loop+0xe/0x15
> > EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
> > ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
> >  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
> > ...
> > ...
> > CR2: 00000000c03ff000
> > 
> > Tested-by: Colin Ian King <colin.king@canonical.com>
> > Signed-off-by: Shaohua Li <shaohua.li@intel.com>
> > ---
> >  arch/x86/power/hibernate_asm_32.S |   11 +++++++++++
> >  1 files changed, 11 insertions(+), 0 deletions(-)
> > 
> > diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
> > index b641388..9e4ef64 100644
> > --- a/arch/x86/power/hibernate_asm_32.S
> > +++ b/arch/x86/power/hibernate_asm_32.S
> > @@ -27,10 +27,21 @@ ENTRY(swsusp_arch_suspend)
> >  	ret
> >  
> >  ENTRY(restore_image)
> > +	movl	mmu_cr4_features, %ecx
> >  	movl	resume_pg_dir, %eax
> >  	subl	$__PAGE_OFFSET, %eax
> >  	movl	%eax, %cr3
> >  
> > +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > +	movl	%ecx, %edx
> > +	andl	$~(X86_CR4_PGE), %edx
> > +	movl	%edx, %cr4;  # turn off PGE
> > +1:
> > +	movl	%cr3, %eax;  # flush TLB
> > +	movl	%eax, %cr3
> > +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > +	movl	%ecx, %cr4;  # turn PGE back on
> > +1:
> >  	movl	restore_pblist, %edx
> >  	.p2align 4,,7
> >  
> 
> Since we're about to do another global page flush a bit further down in
> the same code, why not just leave PGE off until then?
sure, updated patch.


i386: do a global tlb flush in S4 resume

    Colin reported a strange oops in S4 resume code path (see below). The test
    system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
    The oops always happen a virtual address 0xc03ff000, which is mapped to the
    last 4k of first 4M memory. Doing a global tlb flush fixes the issue.

    EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
    EIP is at copy_loop+0xe/0x15
    EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
    ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
     DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
    ...
    ...
    CR2: 00000000c03ff000

    Tested-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Shaohua Li <shaohua.li@intel.com>

diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
index b641388..cd5e878 100644
--- a/arch/x86/power/hibernate_asm_32.S
+++ b/arch/x86/power/hibernate_asm_32.S
@@ -27,10 +27,17 @@ ENTRY(swsusp_arch_suspend)
 	ret
 
 ENTRY(restore_image)
+	movl	mmu_cr4_features, %ecx
 	movl	resume_pg_dir, %eax
 	subl	$__PAGE_OFFSET, %eax
 	movl	%eax, %cr3
 
+	jecxz	1f	# cr4 Pentium and higher, skip if zero
+	andl	$~(X86_CR4_PGE), %ecx
+	movl	%ecx, %cr4;  # turn off PGE
+	movl	%cr3, %eax;  # flush TLB
+	movl	%eax, %cr3
+1:
 	movl	restore_pblist, %edx
 	.p2align 4,,7
 

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] i386: do a global tlb flush in S4 resume
  2010-03-04  2:41   ` Shaohua Li
@ 2010-03-04 19:49     ` Rafael J. Wysocki
  2010-03-04 20:11       ` Rafael J. Wysocki
  2010-03-05  0:59       ` Shaohua Li
  0 siblings, 2 replies; 11+ messages in thread
From: Rafael J. Wysocki @ 2010-03-04 19:49 UTC (permalink / raw)
  To: Shaohua Li; +Cc: H. Peter Anvin, linux-kernel, mingo, colin.king

On Thursday 04 March 2010, Shaohua Li wrote:
> On Thu, Mar 04, 2010 at 10:30:02AM +0800, H. Peter Anvin wrote:
> > On 03/03/2010 05:23 PM, Shaohua Li wrote:
> > > Colin reported a strange oops in S4 resume code path (see below). The test
> > > system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
> > > The oops always happen a virtual address 0xc03ff000, which is mapped to the
> > > last 4k of first 4M memory. Doing a global tlb flush fixes the issue.
> > > 
> > > EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
> > > EIP is at copy_loop+0xe/0x15
> > > EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
> > > ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
> > >  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
> > > ...
> > > ...
> > > CR2: 00000000c03ff000
> > > 
> > > Tested-by: Colin Ian King <colin.king@canonical.com>
> > > Signed-off-by: Shaohua Li <shaohua.li@intel.com>
> > > ---
> > >  arch/x86/power/hibernate_asm_32.S |   11 +++++++++++
> > >  1 files changed, 11 insertions(+), 0 deletions(-)
> > > 
> > > diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
> > > index b641388..9e4ef64 100644
> > > --- a/arch/x86/power/hibernate_asm_32.S
> > > +++ b/arch/x86/power/hibernate_asm_32.S
> > > @@ -27,10 +27,21 @@ ENTRY(swsusp_arch_suspend)
> > >  	ret
> > >  
> > >  ENTRY(restore_image)
> > > +	movl	mmu_cr4_features, %ecx
> > >  	movl	resume_pg_dir, %eax
> > >  	subl	$__PAGE_OFFSET, %eax
> > >  	movl	%eax, %cr3
> > >  
> > > +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > > +	movl	%ecx, %edx
> > > +	andl	$~(X86_CR4_PGE), %edx
> > > +	movl	%edx, %cr4;  # turn off PGE
> > > +1:
> > > +	movl	%cr3, %eax;  # flush TLB
> > > +	movl	%eax, %cr3
> > > +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > > +	movl	%ecx, %cr4;  # turn PGE back on
> > > +1:
> > >  	movl	restore_pblist, %edx
> > >  	.p2align 4,,7
> > >  
> > 
> > Since we're about to do another global page flush a bit further down in
> > the same code, why not just leave PGE off until then?
> sure, updated patch.
> 
> 
> i386: do a global tlb flush in S4 resume
> 
>     Colin reported a strange oops in S4 resume code path (see below). The test
>     system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
>     The oops always happen a virtual address 0xc03ff000, which is mapped to the
>     last 4k of first 4M memory. Doing a global tlb flush fixes the issue.
> 
>     EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
>     EIP is at copy_loop+0xe/0x15
>     EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
>     ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
>      DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
>     ...
>     ...
>     CR2: 00000000c03ff000
> 
>     Tested-by: Colin Ian King <colin.king@canonical.com>
>     Signed-off-by: Shaohua Li <shaohua.li@intel.com>
> 
> diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
> index b641388..cd5e878 100644
> --- a/arch/x86/power/hibernate_asm_32.S
> +++ b/arch/x86/power/hibernate_asm_32.S
> @@ -27,10 +27,17 @@ ENTRY(swsusp_arch_suspend)
>  	ret
>  
>  ENTRY(restore_image)
> +	movl	mmu_cr4_features, %ecx
>  	movl	resume_pg_dir, %eax
>  	subl	$__PAGE_OFFSET, %eax
>  	movl	%eax, %cr3
>  
> +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> +	andl	$~(X86_CR4_PGE), %ecx
> +	movl	%ecx, %cr4;  # turn off PGE
> +	movl	%cr3, %eax;  # flush TLB
> +	movl	%eax, %cr3
> +1:
>  	movl	restore_pblist, %edx
>  	.p2align 4,,7

In that case please also remove the turning GPE off down the road.

Rafael

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] i386: do a global tlb flush in S4 resume
  2010-03-04 19:49     ` Rafael J. Wysocki
@ 2010-03-04 20:11       ` Rafael J. Wysocki
  2010-03-05  0:59       ` Shaohua Li
  1 sibling, 0 replies; 11+ messages in thread
From: Rafael J. Wysocki @ 2010-03-04 20:11 UTC (permalink / raw)
  To: Shaohua Li; +Cc: H. Peter Anvin, linux-kernel, mingo, colin.king

On Thursday 04 March 2010, Rafael J. Wysocki wrote:
> On Thursday 04 March 2010, Shaohua Li wrote:
> > On Thu, Mar 04, 2010 at 10:30:02AM +0800, H. Peter Anvin wrote:
> > > On 03/03/2010 05:23 PM, Shaohua Li wrote:
> > > > Colin reported a strange oops in S4 resume code path (see below). The test
> > > > system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
> > > > The oops always happen a virtual address 0xc03ff000, which is mapped to the
> > > > last 4k of first 4M memory. Doing a global tlb flush fixes the issue.
> > > > 
> > > > EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
> > > > EIP is at copy_loop+0xe/0x15
> > > > EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
> > > > ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
> > > >  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
> > > > ...
> > > > ...
> > > > CR2: 00000000c03ff000
> > > > 
> > > > Tested-by: Colin Ian King <colin.king@canonical.com>
> > > > Signed-off-by: Shaohua Li <shaohua.li@intel.com>
> > > > ---
> > > >  arch/x86/power/hibernate_asm_32.S |   11 +++++++++++
> > > >  1 files changed, 11 insertions(+), 0 deletions(-)
> > > > 
> > > > diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
> > > > index b641388..9e4ef64 100644
> > > > --- a/arch/x86/power/hibernate_asm_32.S
> > > > +++ b/arch/x86/power/hibernate_asm_32.S
> > > > @@ -27,10 +27,21 @@ ENTRY(swsusp_arch_suspend)
> > > >  	ret
> > > >  
> > > >  ENTRY(restore_image)
> > > > +	movl	mmu_cr4_features, %ecx
> > > >  	movl	resume_pg_dir, %eax
> > > >  	subl	$__PAGE_OFFSET, %eax
> > > >  	movl	%eax, %cr3
> > > >  
> > > > +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > > > +	movl	%ecx, %edx
> > > > +	andl	$~(X86_CR4_PGE), %edx
> > > > +	movl	%edx, %cr4;  # turn off PGE
> > > > +1:
> > > > +	movl	%cr3, %eax;  # flush TLB
> > > > +	movl	%eax, %cr3
> > > > +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > > > +	movl	%ecx, %cr4;  # turn PGE back on
> > > > +1:
> > > >  	movl	restore_pblist, %edx
> > > >  	.p2align 4,,7
> > > >  
> > > 
> > > Since we're about to do another global page flush a bit further down in
> > > the same code, why not just leave PGE off until then?
> > sure, updated patch.
> > 
> > 
> > i386: do a global tlb flush in S4 resume
> > 
> >     Colin reported a strange oops in S4 resume code path (see below). The test
> >     system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
> >     The oops always happen a virtual address 0xc03ff000, which is mapped to the
> >     last 4k of first 4M memory. Doing a global tlb flush fixes the issue.
> > 
> >     EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
> >     EIP is at copy_loop+0xe/0x15
> >     EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
> >     ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
> >      DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
> >     ...
> >     ...
> >     CR2: 00000000c03ff000
> > 
> >     Tested-by: Colin Ian King <colin.king@canonical.com>
> >     Signed-off-by: Shaohua Li <shaohua.li@intel.com>
> > 
> > diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
> > index b641388..cd5e878 100644
> > --- a/arch/x86/power/hibernate_asm_32.S
> > +++ b/arch/x86/power/hibernate_asm_32.S
> > @@ -27,10 +27,17 @@ ENTRY(swsusp_arch_suspend)
> >  	ret
> >  
> >  ENTRY(restore_image)
> > +	movl	mmu_cr4_features, %ecx
> >  	movl	resume_pg_dir, %eax
> >  	subl	$__PAGE_OFFSET, %eax
> >  	movl	%eax, %cr3
> >  
> > +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > +	andl	$~(X86_CR4_PGE), %ecx
> > +	movl	%ecx, %cr4;  # turn off PGE
> > +	movl	%cr3, %eax;  # flush TLB
> > +	movl	%eax, %cr3
> > +1:
> >  	movl	restore_pblist, %edx
> >  	.p2align 4,,7
> 
> In that case please also remove the turning GPE off down the road.

s/GPE/PGE/

doh, too much ACPI programming lately.

Rafael

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] i386: do a global tlb flush in S4 resume
  2010-03-04 19:49     ` Rafael J. Wysocki
  2010-03-04 20:11       ` Rafael J. Wysocki
@ 2010-03-05  0:59       ` Shaohua Li
  2010-03-05 20:55         ` Rafael J. Wysocki
                           ` (2 more replies)
  1 sibling, 3 replies; 11+ messages in thread
From: Shaohua Li @ 2010-03-05  0:59 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: H. Peter Anvin, linux-kernel, mingo, colin.king

On Fri, Mar 05, 2010 at 03:49:46AM +0800, Rafael J. Wysocki wrote:
> On Thursday 04 March 2010, Shaohua Li wrote:
> > On Thu, Mar 04, 2010 at 10:30:02AM +0800, H. Peter Anvin wrote:
> > > On 03/03/2010 05:23 PM, Shaohua Li wrote:
> > > > Colin reported a strange oops in S4 resume code path (see below). The test
> > > > system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
> > > > The oops always happen a virtual address 0xc03ff000, which is mapped to the
> > > > last 4k of first 4M memory. Doing a global tlb flush fixes the issue.
> > > > 
> > > > EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
> > > > EIP is at copy_loop+0xe/0x15
> > > > EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
> > > > ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
> > > >  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
> > > > ...
> > > > ...
> > > > CR2: 00000000c03ff000
> > > > 
> > > > Tested-by: Colin Ian King <colin.king@canonical.com>
> > > > Signed-off-by: Shaohua Li <shaohua.li@intel.com>
> > > > ---
> > > >  arch/x86/power/hibernate_asm_32.S |   11 +++++++++++
> > > >  1 files changed, 11 insertions(+), 0 deletions(-)
> > > > 
> > > > diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
> > > > index b641388..9e4ef64 100644
> > > > --- a/arch/x86/power/hibernate_asm_32.S
> > > > +++ b/arch/x86/power/hibernate_asm_32.S
> > > > @@ -27,10 +27,21 @@ ENTRY(swsusp_arch_suspend)
> > > >  	ret
> > > >  
> > > >  ENTRY(restore_image)
> > > > +	movl	mmu_cr4_features, %ecx
> > > >  	movl	resume_pg_dir, %eax
> > > >  	subl	$__PAGE_OFFSET, %eax
> > > >  	movl	%eax, %cr3
> > > >  
> > > > +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > > > +	movl	%ecx, %edx
> > > > +	andl	$~(X86_CR4_PGE), %edx
> > > > +	movl	%edx, %cr4;  # turn off PGE
> > > > +1:
> > > > +	movl	%cr3, %eax;  # flush TLB
> > > > +	movl	%eax, %cr3
> > > > +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > > > +	movl	%ecx, %cr4;  # turn PGE back on
> > > > +1:
> > > >  	movl	restore_pblist, %edx
> > > >  	.p2align 4,,7
> > > >  
> > > 
> > > Since we're about to do another global page flush a bit further down in
> > > the same code, why not just leave PGE off until then?
> > sure, updated patch.
> > 
> > 
> > i386: do a global tlb flush in S4 resume
> > 
> >     Colin reported a strange oops in S4 resume code path (see below). The test
> >     system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
> >     The oops always happen a virtual address 0xc03ff000, which is mapped to the
> >     last 4k of first 4M memory. Doing a global tlb flush fixes the issue.
> > 
> >     EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
> >     EIP is at copy_loop+0xe/0x15
> >     EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
> >     ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
> >      DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
> >     ...
> >     ...
> >     CR2: 00000000c03ff000
> > 
> >     Tested-by: Colin Ian King <colin.king@canonical.com>
> >     Signed-off-by: Shaohua Li <shaohua.li@intel.com>
> > 
> > diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
> > index b641388..cd5e878 100644
> > --- a/arch/x86/power/hibernate_asm_32.S
> > +++ b/arch/x86/power/hibernate_asm_32.S
> > @@ -27,10 +27,17 @@ ENTRY(swsusp_arch_suspend)
> >  	ret
> >  
> >  ENTRY(restore_image)
> > +	movl	mmu_cr4_features, %ecx
> >  	movl	resume_pg_dir, %eax
> >  	subl	$__PAGE_OFFSET, %eax
> >  	movl	%eax, %cr3
> >  
> > +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > +	andl	$~(X86_CR4_PGE), %ecx
> > +	movl	%ecx, %cr4;  # turn off PGE
> > +	movl	%cr3, %eax;  # flush TLB
> > +	movl	%eax, %cr3
> > +1:
> >  	movl	restore_pblist, %edx
> >  	.p2align 4,,7
> 
> In that case please also remove the turning GPE off down the road.

    i386: do a global tlb flush in S4 resume

    Colin reported a strange oops in S4 resume code path (see below). The test
    system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
    The oops always happen a virtual address 0xc03ff000, which is mapped to the
    last 4k of first 4M memory. Doing a global tlb flush fixes the issue.

    EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
    EIP is at copy_loop+0xe/0x15
    EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
    ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
     DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
    ...
    ...
    CR2: 00000000c03ff000

    Tested-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Shaohua Li <shaohua.li@intel.com>

diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
index b641388..ad47dae 100644
--- a/arch/x86/power/hibernate_asm_32.S
+++ b/arch/x86/power/hibernate_asm_32.S
@@ -27,10 +27,17 @@ ENTRY(swsusp_arch_suspend)
 	ret
 
 ENTRY(restore_image)
+	movl	mmu_cr4_features, %ecx
 	movl	resume_pg_dir, %eax
 	subl	$__PAGE_OFFSET, %eax
 	movl	%eax, %cr3
 
+	jecxz	1f	# cr4 Pentium and higher, skip if zero
+	andl	$~(X86_CR4_PGE), %ecx
+	movl	%ecx, %cr4;  # turn off PGE
+	movl	%cr3, %eax;  # flush TLB
+	movl	%eax, %cr3
+1:
 	movl	restore_pblist, %edx
 	.p2align 4,,7
 
@@ -54,16 +61,8 @@ done:
 	movl	$swapper_pg_dir, %eax
 	subl	$__PAGE_OFFSET, %eax
 	movl	%eax, %cr3
-	/* Flush TLB, including "global" things (vmalloc) */
 	movl	mmu_cr4_features, %ecx
 	jecxz	1f	# cr4 Pentium and higher, skip if zero
-	movl	%ecx, %edx
-	andl	$~(X86_CR4_PGE), %edx
-	movl	%edx, %cr4;  # turn off PGE
-1:
-	movl	%cr3, %eax;  # flush TLB
-	movl	%eax, %cr3
-	jecxz	1f	# cr4 Pentium and higher, skip if zero
 	movl	%ecx, %cr4;  # turn PGE back on
 1:
 

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] i386: do a global tlb flush in S4 resume
  2010-03-05  0:59       ` Shaohua Li
@ 2010-03-05 20:55         ` Rafael J. Wysocki
  2010-03-06 21:54           ` Rafael J. Wysocki
  2010-03-30 18:42         ` [tip:x86/urgent] x86-32, resume: " tip-bot for Shaohua Li
  2010-03-30 18:48         ` tip-bot for Shaohua Li
  2 siblings, 1 reply; 11+ messages in thread
From: Rafael J. Wysocki @ 2010-03-05 20:55 UTC (permalink / raw)
  To: Shaohua Li; +Cc: H. Peter Anvin, linux-kernel, mingo, colin.king

On Friday 05 March 2010, Shaohua Li wrote:
> On Fri, Mar 05, 2010 at 03:49:46AM +0800, Rafael J. Wysocki wrote:
> > On Thursday 04 March 2010, Shaohua Li wrote:
...
> > 
> > In that case please also remove the turning GPE off down the road.
> 
>     i386: do a global tlb flush in S4 resume
> 
>     Colin reported a strange oops in S4 resume code path (see below). The test
>     system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
>     The oops always happen a virtual address 0xc03ff000, which is mapped to the
>     last 4k of first 4M memory. Doing a global tlb flush fixes the issue.
> 
>     EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
>     EIP is at copy_loop+0xe/0x15
>     EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
>     ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
>      DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
>     ...
>     ...
>     CR2: 00000000c03ff000
> 
>     Tested-by: Colin Ian King <colin.king@canonical.com>
>     Signed-off-by: Shaohua Li <shaohua.li@intel.com>
> 
> diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
> index b641388..ad47dae 100644
> --- a/arch/x86/power/hibernate_asm_32.S
> +++ b/arch/x86/power/hibernate_asm_32.S
> @@ -27,10 +27,17 @@ ENTRY(swsusp_arch_suspend)
>  	ret
>  
>  ENTRY(restore_image)
> +	movl	mmu_cr4_features, %ecx
>  	movl	resume_pg_dir, %eax
>  	subl	$__PAGE_OFFSET, %eax
>  	movl	%eax, %cr3
>  
> +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> +	andl	$~(X86_CR4_PGE), %ecx
> +	movl	%ecx, %cr4;  # turn off PGE
> +	movl	%cr3, %eax;  # flush TLB
> +	movl	%eax, %cr3
> +1:
>  	movl	restore_pblist, %edx
>  	.p2align 4,,7
>  
> @@ -54,16 +61,8 @@ done:
>  	movl	$swapper_pg_dir, %eax
>  	subl	$__PAGE_OFFSET, %eax
>  	movl	%eax, %cr3
> -	/* Flush TLB, including "global" things (vmalloc) */
>  	movl	mmu_cr4_features, %ecx
>  	jecxz	1f	# cr4 Pentium and higher, skip if zero
> -	movl	%ecx, %edx
> -	andl	$~(X86_CR4_PGE), %edx
> -	movl	%edx, %cr4;  # turn off PGE
> -1:
> -	movl	%cr3, %eax;  # flush TLB
> -	movl	%eax, %cr3

Now that's too much removed.  We actually _want_ to do the TLB flush here,
but not unset PGE, because it's been unset already.

So, the above two lines should not be removed.

Also, I'd remove the first jecxz and keep the second one.

> -	jecxz	1f	# cr4 Pentium and higher, skip if zero
>  	movl	%ecx, %cr4;  # turn PGE back on
>  1:

Rafael

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] i386: do a global tlb flush in S4 resume
  2010-03-05 20:55         ` Rafael J. Wysocki
@ 2010-03-06 21:54           ` Rafael J. Wysocki
  2010-03-06 23:17             ` H. Peter Anvin
  0 siblings, 1 reply; 11+ messages in thread
From: Rafael J. Wysocki @ 2010-03-06 21:54 UTC (permalink / raw)
  To: Shaohua Li, H. Peter Anvin; +Cc: linux-kernel, mingo, colin.king

On Friday 05 March 2010, Rafael J. Wysocki wrote:
> On Friday 05 March 2010, Shaohua Li wrote:
> > On Fri, Mar 05, 2010 at 03:49:46AM +0800, Rafael J. Wysocki wrote:
> > > On Thursday 04 March 2010, Shaohua Li wrote:
> ...
> > > 
> > > In that case please also remove the turning GPE off down the road.
> > 
> >     i386: do a global tlb flush in S4 resume
> > 
> >     Colin reported a strange oops in S4 resume code path (see below). The test
> >     system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
> >     The oops always happen a virtual address 0xc03ff000, which is mapped to the
> >     last 4k of first 4M memory. Doing a global tlb flush fixes the issue.
> > 
> >     EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
> >     EIP is at copy_loop+0xe/0x15
> >     EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
> >     ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
> >      DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
> >     ...
> >     ...
> >     CR2: 00000000c03ff000
> > 
> >     Tested-by: Colin Ian King <colin.king@canonical.com>
> >     Signed-off-by: Shaohua Li <shaohua.li@intel.com>
> > 
> > diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
> > index b641388..ad47dae 100644
> > --- a/arch/x86/power/hibernate_asm_32.S
> > +++ b/arch/x86/power/hibernate_asm_32.S
> > @@ -27,10 +27,17 @@ ENTRY(swsusp_arch_suspend)
> >  	ret
> >  
> >  ENTRY(restore_image)
> > +	movl	mmu_cr4_features, %ecx
> >  	movl	resume_pg_dir, %eax
> >  	subl	$__PAGE_OFFSET, %eax
> >  	movl	%eax, %cr3
> >  
> > +	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > +	andl	$~(X86_CR4_PGE), %ecx
> > +	movl	%ecx, %cr4;  # turn off PGE
> > +	movl	%cr3, %eax;  # flush TLB
> > +	movl	%eax, %cr3
> > +1:
> >  	movl	restore_pblist, %edx
> >  	.p2align 4,,7
> >  
> > @@ -54,16 +61,8 @@ done:
> >  	movl	$swapper_pg_dir, %eax
> >  	subl	$__PAGE_OFFSET, %eax
> >  	movl	%eax, %cr3
> > -	/* Flush TLB, including "global" things (vmalloc) */
> >  	movl	mmu_cr4_features, %ecx
> >  	jecxz	1f	# cr4 Pentium and higher, skip if zero
> > -	movl	%ecx, %edx
> > -	andl	$~(X86_CR4_PGE), %edx
> > -	movl	%edx, %cr4;  # turn off PGE
> > -1:
> > -	movl	%cr3, %eax;  # flush TLB
> > -	movl	%eax, %cr3
> 
> Now that's too much removed.  We actually _want_ to do the TLB flush here,
> but not unset PGE, because it's been unset already.
> 
> So, the above two lines should not be removed.
> 
> Also, I'd remove the first jecxz and keep the second one.

Scratch that, the patch is fine, because we load cr3 right before that.
Sorry for the noise.

Acked-by: Rafael J. Wysocki <rjw@sisk.pl>

Peter, are you going to take it or should I handle it?

Rafael

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] i386: do a global tlb flush in S4 resume
  2010-03-06 21:54           ` Rafael J. Wysocki
@ 2010-03-06 23:17             ` H. Peter Anvin
  0 siblings, 0 replies; 11+ messages in thread
From: H. Peter Anvin @ 2010-03-06 23:17 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: Shaohua Li, linux-kernel, mingo, colin.king

On 03/06/2010 01:54 PM, Rafael J. Wysocki wrote:
> 
> Peter, are you going to take it or should I handle it?
> 

I'll take it after -rc1.

	-hpa

-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [tip:x86/urgent] x86-32, resume: do a global tlb flush in S4 resume
  2010-03-05  0:59       ` Shaohua Li
  2010-03-05 20:55         ` Rafael J. Wysocki
@ 2010-03-30 18:42         ` tip-bot for Shaohua Li
  2010-03-30 18:48         ` tip-bot for Shaohua Li
  2 siblings, 0 replies; 11+ messages in thread
From: tip-bot for Shaohua Li @ 2010-03-30 18:42 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, colin.king, shaohua.li, tglx, rjw

Commit-ID:  f1ddc38590a400e19ba67963dac5bc3addc6e14b
Gitweb:     http://git.kernel.org/tip/f1ddc38590a400e19ba67963dac5bc3addc6e14b
Author:     Shaohua Li <shaohua.li@intel.com>
AuthorDate: Fri, 5 Mar 2010 08:59:32 +0800
Committer:  H. Peter Anvin <hpa@zytor.com>
CommitDate: Tue, 30 Mar 2010 10:50:42 -0700

x86-32, resume: do a global tlb flush in S4 resume

Colin King reported a strange oops in S4 resume code path (see below). The test
system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
The oops always happen a virtual address 0xc03ff000, which is mapped to the
last 4k of first 4M memory. Doing a global tlb flush fixes the issue.

EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
EIP is at copy_loop+0xe/0x15
EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
...
...
CR2: 00000000c03ff000

Tested-by: Colin Ian King <colin.king@canonical.com>
Signed-off-by: Shaohua Li <shaohua.li@intel.com>
LKML-Reference: <20100305005932.GA22675@sli10-desk.sh.intel.com>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
---
 arch/x86/power/hibernate_asm_32.S |   15 +++++++--------
 1 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
index b641388..ad47dae 100644
--- a/arch/x86/power/hibernate_asm_32.S
+++ b/arch/x86/power/hibernate_asm_32.S
@@ -27,10 +27,17 @@ ENTRY(swsusp_arch_suspend)
 	ret
 
 ENTRY(restore_image)
+	movl	mmu_cr4_features, %ecx
 	movl	resume_pg_dir, %eax
 	subl	$__PAGE_OFFSET, %eax
 	movl	%eax, %cr3
 
+	jecxz	1f	# cr4 Pentium and higher, skip if zero
+	andl	$~(X86_CR4_PGE), %ecx
+	movl	%ecx, %cr4;  # turn off PGE
+	movl	%cr3, %eax;  # flush TLB
+	movl	%eax, %cr3
+1:
 	movl	restore_pblist, %edx
 	.p2align 4,,7
 
@@ -54,16 +61,8 @@ done:
 	movl	$swapper_pg_dir, %eax
 	subl	$__PAGE_OFFSET, %eax
 	movl	%eax, %cr3
-	/* Flush TLB, including "global" things (vmalloc) */
 	movl	mmu_cr4_features, %ecx
 	jecxz	1f	# cr4 Pentium and higher, skip if zero
-	movl	%ecx, %edx
-	andl	$~(X86_CR4_PGE), %edx
-	movl	%edx, %cr4;  # turn off PGE
-1:
-	movl	%cr3, %eax;  # flush TLB
-	movl	%eax, %cr3
-	jecxz	1f	# cr4 Pentium and higher, skip if zero
 	movl	%ecx, %cr4;  # turn PGE back on
 1:
 

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [tip:x86/urgent] x86-32, resume: do a global tlb flush in S4 resume
  2010-03-05  0:59       ` Shaohua Li
  2010-03-05 20:55         ` Rafael J. Wysocki
  2010-03-30 18:42         ` [tip:x86/urgent] x86-32, resume: " tip-bot for Shaohua Li
@ 2010-03-30 18:48         ` tip-bot for Shaohua Li
  2 siblings, 0 replies; 11+ messages in thread
From: tip-bot for Shaohua Li @ 2010-03-30 18:48 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, stable, colin.king, shaohua.li, tglx, rjw

Commit-ID:  8ae06d223f8203c72104e5c0c4ee49a000aedb42
Gitweb:     http://git.kernel.org/tip/8ae06d223f8203c72104e5c0c4ee49a000aedb42
Author:     Shaohua Li <shaohua.li@intel.com>
AuthorDate: Fri, 5 Mar 2010 08:59:32 +0800
Committer:  H. Peter Anvin <hpa@zytor.com>
CommitDate: Tue, 30 Mar 2010 11:46:02 -0700

x86-32, resume: do a global tlb flush in S4 resume

Colin King reported a strange oops in S4 resume code path (see below). The test
system has i5/i7 CPU. The kernel doesn't open PAE, so 4M page table is used.
The oops always happen a virtual address 0xc03ff000, which is mapped to the
last 4k of first 4M memory. Doing a global tlb flush fixes the issue.

EIP: 0060:[<c0493a01>] EFLAGS: 00010086 CPU: 0
EIP is at copy_loop+0xe/0x15
EAX: 36aeb000 EBX: 00000000 ECX: 00000400 EDX: f55ad46c
ESI: 0f800000 EDI: c03ff000 EBP: f67fbec4 ESP: f67fbea8
DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
...
...
CR2: 00000000c03ff000

Tested-by: Colin Ian King <colin.king@canonical.com>
Signed-off-by: Shaohua Li <shaohua.li@intel.com>
LKML-Reference: <20100305005932.GA22675@sli10-desk.sh.intel.com>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Cc: <stable@kernel.org>
---
 arch/x86/power/hibernate_asm_32.S |   15 +++++++--------
 1 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S
index b641388..ad47dae 100644
--- a/arch/x86/power/hibernate_asm_32.S
+++ b/arch/x86/power/hibernate_asm_32.S
@@ -27,10 +27,17 @@ ENTRY(swsusp_arch_suspend)
 	ret
 
 ENTRY(restore_image)
+	movl	mmu_cr4_features, %ecx
 	movl	resume_pg_dir, %eax
 	subl	$__PAGE_OFFSET, %eax
 	movl	%eax, %cr3
 
+	jecxz	1f	# cr4 Pentium and higher, skip if zero
+	andl	$~(X86_CR4_PGE), %ecx
+	movl	%ecx, %cr4;  # turn off PGE
+	movl	%cr3, %eax;  # flush TLB
+	movl	%eax, %cr3
+1:
 	movl	restore_pblist, %edx
 	.p2align 4,,7
 
@@ -54,16 +61,8 @@ done:
 	movl	$swapper_pg_dir, %eax
 	subl	$__PAGE_OFFSET, %eax
 	movl	%eax, %cr3
-	/* Flush TLB, including "global" things (vmalloc) */
 	movl	mmu_cr4_features, %ecx
 	jecxz	1f	# cr4 Pentium and higher, skip if zero
-	movl	%ecx, %edx
-	andl	$~(X86_CR4_PGE), %edx
-	movl	%edx, %cr4;  # turn off PGE
-1:
-	movl	%cr3, %eax;  # flush TLB
-	movl	%eax, %cr3
-	jecxz	1f	# cr4 Pentium and higher, skip if zero
 	movl	%ecx, %cr4;  # turn PGE back on
 1:
 

^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2010-03-30 18:49 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-03-04  1:23 [PATCH] i386: do a global tlb flush in S4 resume Shaohua Li
2010-03-04  2:30 ` H. Peter Anvin
2010-03-04  2:41   ` Shaohua Li
2010-03-04 19:49     ` Rafael J. Wysocki
2010-03-04 20:11       ` Rafael J. Wysocki
2010-03-05  0:59       ` Shaohua Li
2010-03-05 20:55         ` Rafael J. Wysocki
2010-03-06 21:54           ` Rafael J. Wysocki
2010-03-06 23:17             ` H. Peter Anvin
2010-03-30 18:42         ` [tip:x86/urgent] x86-32, resume: " tip-bot for Shaohua Li
2010-03-30 18:48         ` tip-bot for Shaohua Li

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.