* next: Crashes in x86 images due to 'locking/rwsem, x86: Clean up ____down_write()'
@ 2016-05-12 13:34 Guenter Roeck
2016-05-12 13:51 ` Borislav Petkov
0 siblings, 1 reply; 8+ messages in thread
From: Guenter Roeck @ 2016-05-12 13:34 UTC (permalink / raw)
To: Borislav Petkov, linux-next@vger.kernel.org,
linux-kernel@vger.kernel.org
Borislav,
your patch 'locking/rwsem, x86: Clean up ____down_write()' causes various
crashes in x86 qemu tests.
BUG: unable to handle kernel paging request at 80000015
IP: [<c1846353>] down_write+0x23/0x30
Call Trace:
[<c1374cd5>] crypto_larval_kill+0x15/0x70
[<c13761c6>] crypto_wait_for_test+0x46/0x70
[<c137660c>] crypto_register_alg+0x5c/0x70
[<c1376655>] crypto_register_algs+0x35/0x80
[<c1c1e815>] ? hmac_module_init+0xf/0xf
[<c1c1e828>] crypto_null_mod_init+0x13/0x41
[<c100047b>] do_one_initcall+0x3b/0x150
[ ... ]
BUG: unable to handle kernel paging request at 80000015
IP: [<c1848e43>] down_write+0x23/0x30
Call Trace:
[<c10530d5>] copy_process.part.52+0xba5/0x15c0
[<c184a458>] ? _raw_spin_unlock_bh+0x18/0x20
[<c1053c9d>] _do_fork+0xcd/0x380
[<c105403c>] SyS_clone+0x2c/0x30
[<c100174a>] do_int80_syscall_32+0x5a/0xa0
[<c184ac5e>] entry_INT80_32+0x2a/0x2a
BUG: unable to handle kernel paging request at 80000015
IP: [<c1848e43>] down_write+0x23/0x30
Call Trace:
[<c1155f30>] unlink_file_vma+0x30/0x50
[<c1150ed3>] free_pgtables+0x33/0xc0
[<c115719e>] exit_mmap+0x8e/0xe0
[<c105220b>] mmput+0x2b/0xa0
[<c117f452>] flush_old_exec+0x312/0x650
[<c11c3c0d>] load_elf_binary+0x2ad/0x1080
[<c114f00c>] ? __get_user_pages+0x3c/0x60
[<c114f08f>] ? get_user_pages_remote+0x5f/0x70
[<c13c6a11>] ? _copy_from_user+0x31/0x50
[<c117f00c>] search_binary_handler+0x7c/0x1b0
[<c118059b>] do_execveat_common+0x4bb/0x650
[<c1180754>] do_execve+0x24/0x30
[<c118094b>] SyS_execve+0x1b/0x20
[<c100174a>] do_int80_syscall_32+0x5a/0xa0
[<c184ac5e>] entry_INT80_32+0x2a/0x2a
Reverting the patch fixes the problem.
Complete logs are available at http://kerneltests.org/builders/qemu-x86-next.
Scripts, configuration, and root file system used are available at
https://github.com/groeck/linux-build-test/tree/master/rootfs/x86
Bisect log is attached.
Guenter
---
Bisect log:
# bad: [13425f1bf7f9f28fcef53057303319d5afb907f7] Add linux-next specific files for 20160511
# good: [44549e8f5eea4e0a41b487b63e616cb089922b99] Linux 4.6-rc7
git bisect start 'HEAD' 'v4.6-rc7'
# good: [b6cf27d48f370bf2d42888921632ae05340aaca9] Merge remote-tracking branch 'crypto/master'
git bisect good b6cf27d48f370bf2d42888921632ae05340aaca9
# bad: [607563e7793b7c4f3ab134dc200552a555ca5cb2] Merge remote-tracking branch 'tip/auto-latest'
git bisect bad 607563e7793b7c4f3ab134dc200552a555ca5cb2
# good: [05454bc3dd6d8c4cff684ea881d79db952030075] Merge remote-tracking branch 'block/for-next'
git bisect good 05454bc3dd6d8c4cff684ea881d79db952030075
# good: [3ed15da0d55d9147f6434fe57db60a5b4059cbfd] Merge remote-tracking branch 'spi/for-next'
git bisect good 3ed15da0d55d9147f6434fe57db60a5b4059cbfd
# bad: [25ea4e608611c03ad9829a727f6cc198db952d06] Merge branch 'perf/core'
git bisect bad 25ea4e608611c03ad9829a727f6cc198db952d06
# good: [f127fa098d76444c7a47b2f009356979492d77cd] perf/x86/intel/pt: Add IP filtering register/CPUID bits
git bisect good f127fa098d76444c7a47b2f009356979492d77cd
# good: [13a00bc35b2a9f8b750a292dcc84111bdfb1edd4] Merge branch 'efi/core'
git bisect good 13a00bc35b2a9f8b750a292dcc84111bdfb1edd4
# bad: [0b749d9316aa32dc3fe67d7c0b4fb650873709aa] Merge branch 'locking/rwsem'
git bisect bad 0b749d9316aa32dc3fe67d7c0b4fb650873709aa
# good: [a1cc5bcfcfca0b99f009b117785142dbdc3b87a3] locking/atomics: Flip atomic_fetch_or() arguments
git bisect good a1cc5bcfcfca0b99f009b117785142dbdc3b87a3
# good: [00fb16e26ac8559e69c3bb14284f4a548d28ee0d] locking/rwsem, x86: Add frame annotation for call_rwsem_down_write_failed_killable()
git bisect good 00fb16e26ac8559e69c3bb14284f4a548d28ee0d
# good: [e3825ba1af3a27d7522c9f5f929f5a13b8b138ae] irqchip/gic-v3: Add support for partitioned PPIs
git bisect good e3825ba1af3a27d7522c9f5f929f5a13b8b138ae
# good: [5e4c588054d52d1b25633c6074c5f3c6228e26ed] Merge branch 'irq/core'
git bisect good 5e4c588054d52d1b25633c6074c5f3c6228e26ed
# bad: [71c01930b42e5dd65d4820dea116bcbe95a0b768] locking/rwsem, x86: Clean up ____down_write()
git bisect bad 71c01930b42e5dd65d4820dea116bcbe95a0b768
# first bad commit: [71c01930b42e5dd65d4820dea116bcbe95a0b768] locking/rwsem, x86: Clean up ____down_write()
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: next: Crashes in x86 images due to 'locking/rwsem, x86: Clean up ____down_write()'
2016-05-12 13:34 next: Crashes in x86 images due to 'locking/rwsem, x86: Clean up ____down_write()' Guenter Roeck
@ 2016-05-12 13:51 ` Borislav Petkov
2016-05-12 14:46 ` Borislav Petkov
0 siblings, 1 reply; 8+ messages in thread
From: Borislav Petkov @ 2016-05-12 13:51 UTC (permalink / raw)
To: Guenter Roeck, Ingo Molnar
Cc: linux-next@vger.kernel.org, linux-kernel@vger.kernel.org
On Thu, May 12, 2016 at 06:34:29AM -0700, Guenter Roeck wrote:
> Borislav,
>
> your patch 'locking/rwsem, x86: Clean up ____down_write()' causes various
> crashes in x86 qemu tests.
Thanks for the report, let me take a look.
@Ingo: can you please back this one out of the lineup for the merge
window until I've sorted out the issue?
Thanks.
--
Regards/Gruss,
Boris.
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg)
--
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: next: Crashes in x86 images due to 'locking/rwsem, x86: Clean up ____down_write()'
2016-05-12 13:51 ` Borislav Petkov
@ 2016-05-12 14:46 ` Borislav Petkov
2016-05-12 17:29 ` [PATCH] x86/rwsem: Save and restore all callee-clobbered regs in 32-bit ____down_write() Borislav Petkov
0 siblings, 1 reply; 8+ messages in thread
From: Borislav Petkov @ 2016-05-12 14:46 UTC (permalink / raw)
To: Guenter Roeck, Ingo Molnar, Peter Zijlstra
Cc: linux-next@vger.kernel.org, linux-kernel@vger.kernel.org
On Thu, May 12, 2016 at 03:51:31PM +0200, Borislav Petkov wrote:
> On Thu, May 12, 2016 at 06:34:29AM -0700, Guenter Roeck wrote:
> > Borislav,
> >
> > your patch 'locking/rwsem, x86: Clean up ____down_write()' causes various
> > crashes in x86 qemu tests.
>
> Thanks for the report, let me take a look.
>
> @Ingo: can you please back this one out of the lineup for the merge
> window until I've sorted out the issue?
Ok, I was able to reproduce:
BUG: unable to handle kernel NULL pointer dereference at 00000015
IP: [<c185e094>] down_write+0x24/0x30
*pde = 00000000
Oops: 0002 [#1] PREEMPT SMP
Modules linked in:
CPU: 0 PID: 1 Comm: swapper/0 Tainted: G S W 4.6.0-rc7-next-20160511-yocto-standard #1
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.7.5-20140531_083030-gandalf 04/01/2014
task: f4d00000 ti: f4d08000 task.ti: f4d08000
EIP: 0060:[<c185e094>] EFLAGS: 00210282 CPU: 0
EIP is at down_write+0x24/0x30
EAX: f4d00000 EBX: f4f6d600 ECX: ffff0001 EDX: 00000001
ESI: 00000168 EDI: c1c2eb68 EBP: f4d09ef4 ESP: f4d09eec
DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
CR0: 80050033 CR2: 00000015 CR3: 01ccb000 CR4: 000406d0
We fault here:
c185e070 <down_write>:
c185e070: 55 push %ebp
c185e071: 89 e5 mov %esp,%ebp
c185e073: e8 20 2b 00 00 call c1860b98 <mcount>
c185e078: b9 01 00 ff ff mov $0xffff0001,%ecx
c185e07d: 89 c2 mov %eax,%edx
c185e07f: f0 0f c1 08 lock xadd %ecx,(%eax)
c185e083: 66 85 c9 test %cx,%cx
c185e086: 74 05 je c185e08d <down_write+0x1d>
c185e088: e8 f7 31 b7 ff call c13d1284 <call_rwsem_down_write_failed>
c185e08d: 64 a1 48 59 cb c1 mov %fs:0xc1cb5948,%eax
c185e093: 5d pop %ebp
c185e094: 89 42 14 mov %eax,0x14(%edx) <--- HERE
c185e097: c3 ret
c185e098: 90 nop
c185e099: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi
and %edx is 1 (+ 0x14 gives the 00000015 deref addr).
But edx should contain sem. The code does:
.loc 1 47 0
movl %eax, %edx # sem, sem
lock; xadd %ecx,(%eax) # tmp91, sem
call call_rwsem_down_write_failed
mov %eax,0x14(%edx)
and if something in that call clobbers %edx, boom! Now I need to think
about how to make gcc reload sem after
LOCK_CONTENDED(sem, __down_write_trylock, __down_write);
for
rwsem_set_owner(sem);
Btw, the hunk below seems to fix it. And the comment above those
{save,restore}_common_regs talk about "Save the C-clobbered registers
(%eax, %edx and %ecx)" but the only reg we're stashing is ecx.
Why aren't we stashing edx too?
Ingo, Peter?
---
diff --git a/arch/x86/lib/rwsem.S b/arch/x86/lib/rwsem.S
index a37462a23546..02240807e97a 100644
--- a/arch/x86/lib/rwsem.S
+++ b/arch/x86/lib/rwsem.S
@@ -33,10 +33,12 @@
* value or just clobbered..
*/
-#define save_common_regs \
- pushl %ecx
+#define save_common_regs \
+ pushl %ecx; \
+ pushl %edx
-#define restore_common_regs \
+#define restore_common_regs \
+ popl %edx; \
popl %ecx
/* Avoid uglifying the argument copying x86-64 needs to do. */
--
Regards/Gruss,
Boris.
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg)
--
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH] x86/rwsem: Save and restore all callee-clobbered regs in 32-bit ____down_write()
2016-05-12 14:46 ` Borislav Petkov
@ 2016-05-12 17:29 ` Borislav Petkov
2016-05-13 2:49 ` Guenter Roeck
2016-05-13 17:03 ` Linus Torvalds
0 siblings, 2 replies; 8+ messages in thread
From: Borislav Petkov @ 2016-05-12 17:29 UTC (permalink / raw)
To: Guenter Roeck, Ingo Molnar, Peter Zijlstra
Cc: linux-next@vger.kernel.org, linux-kernel@vger.kernel.org
Anyway, here's an actual patch with a commit message. Guenter, can you
give it a run please?
It does fix the issue here with your .config but I'd appreciate a
confirmation.
Thanks.
---
From: Borislav Petkov <bp@suse.de>
____down_write() calls a function to handle the slow path when the lock
is contended. But in order to be able to call a C function, one has to
stash all callee-clobbered registers. The 32-bit path saves only %ecx
for a reason unknown to me. However, after
71c01930b42e ("locking/rwsem, x86: Clean up ____down_write()")
the useless dependency on edx was removed and this caused the following
splat:
BUG: unable to handle kernel NULL pointer dereference at 00000015
IP: [<c185e094>] down_write+0x24/0x30
*pde = 00000000
Oops: 0002 [#1] PREEMPT SMP
Modules linked in:
CPU: 0 PID: 1 Comm: swapper/0 Tainted: G S W 4.6.0-rc7-next-20160511-yocto-standard #1
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.7.5-20140531_083030-gandalf 04/01/2014
task: f4d00000 ti: f4d08000 task.ti: f4d08000
EIP: 0060:[<c185e094>] EFLAGS: 00210282 CPU: 0
EIP is at down_write+0x24/0x30
EAX: f4d00000 EBX: f4f6d600 ECX: ffff0001 EDX: 00000001
ESI: 00000168 EDI: c1c2eb68 EBP: f4d09ef4 ESP: f4d09eec
DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
CR0: 80050033 CR2: 00000015 CR3: 01ccb000 CR4: 000406d0
This happens because gcc decided to stash the pointer to @sem in edx (it
is not used in the inline asm anymore, thus free):
movl %eax, %edx # sem, sem
lock; xadd %ecx,(%eax) # tmp91, sem
test ...
call call_rwsem_down_write_failed
mov %eax,0x14(%edx)
*before* the slow path happens and if we hit it on 32-bit, it can
clobber edx and we're staring at garbage value at deref time.
The simple fix is to save/restore edx too, around the slow path. We
don't need to stash eax because it is used in the slow path as the @sem
arg.
Reported-by: Guenter Roeck <linux@roeck-us.net>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: x86@kernel.org
Signed-off-by: Borislav Petkov <bp@suse.de>
---
arch/x86/lib/rwsem.S | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/arch/x86/lib/rwsem.S b/arch/x86/lib/rwsem.S
index a37462a23546..02240807e97a 100644
--- a/arch/x86/lib/rwsem.S
+++ b/arch/x86/lib/rwsem.S
@@ -33,10 +33,12 @@
* value or just clobbered..
*/
-#define save_common_regs \
- pushl %ecx
+#define save_common_regs \
+ pushl %ecx; \
+ pushl %edx
-#define restore_common_regs \
+#define restore_common_regs \
+ popl %edx; \
popl %ecx
/* Avoid uglifying the argument copying x86-64 needs to do. */
--
2.7.3
--
Regards/Gruss,
Boris.
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg)
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] x86/rwsem: Save and restore all callee-clobbered regs in 32-bit ____down_write()
2016-05-12 17:29 ` [PATCH] x86/rwsem: Save and restore all callee-clobbered regs in 32-bit ____down_write() Borislav Petkov
@ 2016-05-13 2:49 ` Guenter Roeck
2016-05-13 17:03 ` Linus Torvalds
1 sibling, 0 replies; 8+ messages in thread
From: Guenter Roeck @ 2016-05-13 2:49 UTC (permalink / raw)
To: Borislav Petkov, Ingo Molnar, Peter Zijlstra
Cc: linux-next@vger.kernel.org, linux-kernel@vger.kernel.org
On 05/12/2016 10:29 AM, Borislav Petkov wrote:
> Anyway, here's an actual patch with a commit message. Guenter, can you
> give it a run please?
>
> It does fix the issue here with your .config but I'd appreciate a
> confirmation.
>
> Thanks.
>
> ---
> From: Borislav Petkov <bp@suse.de>
>
> ____down_write() calls a function to handle the slow path when the lock
> is contended. But in order to be able to call a C function, one has to
> stash all callee-clobbered registers. The 32-bit path saves only %ecx
> for a reason unknown to me. However, after
>
> 71c01930b42e ("locking/rwsem, x86: Clean up ____down_write()")
>
> the useless dependency on edx was removed and this caused the following
> splat:
>
> BUG: unable to handle kernel NULL pointer dereference at 00000015
> IP: [<c185e094>] down_write+0x24/0x30
> *pde = 00000000
> Oops: 0002 [#1] PREEMPT SMP
> Modules linked in:
> CPU: 0 PID: 1 Comm: swapper/0 Tainted: G S W 4.6.0-rc7-next-20160511-yocto-standard #1
> Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.7.5-20140531_083030-gandalf 04/01/2014
> task: f4d00000 ti: f4d08000 task.ti: f4d08000
> EIP: 0060:[<c185e094>] EFLAGS: 00210282 CPU: 0
> EIP is at down_write+0x24/0x30
> EAX: f4d00000 EBX: f4f6d600 ECX: ffff0001 EDX: 00000001
> ESI: 00000168 EDI: c1c2eb68 EBP: f4d09ef4 ESP: f4d09eec
> DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
> CR0: 80050033 CR2: 00000015 CR3: 01ccb000 CR4: 000406d0
>
> This happens because gcc decided to stash the pointer to @sem in edx (it
> is not used in the inline asm anymore, thus free):
>
> movl %eax, %edx # sem, sem
>
> lock; xadd %ecx,(%eax) # tmp91, sem
> test ...
>
> call call_rwsem_down_write_failed
>
> mov %eax,0x14(%edx)
>
> *before* the slow path happens and if we hit it on 32-bit, it can
> clobber edx and we're staring at garbage value at deref time.
>
> The simple fix is to save/restore edx too, around the slow path. We
> don't need to stash eax because it is used in the slow path as the @sem
> arg.
>
> Reported-by: Guenter Roeck <linux@roeck-us.net>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: x86@kernel.org
> Signed-off-by: Borislav Petkov <bp@suse.de>
Tested-by: Guenter Roeck <linux@roeck-us.net>
Guenter
> ---
> arch/x86/lib/rwsem.S | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/lib/rwsem.S b/arch/x86/lib/rwsem.S
> index a37462a23546..02240807e97a 100644
> --- a/arch/x86/lib/rwsem.S
> +++ b/arch/x86/lib/rwsem.S
> @@ -33,10 +33,12 @@
> * value or just clobbered..
> */
>
> -#define save_common_regs \
> - pushl %ecx
> +#define save_common_regs \
> + pushl %ecx; \
> + pushl %edx
>
> -#define restore_common_regs \
> +#define restore_common_regs \
> + popl %edx; \
> popl %ecx
>
> /* Avoid uglifying the argument copying x86-64 needs to do. */
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] x86/rwsem: Save and restore all callee-clobbered regs in 32-bit ____down_write()
2016-05-12 17:29 ` [PATCH] x86/rwsem: Save and restore all callee-clobbered regs in 32-bit ____down_write() Borislav Petkov
2016-05-13 2:49 ` Guenter Roeck
@ 2016-05-13 17:03 ` Linus Torvalds
2016-05-13 17:19 ` Borislav Petkov
1 sibling, 1 reply; 8+ messages in thread
From: Linus Torvalds @ 2016-05-13 17:03 UTC (permalink / raw)
To: Borislav Petkov
Cc: Guenter Roeck, Ingo Molnar, Peter Zijlstra,
linux-next@vger.kernel.org, linux-kernel@vger.kernel.org
On Thu, May 12, 2016 at 10:29 AM, Borislav Petkov <bp@suse.de> wrote:
> Anyway, here's an actual patch with a commit message. Guenter, can you
> give it a run please?
I think the commit message is misleading.
> ____down_write() calls a function to handle the slow path when the lock
> is contended. But in order to be able to call a C function, one has to
> stash all callee-clobbered registers. The 32-bit path saves only %ecx
> for a reason unknown to me.
Why claim that it's unknown? You know exactly what the reason was:
> the useless dependency on edx was removed and this caused the following
> splat:
The dependency on %edx was clearly exactly because the calling
convention for the slow-path was that %eax and %edx were clobbered,
and %edx was used as a temporary, so clobbering it had no downside.
So it wasn't useless, it was explicit, and commit 71c01930b42e was just broken.
I think your fix is wrong. Your fix adds the pointless push/pop that
doesn't help any, since you might as well just force the temporary
back to %edx.
The correct fix is to revert the broken commit.
If commit 71c01930b42e had actually generated better code, that would
be different. But it doesn't. So as it is, this is all just worse than
it used to be, and I don't see the point of "fixing" things by making
them worse.
Revert back to the old "use %edx as a temporary", together with a
comment so that this doesn't happen again.
Linus
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] x86/rwsem: Save and restore all callee-clobbered regs in 32-bit ____down_write()
2016-05-13 17:03 ` Linus Torvalds
@ 2016-05-13 17:19 ` Borislav Petkov
2016-05-16 9:34 ` [PATCH] locking/rwsem: Fix comment on register clobbering Borislav Petkov
0 siblings, 1 reply; 8+ messages in thread
From: Borislav Petkov @ 2016-05-13 17:19 UTC (permalink / raw)
To: Linus Torvalds
Cc: Guenter Roeck, Ingo Molnar, Peter Zijlstra,
linux-next@vger.kernel.org, linux-kernel@vger.kernel.org
On Fri, May 13, 2016 at 10:03:26AM -0700, Linus Torvalds wrote:
> I think your fix is wrong. Your fix adds the pointless push/pop that
> doesn't help any, since you might as well just force the temporary
> back to %edx.
But if we do this, then everything using the slow path
call_rwsem_down_write_failed et al, which then calls
{save,restore}_common_regs, would have to remember to use %edx as
temporary because {save,restore}_common_regs won't protect it and gcc
might clobber it.
OTOH, the 64-bit versions {save,restore}_common_regs don't stash away
%rdx either so I guess that mechanism was supposed to not save the ABI
return registers rAX and rDX.
The only thing that needs to be corrected then is the misleading comment
above the 32-bit version "... Save the C-clobbered registers (%eax, %edx
and %ecx) .." - the 64-bit version comment is correct AFAICT.
--
Regards/Gruss,
Boris.
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg)
--
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH] locking/rwsem: Fix comment on register clobbering
2016-05-13 17:19 ` Borislav Petkov
@ 2016-05-16 9:34 ` Borislav Petkov
0 siblings, 0 replies; 8+ messages in thread
From: Borislav Petkov @ 2016-05-16 9:34 UTC (permalink / raw)
To: x86-ml
Cc: Linus Torvalds, Guenter Roeck, Ingo Molnar, Peter Zijlstra,
linux-next@vger.kernel.org, linux-kernel@vger.kernel.org
On Fri, May 13, 2016 at 07:19:15PM +0200, Borislav Petkov wrote:
> The only thing that needs to be corrected then is the misleading comment
> above the 32-bit version "... Save the C-clobbered registers (%eax, %edx
> and %ecx) .." - the 64-bit version comment is correct AFAICT.
---
From: Borislav Petkov <bp@suse.de>
Date: Mon, 16 May 2016 11:29:22 +0200
Subject: [PATCH] locking/rwsem: Fix comment on register clobbering
Document explicitly that %edx can get clobbered on the slow path, on
32-bit. Something I learned the hard way. :-\
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
---
arch/x86/lib/rwsem.S | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/arch/x86/lib/rwsem.S b/arch/x86/lib/rwsem.S
index a37462a23546..bb49caa4dd4c 100644
--- a/arch/x86/lib/rwsem.S
+++ b/arch/x86/lib/rwsem.S
@@ -29,8 +29,10 @@
* there is contention on the semaphore.
*
* %eax contains the semaphore pointer on entry. Save the C-clobbered
- * registers (%eax, %edx and %ecx) except %eax whish is either a return
- * value or just clobbered..
+ * registers (%eax, %edx and %ecx) except %eax which is either a return
+ * value or just clobbered. Same is true for %edx so make sure gcc
+ * reloads it after the slow path, by making it hold a temporary, for
+ * example; see ____down_write().
*/
#define save_common_regs \
--
2.7.3
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg)
--
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2016-05-16 9:34 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-12 13:34 next: Crashes in x86 images due to 'locking/rwsem, x86: Clean up ____down_write()' Guenter Roeck
2016-05-12 13:51 ` Borislav Petkov
2016-05-12 14:46 ` Borislav Petkov
2016-05-12 17:29 ` [PATCH] x86/rwsem: Save and restore all callee-clobbered regs in 32-bit ____down_write() Borislav Petkov
2016-05-13 2:49 ` Guenter Roeck
2016-05-13 17:03 ` Linus Torvalds
2016-05-13 17:19 ` Borislav Petkov
2016-05-16 9:34 ` [PATCH] locking/rwsem: Fix comment on register clobbering Borislav Petkov
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).