Re: Another preempt folding issue?
From: Stefan Bader
Date: Fri Feb 14 2014 - 12:03:00 EST
On 14.02.2014 15:47, Borislav Petkov wrote:
> On Fri, Feb 14, 2014 at 03:24:09PM +0100, Stefan Bader wrote:
>> Actually, this code just makes so much more sense if I let objdump do
>> relocation info...
>
> Ok, we're pretty sure you have an MFENCE there in resched_task but can
> you confirm it please.
>
> First, does /proc/cpuinfo have the "sse2" string? It should but nowadays
> I don't trust anything.
>
> Then, can you boot that kernel in qemu with the -gdb flag so that it
> starts the gdb stub, here's the manpage about it:
>
> -gdb dev
> Wait for gdb connection on device dev. Typical connections will likely be
> TCP-based, but also UDP, pseudo TTY, or even stdio are reasonable use case.
> The latter is allowing to start QEMU from within gdb and establish the
> connection via a pipe:
>
> (gdb) target remote | exec qemu-system-i386 -gdb stdio ...
>
> -s Shorthand for -gdb tcp::1234, i.e. open a gdbserver on TCP port 1234.
>
> then boot the guest and when it is up, do
>
> $ gdb ./vmlinux
> $ target remote localhost:1234
>
> and type in the prompt
>
> $ (gdb) x/50i resched_task
>
> It gives here:
>
> (gdb) x/50i resched_task
> 0xffffffff810836f0 <resched_task>: data32 data32 data32 xchg %ax,%ax
> 0xffffffff810836f5 <resched_task+5>: push %rbp
> 0xffffffff810836f6 <resched_task+6>: mov 0x85e123(%rip),%r10d # 0xffffffff818e1820 <debug_locks>
> 0xffffffff810836fd <resched_task+13>: mov %rsp,%rbp
> 0xffffffff81083700 <resched_task+16>: push %r12
> 0xffffffff81083702 <resched_task+18>: test %r10d,%r10d
> 0xffffffff81083705 <resched_task+21>: push %rbx
> 0xffffffff81083706 <resched_task+22>: mov %rdi,%rbx
> 0xffffffff81083709 <resched_task+25>: jne 0xffffffff81083760 <resched_task+112>
> 0xffffffff8108370b <resched_task+27>: mov 0x8(%rbx),%rax
> 0xffffffff8108370f <resched_task+31>: mov 0x10(%rax),%rdx
> 0xffffffff81083713 <resched_task+35>: and $0x8,%edx
> 0xffffffff81083716 <resched_task+38>: jne 0xffffffff8108373c <resched_task+76>
> 0xffffffff81083718 <resched_task+40>: lock orb $0x8,0x10(%rax)
> 0xffffffff8108371d <resched_task+45>: mov 0x8(%rbx),%rax
> 0xffffffff81083721 <resched_task+49>: mov 0x18(%rax),%r12d
> 0xffffffff81083725 <resched_task+53>: callq 0xffffffff812d8fc0 <debug_smp_processor_id>
> 0xffffffff8108372a <resched_task+58>: cmp %r12d,%eax
> 0xffffffff8108372d <resched_task+61>: je 0xffffffff810837a0 <resched_task+176>
> 0xffffffff8108372f <resched_task+63>: mfence
> ^^^^^^
> I want to make sure the smp_mb() is really replaced with an MFENCE there.
>
> Thanks!
>
Okaaay, I think I did what you asked. So yes, there is sse2 in the cpu info. And
there is a mfence in the disassembly:
0xc107dcb0 <resched_task>: push %ebp
0xc107dcb1 <resched_task+1>: mov %esp,%ebp
0xc107dcb3 <resched_task+3>: lea %ds:0x0(%esi,%eiz,1),%esi
0xc107dcb8 <resched_task+8>: mov 0x4(%eax),%edx
0xc107dcbb <resched_task+11>: mov 0x8(%edx),%ecx
0xc107dcbe <resched_task+14>: and $0x8,%ecx
0xc107dcc1 <resched_task+17>: jne 0xc107dce7 <resched_task+55>
0xc107dcc3 <resched_task+19>: orb $0x8,%ds:0x8(%edx)
0xc107dcc8 <resched_task+24>: mov 0x4(%eax),%edx
0xc107dccb <resched_task+27>: mov %fs:0xc1a71010,%ecx
0xc107dcd2 <resched_task+34>: mov 0x10(%edx),%edx
0xc107dcd5 <resched_task+37>: cmp %ecx,%edx
0xc107dcd7 <resched_task+39>: je 0xc107dd00 <resched_task+80>
0xc107dcd9 <resched_task+41>: mfence
0xc107dcdc <resched_task+44>: mov %esi,%esi
0xc107dcde <resched_task+46>: mov 0x4(%eax),%eax
0xc107dce1 <resched_task+49>: testb $0x4,0xc(%eax)
0xc107dce5 <resched_task+53>: je 0xc107dcf0 <resched_task+64>
0xc107dce7 <resched_task+55>: pop %ebp
0xc107dce8 <resched_task+56>: ret
0xc107dce9 <resched_task+57>: lea 0x0(%esi,%eiz,1),%esi
0xc107dcf0 <resched_task+64>: mov %edx,%eax
0xc107dcf2 <resched_task+66>: call *0xc1917950
0xc107dcf8 <resched_task+72>: pop %ebp
Thinking about it, I guess Peter is quite right saying that I likely will end on
the patch that converted preempt_count to percpu.
One thing I likely should do is to reinstall the exact same laptop with 64bit
kernel and userspace... maybe only 64bit kernel first... and make sure on my
side that this does not show up on 64bit, too. I took the word of reporters for
that (and the impression that otherwise many more people would have complained).
Attachment:
signature.asc
Description: OpenPGP digital signature