the cost of inlining?
Jeff Haran
Jeff.Haran at citrix.com
Fri Dec 5 17:35:13 EST 2014
> -----Original Message-----
> From: John de la Garza [mailto:john at jjdev.com]
> Sent: Thursday, December 04, 2014 7:14 PM
> To: Jeff Haran
> Cc: Kernel Newbies
> Subject: Re: the cost of inlining?
>
> On Fri, Dec 05, 2014 at 01:32:35AM +0000, Jeff Haran wrote:
> > $ cat atomic_read.c
> >
> > #include <asm/atomic.h>
> > #include <asm/system.h>
> >
> > int samp_atomic_read(atomic_t *v)
> > {
> > int val;
> >
> > val = atomic_read(v);
> > return val;
> > }
> I couldn't get it to build with the #inclue <asm/system.h>, but it built when I
> removed it.
>
> > I dump the resultant .ko, I get this:
> >
> > > objdump -S -M intel atomic_read.ko
> >
> > atomic_read.ko: file format elf64-x86-64
> >
> >
> > Disassembly of section .text:
> >
> > 0000000000000000 <samp_atomic_read>:
> > #include <asm/atomic.h>
> > #include <asm/system.h>
> >
> > int samp_atomic_read(atomic_t *v)
> > {
> > 0: 55 push rbp
> > 1: 48 89 e5 mov rbp,rsp
> > 4: e8 00 00 00 00 call 9 <samp_atomic_read+0x9>
> > *
> > * Atomically reads the value of @v.
> > */
> > static inline int atomic_read(const atomic_t *v) {
> > return v->counter;
> > 9: 8b 07 mov eax,DWORD PTR [rdi]
> > int val;
> >
> > val = atomic_read(v);
> > return val;
> > }
> > b: c9 leave
> > c: c3 ret
> > d: 90 nop
> > e: 90 nop
> > f: 90 nop
> >
>
> My ouput differs:
> john at vega:~/foo$ objdump -S -M intel atomic_read.ko
>
> atomic_read.ko: file format elf64-x86-64
>
>
> Disassembly of section .text:
>
> 0000000000000000 <samp_atomic_read>:
> 0: 55 push rbp
> 1: 8b 07 mov eax,DWORD PTR [rdi]
> 3: 48 89 e5 mov rbp,rsp
> 6: 5d pop rbp
> 7: c3 ret
John,
Would you mind sharing what kernel version/distro you are using?
I'm using a somewhat dated Redhat version for this:
$ cat /proc/version
Linux version 2.6.32-71.15.1.el6.x86_64 (mockbuild at x86-009.build.bos.redhat.com) (gcc version 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC) ) #1 SMP Sun Jan 23 10:39:44 EST 2011
[jharan at build-fusion-linux]~$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.0 (Santiago)
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.0 (Santiago)
$ gcc -v
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC)
I wonder if my results are from one of Redhat's tweaks.
The only benefit I can think of from this extra call instruction is if v is a bad address and the dereference of v causes a trap, the stack trace will have that return address on it.
Thanks,
Jeff Haran
More information about the Kernelnewbies
mailing list