• Josh Stone's avatar
    x86, perf, kprobes: Make kprobes's twobyte_is_boostable volatile · db45bd90
    Josh Stone authored
    When compiling an i386_defconfig kernel with
    gcc-4.6.1-9.fc15.i686, I noticed a warning about the asm operand
    for test_bit in kprobes' can_boost. I discovered that this
    caused only the first long of twobyte_is_boostable[] to be
    output.
    
    Jakub filed and fixed gcc PR50571 to correct the warning and
    this output issue.  But to solve it for less current gcc, we can
    make kprobes' twobyte_is_boostable[] volatile, and it won't be
    optimized out.
    
    Before:
    
        CC      arch/x86/kernel/kprobes.o
      In file included from include/linux/bitops.h:22:0,
                       from include/linux/kernel.h:17,
                       from [...]/arch/x86/include/asm/percpu.h:44,
                       from [...]/arch/x86/include/asm/current.h:5,
                       from [...]/arch/x86/include/asm/processor.h:15,
                       from [...]/arch/x86/include/asm/atomic.h:6,
                       from include/linux/atomic.h:4,
                       from include/linux/mutex.h:18,
                       from include/linux/notifier.h:13,
                       from include/linux/kprobes.h:34,
                       from arch/x86/kernel/kprobes.c:43:
      [...]/arch/x86/include/asm/bitops.h: In function ‘can_boost.part.1’:
      [...]/arch/x86/include/asm/bitops.h:319:2: warning: use of memory input without lvalue in asm operand 1 is deprecated [enabled by default]
    
      $ objdump -rd arch/x86/kernel/kprobes.o | grep -A1 -w bt
           551:	0f a3 05 00 00 00 00 	bt     %eax,0x0
                              554: R_386_32	.rodata.cst4
    
      $ objdump -s -j .rodata.cst4 -j .data arch/x86/kernel/kprobes.o
    
      arch/x86/kernel/kprobes.o:     file format elf32-i386
    
      Contents of section .data:
       0000 48000000 00000000 00000000 00000000  H...............
      Contents of section .rodata.cst4:
       0000 4c030000                             L...
    
    Only a single long of twobyte_is_boostable[] is in the object
    file.
    
    After, with volatile:
    
      $ objdump -rd arch/x86/kernel/kprobes.o | grep -A1 -w bt
           551:	0f a3 05 20 00 00 00 	bt     %eax,0x20
                              554: R_386_32	.data
    
      $ objdump -s -j .rodata.cst4 -j .data arch/x86/kernel/kprobes.o
    
      arch/x86/kernel/kprobes.o:     file format elf32-i386
    
      Contents of section .data:
       0000 48000000 00000000 00000000 00000000  H...............
       0010 00000000 00000000 00000000 00000000  ................
       0020 4c030000 0f000200 ffff0000 ffcff0c0  L...............
       0030 0000ffff 3bbbfff8 03ff2ebb 26bb2e77  ....;.......&..w
    
    Now all 32 bytes are output into .data instead.
    Signed-off-by: default avatarJosh Stone <jistone@redhat.com>
    Acked-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Cc: Jakub Jelinek <jakub@redhat.com>
    Link: http://lkml.kernel.org/r/1318899645-4068-1-git-send-email-jistone@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@elte.hu>
    db45bd90
kprobes.c 43.3 KB