LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* The SMP alternatives code breaks exception fixup?
@ 2008-01-21 20:47 Chuck Ebbert
2008-01-21 21:25 ` Chuck Ebbert
2008-01-22 5:26 ` Andi Kleen
0 siblings, 2 replies; 11+ messages in thread
From: Chuck Ebbert @ 2008-01-21 20:47 UTC (permalink / raw)
To: linux-kernel; +Cc: Ingo Molnar, Gerd Hoffmann
Looking at the oops report from this bug:
[bugzilla] https://bugzilla.redhat.com/show_bug.cgi?id=429412
[oops] https://bugzilla.redhat.com/attachment.cgi?id=292260
It was an unhandled page fault (protection violation.)
I tracked it down to the cmpxchg in this code:
include/asm-x86/futex_32.h::futex_atomic_cmpxchg_inatomic()
__asm__ __volatile__(
"1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n"
" jmp 2b \n"
" .previous \n"
" .section __ex_table, \"a\" \n"
" .align 8 \n"
" .long 1b,3b \n"
" .previous \n"
There is a fixup, so this should never happen. But the lock instruction
was replaced with a nop by the altinstruction code, and that makes the fixup
address wrong. AFAICT we don't fix up the exception table when we replace
a lock with a nop, which makes the fixup table point to the nop instead
of the cmpxchg instruction and causes us to miss the fixup.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: The SMP alternatives code breaks exception fixup?
2008-01-21 20:47 The SMP alternatives code breaks exception fixup? Chuck Ebbert
@ 2008-01-21 21:25 ` Chuck Ebbert
2008-01-22 5:26 ` Andi Kleen
1 sibling, 0 replies; 11+ messages in thread
From: Chuck Ebbert @ 2008-01-21 21:25 UTC (permalink / raw)
To: Chuck Ebbert; +Cc: linux-kernel, Ingo Molnar, Gerd Hoffmann
On 01/21/2008 03:47 PM, Chuck Ebbert wrote:
> Looking at the oops report from this bug:
>
> [bugzilla] https://bugzilla.redhat.com/show_bug.cgi?id=429412
> [oops] https://bugzilla.redhat.com/attachment.cgi?id=292260
>
> It was an unhandled page fault (protection violation.)
>
> I tracked it down to the cmpxchg in this code:
>
> include/asm-x86/futex_32.h::futex_atomic_cmpxchg_inatomic()
> __asm__ __volatile__(
> "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
> "2: .section .fixup, \"ax\" \n"
> "3: mov %2, %0 \n"
> " jmp 2b \n"
> " .previous \n"
> " .section __ex_table, \"a\" \n"
> " .align 8 \n"
> " .long 1b,3b \n"
> " .previous \n"
>
> There is a fixup, so this should never happen. But the lock instruction
> was replaced with a nop by the altinstruction code, and that makes the fixup
> address wrong. AFAICT we don't fix up the exception table when we replace
> a lock with a nop, which makes the fixup table point to the nop instead
> of the cmpxchg instruction and causes us to miss the fixup.
>
The bug reporter has confirmed that booting with "noreplace-smp" prevents
the kernel oops.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: The SMP alternatives code breaks exception fixup?
2008-01-21 20:47 The SMP alternatives code breaks exception fixup? Chuck Ebbert
2008-01-21 21:25 ` Chuck Ebbert
@ 2008-01-22 5:26 ` Andi Kleen
2008-01-22 12:35 ` Thomas Gleixner
1 sibling, 1 reply; 11+ messages in thread
From: Andi Kleen @ 2008-01-22 5:26 UTC (permalink / raw)
To: Chuck Ebbert; +Cc: linux-kernel, Ingo Molnar, Gerd Hoffmann
Chuck Ebbert <cebbert@redhat.com> writes:
>
> There is a fixup, so this should never happen. But the lock instruction
> was replaced with a nop by the altinstruction code, and that makes the fixup
> address wrong. AFAICT we don't fix up the exception table when we replace
> a lock with a nop, which makes the fixup table point to the nop instead
> of the cmpxchg instruction and causes us to miss the fixup.
Indeed. Nasty issue.
A quick fix would be to add another fixup to handle both cases
I checked the other LOCK_PREFIX users and they look ok.
Does this fix it?
-Andi
(untested)
---
Add exception handlers for both the LOCK and no LOCK prefix
case in futex.
Hopefully fixes https://bugzilla.redhat.com/show_bug.cgi?id=429412
Signed-off-by: Andi Kleen <ak@suse.de>
Index: linux/include/asm-x86/futex.h
===================================================================
--- linux.orig/include/asm-x86/futex.h
+++ linux/include/asm-x86/futex.h
@@ -30,7 +30,7 @@
"1: movl %2, %0\n \
movl %0, %3\n" \
insn "\n" \
-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n \
+"2: " LOCK_PREFIX "\n5: cmpxchgl %3, %2\n \
jnz 1b\n \
3: .section .fixup,\"ax\"\n \
4: mov %5, %1\n \
@@ -38,7 +38,7 @@
.previous\n \
.section __ex_table,\"a\"\n \
.align 8\n" \
- _ASM_PTR "1b,4b,2b,4b\n \
+ _ASM_PTR "1b,4b,2b,4b,5b,4b\n \
.previous" \
: "=&a" (oldval), "=&r" (ret), "+m" (*uaddr), \
"=&r" (tem) \
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: The SMP alternatives code breaks exception fixup?
2008-01-22 5:26 ` Andi Kleen
@ 2008-01-22 12:35 ` Thomas Gleixner
2008-01-22 20:19 ` Chuck Ebbert
0 siblings, 1 reply; 11+ messages in thread
From: Thomas Gleixner @ 2008-01-22 12:35 UTC (permalink / raw)
To: Andi Kleen
Cc: Andrew Morton, Linus Torvalds, Stable Team, Chuck Ebbert,
linux-kernel, Ingo Molnar, Gerd Hoffmann
On Tue, 22 Jan 2008, Andi Kleen wrote:
> Chuck Ebbert <cebbert@redhat.com> writes:
> >
> > There is a fixup, so this should never happen. But the lock instruction
> > was replaced with a nop by the altinstruction code, and that makes the fixup
> > address wrong. AFAICT we don't fix up the exception table when we replace
> > a lock with a nop, which makes the fixup table point to the nop instead
> > of the cmpxchg instruction and causes us to miss the fixup.
>
> Indeed. Nasty issue.
>
> A quick fix would be to add another fixup to handle both cases
Agreed.
> I checked the other LOCK_PREFIX users and they look ok.
Really ?
> Does this fix it?
No it does not. Chuck tracked it down to
include/asm-x86/futex_32.h::futex_atomic_cmpxchg_inatomic()
And your patch is changing: __futex_atomic_op2(). That's fine, because
we need the fixup for both places.
Also your patch is against x86.git and not against mainline. Corrected
version below. x86.git needs a different fixup once this hits
mainline, as it unifies the 32/64bit versions.
That's a long standing bug in both the PI futex and the standard futex
code. Needs to go to stable as well.
Thanks,
tglx
------------->
Subject: x86: fix missing exception entry for SMP alternatives in futex macros
From: Thomas Gleixner <tglx@linutronix.de>
The exception fixup for the futex macros __futex_atomic_op2 and
futex_atomic_cmpxchg_inatomic() is missing an entry when the lock
prefix is replaced by a NOP via SMP alternatives.
Chuck Ebert tracked this down from the information provided in:
https://bugzilla.redhat.com/show_bug.cgi?id=429412
The solution is to add another fixup after the LOCK_PREFIX, so both
the LOCK and NOP case have their own entry in the exception table.
The solution was pointed out by Andi Kleen.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Ingo Molnar <mingo@elte.hu>
---
include/asm-x86/futex_32.h | 8 ++++----
include/asm-x86/futex_64.h | 8 ++++----
2 files changed, 8 insertions(+), 8 deletions(-)
Index: linux-2.6/include/asm-x86/futex_32.h
===================================================================
--- linux-2.6.orig/include/asm-x86/futex_32.h 2008-01-22 13:13:10.000000000 +0100
+++ linux-2.6/include/asm-x86/futex_32.h 2008-01-22 13:13:49.000000000 +0100
@@ -28,7 +28,7 @@
"1: movl %2, %0\n\
movl %0, %3\n" \
insn "\n" \
-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
+"2: " LOCK_PREFIX "\n 5: cmpxchgl %3, %2\n\
jnz 1b\n\
3: .section .fixup,\"ax\"\n\
4: mov %5, %1\n\
@@ -36,7 +36,7 @@
.previous\n\
.section __ex_table,\"a\"\n\
.align 8\n\
- .long 1b,4b,2b,4b\n\
+ .long 1b,4b,2b,4b,5b,4b\n\
.previous" \
: "=&a" (oldval), "=&r" (ret), "+m" (*uaddr), \
"=&r" (tem) \
@@ -111,7 +111,7 @@ futex_atomic_cmpxchg_inatomic(int __user
return -EFAULT;
__asm__ __volatile__(
- "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
+ "1: " LOCK_PREFIX "\n 4: cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n"
@@ -120,7 +120,7 @@ futex_atomic_cmpxchg_inatomic(int __user
" .section __ex_table, \"a\" \n"
" .align 8 \n"
- " .long 1b,3b \n"
+ " .long 1b,3b,4b,3b \n"
" .previous \n"
: "=a" (oldval), "+m" (*uaddr)
Index: linux-2.6/include/asm-x86/futex_64.h
===================================================================
--- linux-2.6.orig/include/asm-x86/futex_64.h 2008-01-22 13:13:10.000000000 +0100
+++ linux-2.6/include/asm-x86/futex_64.h 2008-01-22 13:13:49.000000000 +0100
@@ -27,7 +27,7 @@
"1: movl %2, %0\n\
movl %0, %3\n" \
insn "\n" \
-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
+"2: " LOCK_PREFIX "\n 5: cmpxchgl %3, %2\n\
jnz 1b\n\
3: .section .fixup,\"ax\"\n\
4: mov %5, %1\n\
@@ -35,7 +35,7 @@
.previous\n\
.section __ex_table,\"a\"\n\
.align 8\n\
- .quad 1b,4b,2b,4b\n\
+ .quad 1b,4b,2b,4b,5b,4b\n\
.previous" \
: "=&a" (oldval), "=&r" (ret), "=m" (*uaddr), \
"=&r" (tem) \
@@ -101,7 +101,7 @@ futex_atomic_cmpxchg_inatomic(int __user
return -EFAULT;
__asm__ __volatile__(
- "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
+ "1: " LOCK_PREFIX "\n 4: cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n"
@@ -110,7 +110,7 @@ futex_atomic_cmpxchg_inatomic(int __user
" .section __ex_table, \"a\" \n"
" .align 8 \n"
- " .quad 1b,3b \n"
+ " .quad 1b,3b,4b,3b \n"
" .previous \n"
: "=a" (oldval), "=m" (*uaddr)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: The SMP alternatives code breaks exception fixup?
2008-01-22 12:35 ` Thomas Gleixner
@ 2008-01-22 20:19 ` Chuck Ebbert
2008-02-06 23:10 ` [stable] " Greg KH
0 siblings, 1 reply; 11+ messages in thread
From: Chuck Ebbert @ 2008-01-22 20:19 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Andi Kleen, Andrew Morton, Linus Torvalds, Stable Team,
linux-kernel, Ingo Molnar, Gerd Hoffmann
On 01/22/2008 07:35 AM, Thomas Gleixner wrote:
>
> That's a long standing bug in both the PI futex and the standard futex
> code. Needs to go to stable as well.
>
Here's the 2.6.23 version:
Subject: x86: fix missing exception entry for SMP alternatives in futex macros
From: Thomas Gleixner <tglx@linutronix.de>
The exception fixup for the futex macros __futex_atomic_op2 and
futex_atomic_cmpxchg_inatomic() is missing an entry when the lock
prefix is replaced by a NOP via SMP alternatives.
Chuck Ebert tracked this down from the information provided in:
https://bugzilla.redhat.com/show_bug.cgi?id=429412
The solution is to add another fixup after the LOCK_PREFIX, so both
the LOCK and NOP case have their own entry in the exception table.
The solution was pointed out by Andi Kleen.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Ingo Molnar <mingo@elte.hu>
---
include/asm-i386/futex.h | 8 ++++----
include/asm-x86_64/futex.h | 8 ++++----
2 files changed, 8 insertions(+), 8 deletions(-)
Index: linux-2.6/include/asm-i386/futex.h
===================================================================
--- linux-2.6.orig/include/asm-i386/futex.h 2008-01-22 13:13:10.000000000 +0100
+++ linux-2.6/include/asm-i386/futex.h 2008-01-22 13:13:49.000000000 +0100
@@ -28,7 +28,7 @@
"1: movl %2, %0\n\
movl %0, %3\n" \
insn "\n" \
-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
+"2: " LOCK_PREFIX "\n 5: cmpxchgl %3, %2\n\
jnz 1b\n\
3: .section .fixup,\"ax\"\n\
4: mov %5, %1\n\
@@ -36,7 +36,7 @@
.previous\n\
.section __ex_table,\"a\"\n\
.align 8\n\
- .long 1b,4b,2b,4b\n\
+ .long 1b,4b,2b,4b,5b,4b\n\
.previous" \
: "=&a" (oldval), "=&r" (ret), "+m" (*uaddr), \
"=&r" (tem) \
@@ -111,7 +111,7 @@ futex_atomic_cmpxchg_inatomic(int __user
return -EFAULT;
__asm__ __volatile__(
- "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
+ "1: " LOCK_PREFIX "\n 4: cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n"
@@ -120,7 +120,7 @@ futex_atomic_cmpxchg_inatomic(int __user
" .section __ex_table, \"a\" \n"
" .align 8 \n"
- " .long 1b,3b \n"
+ " .long 1b,3b,4b,3b \n"
" .previous \n"
: "=a" (oldval), "+m" (*uaddr)
Index: linux-2.6/include/asm-x86_64/futex.h
===================================================================
--- linux-2.6.orig/include/asm-x86_64/futex.h 2008-01-22 13:13:10.000000000 +0100
+++ linux-2.6/include/asm-x86_64/futex.h 2008-01-22 13:13:49.000000000 +0100
@@ -27,7 +27,7 @@
"1: movl %2, %0\n\
movl %0, %3\n" \
insn "\n" \
-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
+"2: " LOCK_PREFIX "\n 5: cmpxchgl %3, %2\n\
jnz 1b\n\
3: .section .fixup,\"ax\"\n\
4: mov %5, %1\n\
@@ -35,7 +35,7 @@
.previous\n\
.section __ex_table,\"a\"\n\
.align 8\n\
- .quad 1b,4b,2b,4b\n\
+ .quad 1b,4b,2b,4b,5b,4b\n\
.previous" \
: "=&a" (oldval), "=&r" (ret), "=m" (*uaddr), \
"=&r" (tem) \
@@ -101,7 +101,7 @@ futex_atomic_cmpxchg_inatomic(int __user
return -EFAULT;
__asm__ __volatile__(
- "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
+ "1: " LOCK_PREFIX "\n 4: cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n"
@@ -110,7 +110,7 @@ futex_atomic_cmpxchg_inatomic(int __user
" .section __ex_table, \"a\" \n"
" .align 8 \n"
- " .quad 1b,3b \n"
+ " .quad 1b,3b,4b,3b \n"
" .previous \n"
: "=a" (oldval), "=m" (*uaddr)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [stable] The SMP alternatives code breaks exception fixup?
2008-01-22 20:19 ` Chuck Ebbert
@ 2008-02-06 23:10 ` Greg KH
2008-02-06 23:36 ` Linus Torvalds
2008-02-07 12:16 ` Thomas Gleixner
0 siblings, 2 replies; 11+ messages in thread
From: Greg KH @ 2008-02-06 23:10 UTC (permalink / raw)
To: Chuck Ebbert
Cc: Thomas Gleixner, Ingo Molnar, linux-kernel, Andi Kleen,
Gerd Hoffmann, Andrew Morton, Linus Torvalds, Stable Team
On Tue, Jan 22, 2008 at 03:19:33PM -0500, Chuck Ebbert wrote:
> On 01/22/2008 07:35 AM, Thomas Gleixner wrote:
> >
> > That's a long standing bug in both the PI futex and the standard futex
> > code. Needs to go to stable as well.
> >
>
> Here's the 2.6.23 version:
>
>
> Subject: x86: fix missing exception entry for SMP alternatives in futex macros
> From: Thomas Gleixner <tglx@linutronix.de>
I don't see this in Linus's tree, am I just missing it? Do you have a
git commit id?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [stable] The SMP alternatives code breaks exception fixup?
2008-02-06 23:10 ` [stable] " Greg KH
@ 2008-02-06 23:36 ` Linus Torvalds
2008-02-06 23:43 ` Ingo Molnar
2008-02-07 12:16 ` Thomas Gleixner
1 sibling, 1 reply; 11+ messages in thread
From: Linus Torvalds @ 2008-02-06 23:36 UTC (permalink / raw)
To: Greg KH
Cc: Chuck Ebbert, Thomas Gleixner, Ingo Molnar, linux-kernel,
Andi Kleen, Gerd Hoffmann, Andrew Morton, Stable Team
On Wed, 6 Feb 2008, Greg KH wrote:
>
> I don't see this in Linus's tree, am I just missing it? Do you have a
> git commit id?
Isn't this 9d55b9923a1b7ea8193b8875c57ec940dc2ff027 (possibly with
2532ec6d178abc55681d049097d3dc577eaa266c on top)?
Linus
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [stable] The SMP alternatives code breaks exception fixup?
2008-02-06 23:36 ` Linus Torvalds
@ 2008-02-06 23:43 ` Ingo Molnar
2008-02-07 0:00 ` Greg KH
2008-02-07 6:55 ` Greg KH
0 siblings, 2 replies; 11+ messages in thread
From: Ingo Molnar @ 2008-02-06 23:43 UTC (permalink / raw)
To: Linus Torvalds
Cc: Greg KH, Chuck Ebbert, Thomas Gleixner, linux-kernel, Andi Kleen,
Gerd Hoffmann, Andrew Morton, Stable Team
* Linus Torvalds <torvalds@linux-foundation.org> wrote:
> > I don't see this in Linus's tree, am I just missing it? Do you have
> > a git commit id?
>
> Isn't this 9d55b9923a1b7ea8193b8875c57ec940dc2ff027 (possibly with
> 2532ec6d178abc55681d049097d3dc577eaa266c on top)?
yeah.
Greg: note that this is against post-unification asm-x86/futex.h so it
wont apply to .24.
I've backported the fix to .24 - find it below. (untested but obvious)
Ingo
----------------------->
Subject: x86: replace LOCK_PREFIX in futex.h
From: Thomas Gleixner <tglx@linutronix.de>
The exception fixup for the futex macros __futex_atomic_op1/2 and
futex_atomic_cmpxchg_inatomic() is missing an entry when the lock
prefix is replaced by a NOP via SMP alternatives.
Chuck Ebert tracked this down from the information provided in:
https://bugzilla.redhat.com/show_bug.cgi?id=429412
A possible solution would be to add another fixup after the
LOCK_PREFIX, so both the LOCK and NOP case have their own entry in the
exception table, but it's not really worth the trouble.
Simply replace LOCK_PREFIX with lock and keep those untouched by SMP
alternatives.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
include/asm-x86/futex_32.h | 6 +++---
include/asm-x86/futex_64.h | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
Index: linux-2.6.24/include/asm-x86/futex_32.h
===================================================================
--- linux-2.6.24.orig/include/asm-x86/futex_32.h
+++ linux-2.6.24/include/asm-x86/futex_32.h
@@ -28,7 +28,7 @@
"1: movl %2, %0\n\
movl %0, %3\n" \
insn "\n" \
-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
+"2: lock; cmpxchgl %3, %2\n \
jnz 1b\n\
3: .section .fixup,\"ax\"\n\
4: mov %5, %1\n\
@@ -68,7 +68,7 @@ futex_atomic_op_inuser (int encoded_op,
#endif
switch (op) {
case FUTEX_OP_ADD:
- __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret,
+ __futex_atomic_op1("lock; xaddl %0, %2", ret, oldval,
oldval, uaddr, oparg);
break;
case FUTEX_OP_OR:
@@ -111,8 +111,8 @@ futex_atomic_cmpxchg_inatomic(int __user
return -EFAULT;
__asm__ __volatile__(
- "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
+ "1: lock; cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n"
" jmp 2b \n"
Index: linux-2.6.24/include/asm-x86/futex_64.h
===================================================================
--- linux-2.6.24.orig/include/asm-x86/futex_64.h
+++ linux-2.6.24/include/asm-x86/futex_64.h
@@ -27,7 +27,7 @@
"1: movl %2, %0\n\
movl %0, %3\n" \
insn "\n" \
-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
+"2: lock; cmpxchgl %3, %2\n \
jnz 1b\n\
3: .section .fixup,\"ax\"\n\
4: mov %5, %1\n\
@@ -62,7 +62,7 @@ futex_atomic_op_inuser (int encoded_op,
__futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg);
break;
case FUTEX_OP_ADD:
- __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret, oldval,
+ __futex_atomic_op1("lock; xaddl %0, %2", ret, oldval,
uaddr, oparg);
break;
case FUTEX_OP_OR:
@@ -101,8 +101,8 @@ futex_atomic_cmpxchg_inatomic(int __user
return -EFAULT;
__asm__ __volatile__(
- "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
+ "1: lock; cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n"
" jmp 2b \n"
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [stable] The SMP alternatives code breaks exception fixup?
2008-02-06 23:43 ` Ingo Molnar
@ 2008-02-07 0:00 ` Greg KH
2008-02-07 6:55 ` Greg KH
1 sibling, 0 replies; 11+ messages in thread
From: Greg KH @ 2008-02-07 0:00 UTC (permalink / raw)
To: Ingo Molnar
Cc: Linus Torvalds, Chuck Ebbert, Thomas Gleixner, linux-kernel,
Andi Kleen, Gerd Hoffmann, Andrew Morton, Stable Team
On Thu, Feb 07, 2008 at 12:43:09AM +0100, Ingo Molnar wrote:
>
> * Linus Torvalds <torvalds@linux-foundation.org> wrote:
>
> > > I don't see this in Linus's tree, am I just missing it? Do you have
> > > a git commit id?
> >
> > Isn't this 9d55b9923a1b7ea8193b8875c57ec940dc2ff027 (possibly with
> > 2532ec6d178abc55681d049097d3dc577eaa266c on top)?
>
> yeah.
>
> Greg: note that this is against post-unification asm-x86/futex.h so it
> wont apply to .24.
>
> I've backported the fix to .24 - find it below. (untested but obvious)
Thanks for the fix, I'm guessing that this should only go into
.24-stable and nothing prior?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [stable] The SMP alternatives code breaks exception fixup?
2008-02-06 23:43 ` Ingo Molnar
2008-02-07 0:00 ` Greg KH
@ 2008-02-07 6:55 ` Greg KH
1 sibling, 0 replies; 11+ messages in thread
From: Greg KH @ 2008-02-07 6:55 UTC (permalink / raw)
To: Ingo Molnar
Cc: Linus Torvalds, Chuck Ebbert, Thomas Gleixner, linux-kernel,
Andi Kleen, Gerd Hoffmann, Andrew Morton, Stable Team
On Thu, Feb 07, 2008 at 12:43:09AM +0100, Ingo Molnar wrote:
>
> * Linus Torvalds <torvalds@linux-foundation.org> wrote:
>
> > > I don't see this in Linus's tree, am I just missing it? Do you have
> > > a git commit id?
> >
> > Isn't this 9d55b9923a1b7ea8193b8875c57ec940dc2ff027 (possibly with
> > 2532ec6d178abc55681d049097d3dc577eaa266c on top)?
>
> yeah.
>
> Greg: note that this is against post-unification asm-x86/futex.h so it
> wont apply to .24.
>
> I've backported the fix to .24 - find it below. (untested but obvious)
unfortunatly it doesn't even compile:
distcc[30740] ERROR: compile (null) on localhost failed
In file included from include/asm/futex.h:2,
from kernel/futex.c:59:
include/asm/futex_32.h:72:29: error: macro "__futex_atomic_op1" passed 6 arguments, but takes just 5
In file included from include/asm/futex.h:2,
from kernel/futex.c:59:
include/asm/futex_32.h: In function 'futex_atomic_op_inuser':
include/asm/futex_32.h:71: error: '__futex_atomic_op1' undeclared (first use in this function)
include/asm/futex_32.h:71: error: (Each undeclared identifier is reported only once
include/asm/futex_32.h:71: error: for each function it appears in.)
distcc[30739] ERROR: compile kernel/futex.c on localhost failed
make[1]: *** [kernel/futex.o] Error 1
Care to try again? :)
thanks,
greg k-h
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [stable] The SMP alternatives code breaks exception fixup?
2008-02-06 23:10 ` [stable] " Greg KH
2008-02-06 23:36 ` Linus Torvalds
@ 2008-02-07 12:16 ` Thomas Gleixner
1 sibling, 0 replies; 11+ messages in thread
From: Thomas Gleixner @ 2008-02-07 12:16 UTC (permalink / raw)
To: Greg KH
Cc: Chuck Ebbert, Ingo Molnar, linux-kernel, Andi Kleen,
Gerd Hoffmann, Andrew Morton, Linus Torvalds, Stable Team
[-- Attachment #1: Type: TEXT/PLAIN, Size: 1017 bytes --]
On Wed, 6 Feb 2008, Greg KH wrote:
> On Tue, Jan 22, 2008 at 03:19:33PM -0500, Chuck Ebbert wrote:
> > On 01/22/2008 07:35 AM, Thomas Gleixner wrote:
> > >
> > > That's a long standing bug in both the PI futex and the standard futex
> > > code. Needs to go to stable as well.
> > >
> >
> > Here's the 2.6.23 version:
> >
> >
> > Subject: x86: fix missing exception entry for SMP alternatives in futex macros
> > From: Thomas Gleixner <tglx@linutronix.de>
>
> I don't see this in Linus's tree, am I just missing it? Do you have a
> git commit id?
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=9d55b9923a1b7ea8193b8875c57ec940dc2ff027
I did a simpler version by just replacing LOCK_PREFIX with lock. The
reason is, that we would need a separate implementation for
__futex_atomic_op1() as well, due to:
case FUTEX_OP_ADD:
__futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret, oldval,
And it's not really worth the trouble.
Backport to 2.6.24 and 2.6.23 attached.
Thanks,
tglx
[-- Attachment #2: Type: TEXT/PLAIN, Size: 2973 bytes --]
Subject: x86: replace LOCK_PREFIX in futex.h
From: Thomas Gleixner <tglx@linutronix.de>
Date: Thu, 07 Feb 2008 13:05:19 +0100
The exception fixup for the futex macros __futex_atomic_op1/2 and
futex_atomic_cmpxchg_inatomic() is missing an entry when the lock
prefix is replaced by a NOP via SMP alternatives.
Chuck Ebert tracked this down from the information provided in:
https://bugzilla.redhat.com/show_bug.cgi?id=429412
A possible solution would be to add another fixup after the
LOCK_PREFIX, so both the LOCK and NOP case have their own entry in the
exception table, but it's not really worth the trouble.
Simply replace LOCK_PREFIX with lock and keep those untouched by SMP
alternatives.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Index: linux-2.6.23/include/asm-i386/futex.h
===================================================================
--- linux-2.6.23.orig/include/asm-i386/futex.h 2008-02-07 13:08:03.000000000 +0100
+++ linux-2.6.23/include/asm-i386/futex.h 2008-02-07 13:09:39.000000000 +0100
@@ -28,7 +28,7 @@
"1: movl %2, %0\n\
movl %0, %3\n" \
insn "\n" \
-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
+"2: lock cmpxchgl %3, %2\n\
jnz 1b\n\
3: .section .fixup,\"ax\"\n\
4: mov %5, %1\n\
@@ -68,7 +68,7 @@ futex_atomic_op_inuser (int encoded_op,
#endif
switch (op) {
case FUTEX_OP_ADD:
- __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret,
+ __futex_atomic_op1("lock xaddl %0, %2", ret,
oldval, uaddr, oparg);
break;
case FUTEX_OP_OR:
@@ -111,7 +111,7 @@ futex_atomic_cmpxchg_inatomic(int __user
return -EFAULT;
__asm__ __volatile__(
- "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
+ "1: lock cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n"
Index: linux-2.6.23/include/asm-x86_64/futex.h
===================================================================
--- linux-2.6.23.orig/include/asm-x86_64/futex.h 2008-02-07 13:08:03.000000000 +0100
+++ linux-2.6.23/include/asm-x86_64/futex.h 2008-02-07 13:09:39.000000000 +0100
@@ -27,7 +27,7 @@
"1: movl %2, %0\n\
movl %0, %3\n" \
insn "\n" \
-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
+"2: "lock cmpxchgl %3, %2\n\
jnz 1b\n\
3: .section .fixup,\"ax\"\n\
4: mov %5, %1\n\
@@ -62,7 +62,7 @@ futex_atomic_op_inuser (int encoded_op,
__futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg);
break;
case FUTEX_OP_ADD:
- __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret, oldval,
+ __futex_atomic_op1("lock xaddl %0, %2", ret, oldval,
uaddr, oparg);
break;
case FUTEX_OP_OR:
@@ -101,7 +101,7 @@ futex_atomic_cmpxchg_inatomic(int __user
return -EFAULT;
__asm__ __volatile__(
- "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
+ "1: lock cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n"
[-- Attachment #3: Type: TEXT/PLAIN, Size: 2913 bytes --]
Subject: x86: replace LOCK_PREFIX in futex.h
From: Thomas Gleixner <tglx@linutronix.de>
Date: Thu, 07 Feb 2008 13:06:02 +0100
The exception fixup for the futex macros __futex_atomic_op1/2 and
futex_atomic_cmpxchg_inatomic() is missing an entry when the lock
prefix is replaced by a NOP via SMP alternatives.
Chuck Ebert tracked this down from the information provided in:
https://bugzilla.redhat.com/show_bug.cgi?id=429412
A possible solution would be to add another fixup after the
LOCK_PREFIX, so both the LOCK and NOP case have their own entry in the
exception table, but it's not really worth the trouble.
Simply replace LOCK_PREFIX with lock and keep those untouched by SMP
alternatives.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Index: linux-2.6.24/include/asm-x86/futex_32.h
===================================================================
--- linux-2.6.24.orig/include/asm-x86/futex_32.h 2008-02-07 13:05:39.000000000 +0100
+++ linux-2.6.24/include/asm-x86/futex_32.h 2008-02-07 13:07:20.000000000 +0100
@@ -28,7 +28,7 @@
"1: movl %2, %0\n\
movl %0, %3\n" \
insn "\n" \
-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
+"2: lock cmpxchgl %3, %2\n\
jnz 1b\n\
3: .section .fixup,\"ax\"\n\
4: mov %5, %1\n\
@@ -68,7 +68,7 @@ futex_atomic_op_inuser (int encoded_op,
#endif
switch (op) {
case FUTEX_OP_ADD:
- __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret,
+ __futex_atomic_op1("lock xaddl %0, %2", ret,
oldval, uaddr, oparg);
break;
case FUTEX_OP_OR:
@@ -111,7 +111,7 @@ futex_atomic_cmpxchg_inatomic(int __user
return -EFAULT;
__asm__ __volatile__(
- "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
+ "1: lock cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n"
Index: linux-2.6.24/include/asm-x86/futex_64.h
===================================================================
--- linux-2.6.24.orig/include/asm-x86/futex_64.h 2008-02-07 13:05:39.000000000 +0100
+++ linux-2.6.24/include/asm-x86/futex_64.h 2008-02-07 13:06:45.000000000 +0100
@@ -27,7 +27,7 @@
"1: movl %2, %0\n\
movl %0, %3\n" \
insn "\n" \
-"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\
+"2: "lock cmpxchgl %3, %2\n\
jnz 1b\n\
3: .section .fixup,\"ax\"\n\
4: mov %5, %1\n\
@@ -62,7 +62,7 @@ futex_atomic_op_inuser (int encoded_op,
__futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg);
break;
case FUTEX_OP_ADD:
- __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret, oldval,
+ __futex_atomic_op1("lock xaddl %0, %2", ret, oldval,
uaddr, oparg);
break;
case FUTEX_OP_OR:
@@ -101,7 +101,7 @@ futex_atomic_cmpxchg_inatomic(int __user
return -EFAULT;
__asm__ __volatile__(
- "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
+ "1: lock cmpxchgl %3, %1 \n"
"2: .section .fixup, \"ax\" \n"
"3: mov %2, %0 \n"
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2008-02-07 12:17 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-01-21 20:47 The SMP alternatives code breaks exception fixup? Chuck Ebbert
2008-01-21 21:25 ` Chuck Ebbert
2008-01-22 5:26 ` Andi Kleen
2008-01-22 12:35 ` Thomas Gleixner
2008-01-22 20:19 ` Chuck Ebbert
2008-02-06 23:10 ` [stable] " Greg KH
2008-02-06 23:36 ` Linus Torvalds
2008-02-06 23:43 ` Ingo Molnar
2008-02-07 0:00 ` Greg KH
2008-02-07 6:55 ` Greg KH
2008-02-07 12:16 ` Thomas Gleixner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).