ftrace/recordmcount: Remove useless mcount calls not being traced
cover ftrace/recordmcount: Remove useless mcount calls not being traced
The following is just a heads up on the changes to recordmcount.
Ftrace function tracer will only trace sections that have been white listed. A section not in the whitelist will not be traced but if the section is not denoted with "notrace" it will still have calls to mcount. On x86_64 mcount is defined simply as:
mcount:
retq
But these sections will take a slight overhead for calling the mcount function and returning. Most of the time we don't care because these are usually init and exit sections that are not very performance critical. But it would be nice not to have these calls anyway.
This patch seriers does a few things.
1) various cleanups to recordmcount.c
2) Make the calls (on x86) to mcount that are not being recorded for the function tracer into nops at compile time.
3) Add a "RECORDMCOUNT_WARN=1" feature to the make command line that will cause recordmcount to warn when a section contains mcount calls that is not being traced.
4) Added some "notrace" to section annotations that are not being traced as well as whitelisting one.
The reason this does not warn by default is because the developer may not know if the section should be whitelisted or blacklisted (notrace)
Anyway, this is going out as RFC for now if anyone has any comments, and I also need to get Acked-by's from the Kconfig maintainer for one of my modifications.
Steven Rostedt (11):
ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons ftrace/trivial: Clean up record mcount to use Linux switch style
ftrace: Add .kprobe.text section to whitelist for recordmcount.c ftrace/recordmcount: Modify only executable sections ftrace/recordmcount: Make ignored mcount calls into nops at compile time ftrace/recordmcount: Add warning logic to warn on mcount not recorded kbuild/recordmcount: Add RECORDMCOUNT_WARN to warn about mcount callers
ftrace: Avoid recording mcount on .init sections directly ftrace/x86: Do not trace .discard.text section ftrace/recordmcount: Remove duplicate code to find mcount symbol ftrace/recordmcount: Add helper function get_sym_str_and_relp()
----
Makefile | 1 + arch/x86/include/asm/setup.h | 2 +- include/linux/init.h | 14 ++-- scripts/Makefile.build | 5 +- scripts/recordmcount.c | 162 +++++++++++++++++++++++++++-------------- scripts/recordmcount.h | 165 +++++++++++++++++++++++++++++++++--------- scripts/recordmcount.pl | 1 + 7 files changed, 253 insertions(+), 97 deletions(-)
RFC PATCH 1/11 ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
From: Steven Rostedt <[email protected]>
The Linux style for comparing is:
var == 1
var > 0
and not:
1 == var
0 < var
It is considered that Linux developers are smart enough not to do the
if (var = 1)
mistake.
--- scripts/recordmcount.c | 48 ++++++++++++++++++++++++------------------------ scripts/recordmcount.h | 16 ++++++++-------- 2 files changed, 32 insertions(+), 32 deletions(-)
scripts/recordmcount.c +24 -24
@@ -78,7 +78,7 @@ static off_t ulseek(int const fd, off_t const offset, int const whence) { off_t const w = lseek(fd, offset, whence); -if ((off_t)-1 == w) { +if (w == (off_t)-1 ) {perror ("lseek" );fail_file (); }
@@ -111,7 +111,7 @@ static void * umalloc(size_t size) {void *const addr =malloc (size); -if (0 == addr) { +if (addr ==0 ) {fprintf (stderr,"malloc failed: %zu bytes\n" , size);fail_file (); }
@@ -136,7 +136,7 @@ static void *mmap_file(char const *fname)void *addr; fd_map =open (fname,O_RDWR ); -if (0 > fd_map ||0 >fstat (fd_map, &sb)) { +if (fd_map <0 ||fstat (fd_map, &sb) <0 ) {perror (fname);fail_file (); }
@@ -147,7 +147,7 @@ static void *mmap_file(char const *fname) addr =mmap (0 , sb.st_size,PROT_READ |PROT_WRITE ,MAP_PRIVATE , fd_map,0 ); mmap_failed =0 ; -if (MAP_FAILED == addr) { +if (addr ==MAP_FAILED ) { mmap_failed =1 ; addr =umalloc (sb.st_size);uread (fd_map, addr, sb.st_size);
@@ -206,12 +206,12 @@ static uint32_t (*w2)(uint16_t);static int is_mcounted_section_name (char const *const txtname) { -return 0 ==strcmp (".text" , txtname) || -0 ==strcmp (".ref.text" , txtname) || -0 ==strcmp (".sched.text" , txtname) || -0 ==strcmp (".spinlock.text" , txtname) || -0 ==strcmp (".irqentry.text" , txtname) || -0 ==strcmp (".text.unlikely" , txtname); +return strcmp (".text" , txtname) ==0 || +strcmp (".ref.text" , txtname) ==0 || +strcmp (".sched.text" , txtname) ==0 || +strcmp (".spinlock.text" , txtname) ==0 || +strcmp (".irqentry.text" , txtname) ==0 || +strcmp (".text.unlikely" , txtname) ==0 ; }/* 32 bit and 64 bit are very similar */
@@ -270,7 +270,7 @@ do_file(char const *const fname)fail_file (); }break ;case ELFDATA2LSB : { -if (1 != *(unsigned char const *)&endian) { +if (*(unsigned char const *)&endian !=1 ) {/* main() is big endian, file.o is little endian. */ w = w4rev; w2 = w2rev;
@@ -278,7 +278,7 @@ do_file(char const *const fname) } }break ;case ELFDATA2MSB : { -if (0 != *(unsigned char const *)&endian) { +if (*(unsigned char const *)&endian !=0 ) {/* main() is little endian, file.o is big endian. */ w = w4rev; w2 = w2rev;
@@ -286,9 +286,9 @@ do_file(char const *const fname) } }break ; }/* end switch */ -if (0 !=memcmp (ELFMAG , ehdr->e_ident,SELFMAG ) - ||ET_REL !=w2 (ehdr->e_type) - ||EV_CURRENT != ehdr->e_ident[EI_VERSION ]) { +if (memcmp (ELFMAG , ehdr->e_ident,SELFMAG ) !=0 + ||w2 (ehdr->e_type) !=ET_REL + || ehdr->e_ident[EI_VERSION ] !=EV_CURRENT ) {fprintf (stderr,"unrecognized ET_REL file %s\n" , fname);fail_file (); }
@@ -321,15 +321,15 @@ do_file(char const *const fname)fail_file (); }break ;case ELFCLASS32 : { -if (sizeof (Elf32_Ehdr) !=w2 (ehdr->e_ehsize) - ||sizeof (Elf32_Shdr) !=w2 (ehdr->e_shentsize)) { +if (w2 (ehdr->e_ehsize) !=sizeof (Elf32_Ehdr) + ||w2 (ehdr->e_shentsize) !=sizeof (Elf32_Shdr)) {fprintf (stderr,"unrecognized ET_REL file: %s\n" , fname);fail_file (); } -if (EM_S390 ==w2 (ehdr->e_machine)) +if (w2 (ehdr->e_machine) ==EM_S390 ) reltype =R_390_32 ; -if (EM_MIPS ==w2 (ehdr->e_machine)) { +if (w2 (ehdr->e_machine) ==EM_MIPS ) { reltype =R_MIPS_32 ; is_fake_mcount32 = MIPS32_is_fake_mcount; }
@@ -337,15 +337,15 @@ do_file(char const *const fname) }break ;case ELFCLASS64 : {Elf64_Ehdr *const ghdr = (Elf64_Ehdr *)ehdr; -if (sizeof (Elf64_Ehdr) !=w2 (ghdr->e_ehsize) - ||sizeof (Elf64_Shdr) !=w2 (ghdr->e_shentsize)) { +if (w2 (ghdr->e_ehsize) !=sizeof (Elf64_Ehdr) + ||w2 (ghdr->e_shentsize) !=sizeof (Elf64_Shdr)) {fprintf (stderr,"unrecognized ET_REL file: %s\n" , fname);fail_file (); } -if (EM_S390 ==w2 (ghdr->e_machine)) +if (w2 (ghdr->e_machine) ==EM_S390 ) reltype =R_390_64 ; -if (EM_MIPS ==w2 (ghdr->e_machine)) { +if (w2 (ghdr->e_machine) ==EM_MIPS ) { reltype =R_MIPS_64 ; Elf64_r_sym = MIPS64_r_sym; Elf64_r_info = MIPS64_r_info;
@@ -371,7 +371,7 @@ main(int argc, char const *argv[]) }/* Process each file in turn, allowing deep failure. */ -for (--argc, ++argv;0 < argc; --argc, ++argv) { +for (--argc, ++argv; argc >0 ; --argc, ++argv) {int const sjval =setjmp (jmpenv);int len;
scripts/recordmcount.h +8 -8
@@ -275,12 +275,12 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,Elf_Sym const *const symp = &sym0[Elf_r_sym (relp)];char const *symname = &str0[w (symp->st_name)]; -char const *mcount ='_' == gpfx ?"_mcount" :"mcount" ; +char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; -if ('.' == symname[0 ]) +if (symname[0 ] =='.' ) ++symname;/* ppc64 hack */ -if (0 ==strcmp (mcount, symname) || - (altmcount &&0 ==strcmp (altmcount, symname))) +if (strcmp (mcount, symname) ==0 || + (altmcount &&strcmp (altmcount, symname) ==0 )) mcountsym =Elf_r_sym (relp); }
@@ -290,7 +290,7 @@ static uint_t *sift_rel_mcount(uint_t *mlocp, mrelp->r_offset =_w (offbase + ((void *)mlocp - (void *)mloc0));Elf_r_info (mrelp, recsym, reltype); -if (sizeof (Elf_Rela) == rel_entsize) { +if (rel_entsize ==sizeof (Elf_Rela)) { ((Elf_Rela *)mrelp)->r_addend = addend; *mlocp++ =0 ; }else
@@ -354,12 +354,12 @@ __has_rel_mcount(Elf_Shdr const *const relhdr, /* is SHT_REL or SHT_RELA */Elf_Shdr const *const txthdr = &shdr0[w (relhdr->sh_info)];char const *const txtname = &shstrtab[w (txthdr->sh_name)]; -if (0 ==strcmp ("__mcount_loc" , txtname)) { +if (strcmp ("__mcount_loc" , txtname) ==0 ) {fprintf (stderr,"warning: __mcount_loc already exists: %s\n" , fname);succeed_file (); } -if (SHT_PROGBITS !=w (txthdr->sh_type) || +if (w (txthdr->sh_type) !=SHT_PROGBITS || !is_mcounted_section_name (txtname))return NULL ;return txtname;
@@ -370,7 +370,7 @@ static char const *has_rel_mcount(Elf_Shdr const *const relhdr,char const *const shstrtab, char const *const fname) { - if (SHT_REL != w(relhdr->sh_type) && SHT_RELA != w(relhdr->sh_type)) + if (w(relhdr->sh_type) != SHT_REL && w(relhdr->sh_type) != SHT_RELA) return NULL; return __has_rel_mcount(relhdr, shdr0, shstrtab, fname); }
Signature · 1 line
1.7.2.3
Re: [RFC][PATCH 01/11] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
Quoted 6 lines · On Wed, 20 Apr 2011 22:28:26 -0400 Steven Rostedt <[email protected]> wrote:
From: Steven Rostedt <[email protected]>
The Linux style for comparing is:
var == 1
var > 0
It's both and both forms are commonly used. I don't care what ftrace looks like but don't pedal bogus style. We have enough bogus style as it is.
Re: [RFC][PATCH 01/11] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
Quoted 5 lines · Alan Cox
Quoted 2 lines · On Wed, 20 Apr 2011 22:28:26 -0400 Steven Rostedt <[email protected]> wrote:
From: Steven Rostedt <[email protected]>
Quoted 8 lines
Quoted 4 lines
The Linux style for comparing is:
var == 1
var > 0It's both and both forms are commonly used. I don't care what ftrace looks like but don't pedal bogus style. We have enough bogus style as it is.
I thought I read somewhere that this was the preferred method. But I could be mistaking.
Anyway, the patch still stands, although I'll change the above line from "Linux style" to "Linux ftrace style", as I'm the one that has to maintain this code, and I prefer this method.
I translate: var == 1 as "var is one" so seeing "1 == var" my mind translates that to "one is var" which just sounds funny. Every time I see that notation I have to stop and think about it. I'm sure if I used it enough that hesitation would vanish, but for now, I'll keep it as is.
I haven't done the "if (var = 1)" mistake since college.
-- Steve
Re: [RFC][PATCH 01/11] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
Quoted 2 lines · Steven Rostedt
I haven't done the "if (var = 1)" mistake since college.
I have a very bad feeling that I just jinxed myself and within the year, I'll submit a patch with that very mistake :-p
-- Steve
Re: [RFC][PATCH 01/11] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
In reply to Steven RostedtQuoted 9 lines · Steven Rostedt
From: Steven Rostedt <[email protected]>
The Linux style for comparing is:
var == 1
var > 0and not:
Quoted 8 lines
1 == var
0 < varIt is considered that Linux developers are smart enough not to do the
if (var = 1)
mistake.
It's not just a matter of 'smart', it's a matter of safety.
For me it still catches a bug (typo, copy+paste, fumble in editor script, ...) every year or two. Compilers haven't always warned, or the option to warn might be turned off.
scripts/recordmcount.c static uint32_t (*w2)(uint16_t); · line 209
Quoted 2 lines
scripts/recordmcount.c +1
-1- return 0 == strcmp(".text", txtname) || + return strcmp(".text", txtname) == 0 ||
I consider "0==strcmp(" to be an idiom. Too often "strcmp(...) == 0" overflows my mental stack because of the typographic width of the operands in the source code. If you still object in this case then please consider using something like:
#define strequ(a,b) (strcmp((a), (b)) == 0)
or
static int strequ(char const *a, char const *b)
{
return strcmp(a, b) == 0;
}which names the idiom.
Signature · 1 line
John Reiser
Re: [RFC][PATCH 01/11] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
Quoted 12 lines · John Reiser
I consider "0==strcmp(" to be an idiom. Too often "strcmp(...) == 0" overflows my mental stack because of the typographic width of the operands in the source code. If you still object in this case then please consider using something like:
#definestrequ(a,b)(strcmp((a), (b))== 0)
or
static intstrequ(char const *a, char const *b)
{
returnstrcmp(a, b)== 0;
}
which names the idiom.
Maybe str_eq? Or even just streq? And also just !strcmp(a,b).
Re: [RFC][PATCH 01/11] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
Quoted 14 lines · Thiago Farina
Quoted 4 lines · John Reiser
I consider "0==strcmp(" to be an idiom. Too often "strcmp(...) == 0" overflows my mental stack because of the typographic width of the operands in the source code. If you still object in this case then please consider using something like:
Quoted 8 lines
#define strequ(a,b) (strcmp((a), (b)) == 0) or static int strequ(char const *a, char const *b) { return strcmp(a, b) == 0; }which names the idiom.
Quoted 1 line
Maybe
str_eq? Or even just streq? And also just !strcmp(a,b).
streq() is something I woudn't mind.
I've too often confused !strcmp(a,b) as "!streq()" which is not the case. Which is why I always use strcmp(a,b) == 0, which to me I see the '==' as eq. I also consider strcmp(a,b) != 0 as not equal. Again, the mind that sees "==" and "!=" can just translate that to human language. Where !strcmp() is just gibberish ;)
-- Steve
Re: [RFC][PATCH 01/11] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
Hi,
Quoted 17 lines · Steven Rostedt
Quoted 14 lines · Thiago Farina
Quoted 12 lines · John Reiser
I consider "0==strcmp(" to be an idiom. Too often "strcmp(...) == 0" overflows my mental stack because of the typographic width of the operands in the source code. If you still object in this case then please consider using something like:
#definestrequ(a,b)(strcmp((a), (b))== 0)
or
static intstrequ(char const *a, char const *b)
{
returnstrcmp(a, b)== 0;
}
which names the idiom.Quoted 1 line
Maybe
str_eq? Or even just streq? And also just !strcmp(a,b).
Quoted 7 lines
streq()is something I woudn't mind.I've too often confused !strcmp(a,b) as "!streq()" which is not the case. Which is why I always use
strcmp(a,b)== 0, which to me I see the '==' as eq. I also considerstrcmp(a,b)!= 0 as not equal. Again, the mind that sees "==" and "!=" can just translate that to human language. Where !strcmp() is just gibberish ;)
I've sent a patch to linux-kernel adding streq macro as suggested and copied you Steven.
Best regards,
Re: [RFC][PATCH 01/11] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
Quoted 4 lines · Thiago Farina
Hi,
I've sent a patch to linux-kernel adding streq macro as suggested and copied you Steven.
Yep, saw it. If it is accepted, then I'll start conversions to it.
-- Steve
Re: [RFC][PATCH 01/11] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
In reply to John ReiserQuoted 15 lines · John Reiser
Quoted 14 lines · Steven Rostedt
From: Steven Rostedt <[email protected]>
The Linux style for comparing is:
var == 1
var > 0and not:
1 == var
0 < varIt is considered that Linux developers are smart enough not to do the
Quoted 8 lines
Quoted 3 lines
if (var = 1)
mistake.
It's not just a matter of 'smart', it's a matter of safety.
For me it still catches a bug (typo, copy+paste, fumble in editor script, ...) every year or two. Compilers haven't always warned, or the option to warn might be turned off.
I totally understand why it is used. But personally, it confuses my train of thought when reading code. That notation is just a work around to a deficiency in the C language. And I find the time spent trying to decipher 0 == var takes up much more time than debugging if (var = 0).
Although, I have no idea why you choose the 0 < var, that totally confuses me. It does not play any role in assignments. What bug is that preventing? When I want to know if a variable is greater than zero, I don't show it as zero less than the var.
Quoted 8 lines
scripts/recordmcount.c static uint32_t (*w2)(uint16_t); · line 209
Quoted 3 lines
scripts/recordmcount.c +1
-1- return 0 == strcmp(".text", txtname) || + return strcmp(".text", txtname) == 0 ||I consider "0==strcmp(" to be an idiom. Too often "strcmp(...) == 0" overflows my mental stack because of the typographic width of the operands in the source code. If you still object in this case then please consider using something like:
Quoted 7 lines
#define strequ(a,b) (strcmp((a), (b)) == 0) or static int strequ(char const *a, char const *b) { return strcmp(a, b) == 0; }which names the idiom.
I'm all for making a streq. Perhaps that could be a nice clean up of the kernel. It definitely makes it much easier to read and understand. But that is for another time.
As I'm working on this code, and I'm the maintainer, I want to make sure I can read and review the code easily. Anything that distracts me for other people's personal taste, is something that I don't have the luxury of time for. Thus, I'm keeping these patches as is for the time being.
-- Steve
Re: [RFC][PATCH 01/11] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
Quoted 4 lines · Steven Rostedt
Although, I have no idea why you choose the 0 < var, that totally confuses me. It does not play any role in assignments. What bug is that preventing? When I want to know if a variable is greater than zero, I don't show it as zero less than the var.
Using ">" can be confused visually with "->", and I want to reduce those chances. I also prefer a style that is prefix oriented, and with constants on the left. I mentally combine the left constant and the infix operator into a special case prefix operator. This speeds my parsing because it reduces stack depth and enables faster scanning. This is particularly helpful when the constant is narrow and the other operand is wider.
Signature · 1 line
John Reiser
H. Peter Anvin
reviewerRe: [RFC][PATCH 01/11] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
Quoted 6 lines · John Reiser
Quoted 4 lines · Steven Rostedt
Although, I have no idea why you choose the 0 < var, that totally confuses me. It does not play any role in assignments. What bug is that preventing? When I want to know if a variable is greater than zero, I don't show it as zero less than the var.
Quoted 7 lines
Using ">" can be confused visually with "->", and I want to reduce those chances. I also prefer a style that is prefix oriented, and with constants on the left. I mentally combine the left constant and the infix operator into a special case prefix operator. This speeds my parsing because it reduces stack depth and enables faster scanning. This is particularly helpful when the constant is narrow and the other operand is wider.
I think you will find you're significantly in the minority when it comes to that preference.
-hpa
Signature · 2 lines
H. Peter Anvin, Intel Open Source Technology Center I work for Intel. I don't speak on their behalf.
[tip:perf/core] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
In reply to Steven RostedtCommit-ID: dd5477ff3ba978892014ea5f988cb1bf04aa505e Gitweb: http://git.kernel.org/tip/dd5477ff3ba978892014ea5f988cb1bf04aa505e Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 6 Apr 2011 13:21:17 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Mon, 16 May 2011 14:38:51 -0400
ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
The Linux ftrace subsystem style for comparing is:
var == 1
var > 0
and not:
1 == var
0 < var
It is considered that Linux developers are smart enough not to do the
if (var = 1)
mistake.
--- scripts/recordmcount.c | 48 ++++++++++++++++++++++++------------------------ scripts/recordmcount.h | 16 ++++++++-------- 2 files changed, 32 insertions(+), 32 deletions(-)
scripts/recordmcount.c +24 -24
@@ -78,7 +78,7 @@ static off_t ulseek(int const fd, off_t const offset, int const whence) { off_t const w = lseek(fd, offset, whence); -if ((off_t)-1 == w) { +if (w == (off_t)-1 ) {perror ("lseek" );fail_file (); }
@@ -111,7 +111,7 @@ static void * umalloc(size_t size) {void *const addr =malloc (size); -if (0 == addr) { +if (addr ==0 ) {fprintf (stderr,"malloc failed: %zu bytes\n" , size);fail_file (); }
@@ -136,7 +136,7 @@ static void *mmap_file(char const *fname)void *addr; fd_map =open (fname,O_RDWR ); -if (0 > fd_map ||0 >fstat (fd_map, &sb)) { +if (fd_map <0 ||fstat (fd_map, &sb) <0 ) {perror (fname);fail_file (); }
@@ -147,7 +147,7 @@ static void *mmap_file(char const *fname) addr =mmap (0 , sb.st_size,PROT_READ |PROT_WRITE ,MAP_PRIVATE , fd_map,0 ); mmap_failed =0 ; -if (MAP_FAILED == addr) { +if (addr ==MAP_FAILED ) { mmap_failed =1 ; addr =umalloc (sb.st_size);uread (fd_map, addr, sb.st_size);
@@ -206,12 +206,12 @@ static uint32_t (*w2)(uint16_t);static int is_mcounted_section_name (char const *const txtname) { -return 0 ==strcmp (".text" , txtname) || -0 ==strcmp (".ref.text" , txtname) || -0 ==strcmp (".sched.text" , txtname) || -0 ==strcmp (".spinlock.text" , txtname) || -0 ==strcmp (".irqentry.text" , txtname) || -0 ==strcmp (".text.unlikely" , txtname); +return strcmp (".text" , txtname) ==0 || +strcmp (".ref.text" , txtname) ==0 || +strcmp (".sched.text" , txtname) ==0 || +strcmp (".spinlock.text" , txtname) ==0 || +strcmp (".irqentry.text" , txtname) ==0 || +strcmp (".text.unlikely" , txtname) ==0 ; }/* 32 bit and 64 bit are very similar */
@@ -270,7 +270,7 @@ do_file(char const *const fname)fail_file (); }break ;case ELFDATA2LSB : { -if (1 != *(unsigned char const *)&endian) { +if (*(unsigned char const *)&endian !=1 ) {/* main() is big endian, file.o is little endian. */ w = w4rev; w2 = w2rev;
@@ -278,7 +278,7 @@ do_file(char const *const fname) } }break ;case ELFDATA2MSB : { -if (0 != *(unsigned char const *)&endian) { +if (*(unsigned char const *)&endian !=0 ) {/* main() is little endian, file.o is big endian. */ w = w4rev; w2 = w2rev;
@@ -286,9 +286,9 @@ do_file(char const *const fname) } }break ; }/* end switch */ -if (0 !=memcmp (ELFMAG , ehdr->e_ident,SELFMAG ) - ||ET_REL !=w2 (ehdr->e_type) - ||EV_CURRENT != ehdr->e_ident[EI_VERSION ]) { +if (memcmp (ELFMAG , ehdr->e_ident,SELFMAG ) !=0 + ||w2 (ehdr->e_type) !=ET_REL + || ehdr->e_ident[EI_VERSION ] !=EV_CURRENT ) {fprintf (stderr,"unrecognized ET_REL file %s\n" , fname);fail_file (); }
@@ -321,15 +321,15 @@ do_file(char const *const fname)fail_file (); }break ;case ELFCLASS32 : { -if (sizeof (Elf32_Ehdr) !=w2 (ehdr->e_ehsize) - ||sizeof (Elf32_Shdr) !=w2 (ehdr->e_shentsize)) { +if (w2 (ehdr->e_ehsize) !=sizeof (Elf32_Ehdr) + ||w2 (ehdr->e_shentsize) !=sizeof (Elf32_Shdr)) {fprintf (stderr,"unrecognized ET_REL file: %s\n" , fname);fail_file (); } -if (EM_S390 ==w2 (ehdr->e_machine)) +if (w2 (ehdr->e_machine) ==EM_S390 ) reltype =R_390_32 ; -if (EM_MIPS ==w2 (ehdr->e_machine)) { +if (w2 (ehdr->e_machine) ==EM_MIPS ) { reltype =R_MIPS_32 ; is_fake_mcount32 = MIPS32_is_fake_mcount; }
@@ -337,15 +337,15 @@ do_file(char const *const fname) }break ;case ELFCLASS64 : {Elf64_Ehdr *const ghdr = (Elf64_Ehdr *)ehdr; -if (sizeof (Elf64_Ehdr) !=w2 (ghdr->e_ehsize) - ||sizeof (Elf64_Shdr) !=w2 (ghdr->e_shentsize)) { +if (w2 (ghdr->e_ehsize) !=sizeof (Elf64_Ehdr) + ||w2 (ghdr->e_shentsize) !=sizeof (Elf64_Shdr)) {fprintf (stderr,"unrecognized ET_REL file: %s\n" , fname);fail_file (); } -if (EM_S390 ==w2 (ghdr->e_machine)) +if (w2 (ghdr->e_machine) ==EM_S390 ) reltype =R_390_64 ; -if (EM_MIPS ==w2 (ghdr->e_machine)) { +if (w2 (ghdr->e_machine) ==EM_MIPS ) { reltype =R_MIPS_64 ; Elf64_r_sym = MIPS64_r_sym; Elf64_r_info = MIPS64_r_info;
@@ -371,7 +371,7 @@ main(int argc, char const *argv[]) }/* Process each file in turn, allowing deep failure. */ -for (--argc, ++argv;0 < argc; --argc, ++argv) { +for (--argc, ++argv; argc >0 ; --argc, ++argv) {int const sjval =setjmp (jmpenv);int len;
scripts/recordmcount.h +8 -8
@@ -275,12 +275,12 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,Elf_Sym const *const symp = &sym0[Elf_r_sym (relp)];char const *symname = &str0[w (symp->st_name)]; -char const *mcount ='_' == gpfx ?"_mcount" :"mcount" ; +char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; -if ('.' == symname[0 ]) +if (symname[0 ] =='.' ) ++symname;/* ppc64 hack */ -if (0 ==strcmp (mcount, symname) || - (altmcount &&0 ==strcmp (altmcount, symname))) +if (strcmp (mcount, symname) ==0 || + (altmcount &&strcmp (altmcount, symname) ==0 )) mcountsym =Elf_r_sym (relp); }
@@ -290,7 +290,7 @@ static uint_t *sift_rel_mcount(uint_t *mlocp, mrelp->r_offset =_w (offbase + ((void *)mlocp - (void *)mloc0));Elf_r_info (mrelp, recsym, reltype); -if (sizeof (Elf_Rela) == rel_entsize) { +if (rel_entsize ==sizeof (Elf_Rela)) { ((Elf_Rela *)mrelp)->r_addend = addend; *mlocp++ =0 ; }else
@@ -354,12 +354,12 @@ __has_rel_mcount(Elf_Shdr const *const relhdr, /* is SHT_REL or SHT_RELA */Elf_Shdr const *const txthdr = &shdr0[w (relhdr->sh_info)];char const *const txtname = &shstrtab[w (txthdr->sh_name)]; -if (0 ==strcmp ("__mcount_loc" , txtname)) { +if (strcmp ("__mcount_loc" , txtname) ==0 ) {fprintf (stderr,"warning: __mcount_loc already exists: %s\n" , fname);succeed_file (); } -if (SHT_PROGBITS !=w (txthdr->sh_type) || +if (w (txthdr->sh_type) !=SHT_PROGBITS || !is_mcounted_section_name (txtname))return NULL ;return txtname;
@@ -370,7 +370,7 @@ static char const *has_rel_mcount(Elf_Shdr const *const relhdr,char const *const shstrtab, char const *const fname) { - if (SHT_REL != w(relhdr->sh_type) && SHT_RELA != w(relhdr->sh_type)) + if (w(relhdr->sh_type) != SHT_REL && w(relhdr->sh_type) != SHT_RELA) return NULL; return __has_rel_mcount(relhdr, shdr0, shstrtab, fname); }
[tip:perf/core] ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
In reply to Steven RostedtCommit-ID: c6fece27dfa46abc8c4b87d94a8c2f8cd6c5d8b1 Gitweb: http://git.kernel.org/tip/c6fece27dfa46abc8c4b87d94a8c2f8cd6c5d8b1 Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 6 Apr 2011 13:21:17 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Tue, 17 May 2011 10:41:30 -0400
ftrace/trivial: Clean up recordmcount.c to use Linux style comparisons
The Linux ftrace subsystem style for comparing is:
var == 1
var > 0
and not:
1 == var
0 < var
It is considered that Linux developers are smart enough not to do the
if (var = 1)
mistake.
--- scripts/recordmcount.c | 48 ++++++++++++++++++++++++------------------------ scripts/recordmcount.h | 16 ++++++++-------- 2 files changed, 32 insertions(+), 32 deletions(-)
scripts/recordmcount.c +24 -24
@@ -78,7 +78,7 @@ static off_t ulseek(int const fd, off_t const offset, int const whence) { off_t const w = lseek(fd, offset, whence); -if ((off_t)-1 == w) { +if (w == (off_t)-1 ) {perror ("lseek" );fail_file (); }
@@ -111,7 +111,7 @@ static void * umalloc(size_t size) {void *const addr =malloc (size); -if (0 == addr) { +if (addr ==0 ) {fprintf (stderr,"malloc failed: %zu bytes\n" , size);fail_file (); }
@@ -136,7 +136,7 @@ static void *mmap_file(char const *fname)void *addr; fd_map =open (fname,O_RDWR ); -if (0 > fd_map ||0 >fstat (fd_map, &sb)) { +if (fd_map <0 ||fstat (fd_map, &sb) <0 ) {perror (fname);fail_file (); }
@@ -147,7 +147,7 @@ static void *mmap_file(char const *fname) addr =mmap (0 , sb.st_size,PROT_READ |PROT_WRITE ,MAP_PRIVATE , fd_map,0 ); mmap_failed =0 ; -if (MAP_FAILED == addr) { +if (addr ==MAP_FAILED ) { mmap_failed =1 ; addr =umalloc (sb.st_size);uread (fd_map, addr, sb.st_size);
@@ -206,12 +206,12 @@ static uint32_t (*w2)(uint16_t);static int is_mcounted_section_name (char const *const txtname) { -return 0 ==strcmp (".text" , txtname) || -0 ==strcmp (".ref.text" , txtname) || -0 ==strcmp (".sched.text" , txtname) || -0 ==strcmp (".spinlock.text" , txtname) || -0 ==strcmp (".irqentry.text" , txtname) || -0 ==strcmp (".text.unlikely" , txtname); +return strcmp (".text" , txtname) ==0 || +strcmp (".ref.text" , txtname) ==0 || +strcmp (".sched.text" , txtname) ==0 || +strcmp (".spinlock.text" , txtname) ==0 || +strcmp (".irqentry.text" , txtname) ==0 || +strcmp (".text.unlikely" , txtname) ==0 ; }/* 32 bit and 64 bit are very similar */
@@ -270,7 +270,7 @@ do_file(char const *const fname)fail_file (); }break ;case ELFDATA2LSB : { -if (1 != *(unsigned char const *)&endian) { +if (*(unsigned char const *)&endian !=1 ) {/* main() is big endian, file.o is little endian. */ w = w4rev; w2 = w2rev;
@@ -278,7 +278,7 @@ do_file(char const *const fname) } }break ;case ELFDATA2MSB : { -if (0 != *(unsigned char const *)&endian) { +if (*(unsigned char const *)&endian !=0 ) {/* main() is little endian, file.o is big endian. */ w = w4rev; w2 = w2rev;
@@ -286,9 +286,9 @@ do_file(char const *const fname) } }break ; }/* end switch */ -if (0 !=memcmp (ELFMAG , ehdr->e_ident,SELFMAG ) - ||ET_REL !=w2 (ehdr->e_type) - ||EV_CURRENT != ehdr->e_ident[EI_VERSION ]) { +if (memcmp (ELFMAG , ehdr->e_ident,SELFMAG ) !=0 + ||w2 (ehdr->e_type) !=ET_REL + || ehdr->e_ident[EI_VERSION ] !=EV_CURRENT ) {fprintf (stderr,"unrecognized ET_REL file %s\n" , fname);fail_file (); }
@@ -321,15 +321,15 @@ do_file(char const *const fname)fail_file (); }break ;case ELFCLASS32 : { -if (sizeof (Elf32_Ehdr) !=w2 (ehdr->e_ehsize) - ||sizeof (Elf32_Shdr) !=w2 (ehdr->e_shentsize)) { +if (w2 (ehdr->e_ehsize) !=sizeof (Elf32_Ehdr) + ||w2 (ehdr->e_shentsize) !=sizeof (Elf32_Shdr)) {fprintf (stderr,"unrecognized ET_REL file: %s\n" , fname);fail_file (); } -if (EM_S390 ==w2 (ehdr->e_machine)) +if (w2 (ehdr->e_machine) ==EM_S390 ) reltype =R_390_32 ; -if (EM_MIPS ==w2 (ehdr->e_machine)) { +if (w2 (ehdr->e_machine) ==EM_MIPS ) { reltype =R_MIPS_32 ; is_fake_mcount32 = MIPS32_is_fake_mcount; }
@@ -337,15 +337,15 @@ do_file(char const *const fname) }break ;case ELFCLASS64 : {Elf64_Ehdr *const ghdr = (Elf64_Ehdr *)ehdr; -if (sizeof (Elf64_Ehdr) !=w2 (ghdr->e_ehsize) - ||sizeof (Elf64_Shdr) !=w2 (ghdr->e_shentsize)) { +if (w2 (ghdr->e_ehsize) !=sizeof (Elf64_Ehdr) + ||w2 (ghdr->e_shentsize) !=sizeof (Elf64_Shdr)) {fprintf (stderr,"unrecognized ET_REL file: %s\n" , fname);fail_file (); } -if (EM_S390 ==w2 (ghdr->e_machine)) +if (w2 (ghdr->e_machine) ==EM_S390 ) reltype =R_390_64 ; -if (EM_MIPS ==w2 (ghdr->e_machine)) { +if (w2 (ghdr->e_machine) ==EM_MIPS ) { reltype =R_MIPS_64 ; Elf64_r_sym = MIPS64_r_sym; Elf64_r_info = MIPS64_r_info;
@@ -371,7 +371,7 @@ main(int argc, char const *argv[]) }/* Process each file in turn, allowing deep failure. */ -for (--argc, ++argv;0 < argc; --argc, ++argv) { +for (--argc, ++argv; argc >0 ; --argc, ++argv) {int const sjval =setjmp (jmpenv);int len;
scripts/recordmcount.h +8 -8
@@ -275,12 +275,12 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,Elf_Sym const *const symp = &sym0[Elf_r_sym (relp)];char const *symname = &str0[w (symp->st_name)]; -char const *mcount ='_' == gpfx ?"_mcount" :"mcount" ; +char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; -if ('.' == symname[0 ]) +if (symname[0 ] =='.' ) ++symname;/* ppc64 hack */ -if (0 ==strcmp (mcount, symname) || - (altmcount &&0 ==strcmp (altmcount, symname))) +if (strcmp (mcount, symname) ==0 || + (altmcount &&strcmp (altmcount, symname) ==0 )) mcountsym =Elf_r_sym (relp); }
@@ -290,7 +290,7 @@ static uint_t *sift_rel_mcount(uint_t *mlocp, mrelp->r_offset =_w (offbase + ((void *)mlocp - (void *)mloc0));Elf_r_info (mrelp, recsym, reltype); -if (sizeof (Elf_Rela) == rel_entsize) { +if (rel_entsize ==sizeof (Elf_Rela)) { ((Elf_Rela *)mrelp)->r_addend = addend; *mlocp++ =0 ; }else
@@ -354,12 +354,12 @@ __has_rel_mcount(Elf_Shdr const *const relhdr, /* is SHT_REL or SHT_RELA */Elf_Shdr const *const txthdr = &shdr0[w (relhdr->sh_info)];char const *const txtname = &shstrtab[w (txthdr->sh_name)]; -if (0 ==strcmp ("__mcount_loc" , txtname)) { +if (strcmp ("__mcount_loc" , txtname) ==0 ) {fprintf (stderr,"warning: __mcount_loc already exists: %s\n" , fname);succeed_file (); } -if (SHT_PROGBITS !=w (txthdr->sh_type) || +if (w (txthdr->sh_type) !=SHT_PROGBITS || !is_mcounted_section_name (txtname))return NULL ;return txtname;
@@ -370,7 +370,7 @@ static char const *has_rel_mcount(Elf_Shdr const *const relhdr,char const *const shstrtab, char const *const fname) { - if (SHT_REL != w(relhdr->sh_type) && SHT_RELA != w(relhdr->sh_type)) + if (w(relhdr->sh_type) != SHT_REL && w(relhdr->sh_type) != SHT_RELA) return NULL; return __has_rel_mcount(relhdr, shdr0, shstrtab, fname); }
RFC PATCH 2/11 ftrace/trivial: Clean up record mcount to use Linux switch style
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
The Linux style for switch statements is:
switch (var) {
case x:
[...]
break;
}Not:
switch (var) {
case x: {
[...]
} break;--- scripts/recordmcount.c | 43 ++++++++++++++++++++++--------------------- 1 files changed, 22 insertions(+), 21 deletions(-)
scripts/recordmcount.c +22 -21
@@ -264,27 +264,27 @@ do_file(char const *const fname) w8 = w8nat;switch (ehdr->e_ident[EI_DATA ]) {static unsigned int const endian =1 ; -default : { +default :fprintf (stderr,"unrecognized ELF data encoding %d: %s\n" , ehdr->e_ident[EI_DATA ], fname);fail_file (); - }break ; -case ELFDATA2LSB : { +break ; +case ELFDATA2LSB :if (*(unsigned char const *)&endian !=1 ) {/* main() is big endian, file.o is little endian. */ w = w4rev; w2 = w2rev; w8 = w8rev; } - }break ; -case ELFDATA2MSB : { +break ; +case ELFDATA2MSB :if (*(unsigned char const *)&endian !=0 ) {/* main() is little endian, file.o is big endian. */ w = w4rev; w2 = w2rev; w8 = w8rev; } - }break ; +break ; }/* end switch */ if (memcmp (ELFMAG , ehdr->e_ident,SELFMAG ) !=0 || w2(ehdr->e_type) != ET_REL
@@ -295,11 +295,11 @@ do_file(char const *const fname) gpfx =0 ;switch (w2 (ehdr->e_machine)) { -default : { +default :fprintf (stderr,"unrecognized e_machine %d %s\n" ,w2 (ehdr->e_machine), fname);fail_file (); - }break ; +break ;case EM_386 : reltype =R_386_32 ;break ;case EM_ARM : reltype =R_ARM_ABS32 ; altmcount ="__gnu_mcount_nc" ;
@@ -315,12 +315,12 @@ do_file(char const *const fname) }/* end switch */ switch (ehdr->e_ident[EI_CLASS ]) { -default : { +default :fprintf (stderr,"unrecognized ELF class %d %s\n" , ehdr->e_ident[EI_CLASS ], fname);fail_file (); - }break ; -case ELFCLASS32 : { +break ; +case ELFCLASS32 :if (w2 (ehdr->e_ehsize) !=sizeof (Elf32_Ehdr) ||w2 (ehdr->e_shentsize) !=sizeof (Elf32_Shdr)) { fprintf(stderr,
@@ -334,7 +334,7 @@ do_file(char const *const fname) is_fake_mcount32 = MIPS32_is_fake_mcount; }do32 (ehdr, fname, reltype); - }break ; +break ;case ELFCLASS64 : {Elf64_Ehdr *const ghdr = (Elf64_Ehdr *)ehdr; if (w2(ghdr->e_ehsize) != sizeof(Elf64_Ehdr)
@@ -352,7 +352,8 @@ do_file(char const *const fname) is_fake_mcount64 = MIPS64_is_fake_mcount; }do64 (ghdr, fname, reltype); - }break ; +break ; + } }/* end switch */ cleanup ();
@@ -386,23 +387,23 @@ main(int argc, char const *argv[])continue ;switch (sjval) { -default : { +default :fprintf (stderr,"internal error: %s\n" , argv[0 ]);exit (1 ); - }break ; -case SJ_SETJMP : {/* normal sequence */ +break ; +case SJ_SETJMP :/* normal sequence */ /* Avoid problems if early cleanup() */ fd_map =-1 ; ehdr_curr =NULL ; mmap_failed =1 ;do_file (argv[0 ]); - }break ; -case SJ_FAIL : {/* error in do_file or below */ +break ; +case SJ_FAIL :/* error in do_file or below */ ++n_error; - }break ; -case SJ_SUCCEED : {/* premature success */ +break ; +case SJ_SUCCEED :/* premature success */ /* do nothing */ - }break ; +break ; }/* end switch */ }return !!n_error;
Signature · 1 line
1.7.2.3
[tip:perf/core] ftrace/trivial: Clean up record mcount to use Linux switch style
Commit-ID: e90b0c8bf211958a296d60369fecd51b35864407 Gitweb: http://git.kernel.org/tip/e90b0c8bf211958a296d60369fecd51b35864407 Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 6 Apr 2011 13:32:24 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Mon, 16 May 2011 14:41:07 -0400
ftrace/trivial: Clean up record mcount to use Linux switch style
The Linux style for switch statements is:
switch (var) {
case x:
[...]
break;
}Not:
switch (var) {
case x: {
[...]
} break;--- scripts/recordmcount.c | 43 ++++++++++++++++++++++--------------------- 1 files changed, 22 insertions(+), 21 deletions(-)
scripts/recordmcount.c +22 -21
@@ -264,27 +264,27 @@ do_file(char const *const fname) w8 = w8nat;switch (ehdr->e_ident[EI_DATA ]) {static unsigned int const endian =1 ; -default : { +default :fprintf (stderr,"unrecognized ELF data encoding %d: %s\n" , ehdr->e_ident[EI_DATA ], fname);fail_file (); - }break ; -case ELFDATA2LSB : { +break ; +case ELFDATA2LSB :if (*(unsigned char const *)&endian !=1 ) {/* main() is big endian, file.o is little endian. */ w = w4rev; w2 = w2rev; w8 = w8rev; } - }break ; -case ELFDATA2MSB : { +break ; +case ELFDATA2MSB :if (*(unsigned char const *)&endian !=0 ) {/* main() is little endian, file.o is big endian. */ w = w4rev; w2 = w2rev; w8 = w8rev; } - }break ; +break ; }/* end switch */ if (memcmp (ELFMAG , ehdr->e_ident,SELFMAG ) !=0 || w2(ehdr->e_type) != ET_REL
@@ -295,11 +295,11 @@ do_file(char const *const fname) gpfx =0 ;switch (w2 (ehdr->e_machine)) { -default : { +default :fprintf (stderr,"unrecognized e_machine %d %s\n" ,w2 (ehdr->e_machine), fname);fail_file (); - }break ; +break ;case EM_386 : reltype =R_386_32 ;break ;case EM_ARM : reltype =R_ARM_ABS32 ; altmcount ="__gnu_mcount_nc" ;
@@ -315,12 +315,12 @@ do_file(char const *const fname) }/* end switch */ switch (ehdr->e_ident[EI_CLASS ]) { -default : { +default :fprintf (stderr,"unrecognized ELF class %d %s\n" , ehdr->e_ident[EI_CLASS ], fname);fail_file (); - }break ; -case ELFCLASS32 : { +break ; +case ELFCLASS32 :if (w2 (ehdr->e_ehsize) !=sizeof (Elf32_Ehdr) ||w2 (ehdr->e_shentsize) !=sizeof (Elf32_Shdr)) { fprintf(stderr,
@@ -334,7 +334,7 @@ do_file(char const *const fname) is_fake_mcount32 = MIPS32_is_fake_mcount; }do32 (ehdr, fname, reltype); - }break ; +break ;case ELFCLASS64 : {Elf64_Ehdr *const ghdr = (Elf64_Ehdr *)ehdr; if (w2(ghdr->e_ehsize) != sizeof(Elf64_Ehdr)
@@ -352,7 +352,8 @@ do_file(char const *const fname) is_fake_mcount64 = MIPS64_is_fake_mcount; }do64 (ghdr, fname, reltype); - }break ; +break ; + } }/* end switch */ cleanup ();
@@ -386,23 +387,23 @@ main(int argc, char const *argv[])continue ;switch (sjval) { -default : { +default :fprintf (stderr,"internal error: %s\n" , argv[0 ]);exit (1 ); - }break ; -case SJ_SETJMP : {/* normal sequence */ +break ; +case SJ_SETJMP :/* normal sequence */ /* Avoid problems if early cleanup() */ fd_map =-1 ; ehdr_curr =NULL ; mmap_failed =1 ;do_file (argv[0 ]); - }break ; -case SJ_FAIL : {/* error in do_file or below */ +break ; +case SJ_FAIL :/* error in do_file or below */ ++n_error; - }break ; -case SJ_SUCCEED : {/* premature success */ +break ; +case SJ_SUCCEED :/* premature success */ /* do nothing */ - }break ; +break ; }/* end switch */ }return !!n_error;
[tip:perf/core] ftrace/trivial: Clean up record mcount to use Linux switch style
In reply to Steven RostedtCommit-ID: d7e8623ae9cf93a9b517336085a86cabb014ea77 Gitweb: http://git.kernel.org/tip/d7e8623ae9cf93a9b517336085a86cabb014ea77 Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 6 Apr 2011 13:32:24 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Tue, 17 May 2011 10:41:33 -0400
ftrace/trivial: Clean up record mcount to use Linux switch style
The Linux style for switch statements is:
switch (var) {
case x:
[...]
break;
}Not:
switch (var) {
case x: {
[...]
} break;--- scripts/recordmcount.c | 43 ++++++++++++++++++++++--------------------- 1 files changed, 22 insertions(+), 21 deletions(-)
scripts/recordmcount.c +22 -21
@@ -264,27 +264,27 @@ do_file(char const *const fname) w8 = w8nat;switch (ehdr->e_ident[EI_DATA ]) {static unsigned int const endian =1 ; -default : { +default :fprintf (stderr,"unrecognized ELF data encoding %d: %s\n" , ehdr->e_ident[EI_DATA ], fname);fail_file (); - }break ; -case ELFDATA2LSB : { +break ; +case ELFDATA2LSB :if (*(unsigned char const *)&endian !=1 ) {/* main() is big endian, file.o is little endian. */ w = w4rev; w2 = w2rev; w8 = w8rev; } - }break ; -case ELFDATA2MSB : { +break ; +case ELFDATA2MSB :if (*(unsigned char const *)&endian !=0 ) {/* main() is little endian, file.o is big endian. */ w = w4rev; w2 = w2rev; w8 = w8rev; } - }break ; +break ; }/* end switch */ if (memcmp (ELFMAG , ehdr->e_ident,SELFMAG ) !=0 || w2(ehdr->e_type) != ET_REL
@@ -295,11 +295,11 @@ do_file(char const *const fname) gpfx =0 ;switch (w2 (ehdr->e_machine)) { -default : { +default :fprintf (stderr,"unrecognized e_machine %d %s\n" ,w2 (ehdr->e_machine), fname);fail_file (); - }break ; +break ;case EM_386 : reltype =R_386_32 ;break ;case EM_ARM : reltype =R_ARM_ABS32 ; altmcount ="__gnu_mcount_nc" ;
@@ -315,12 +315,12 @@ do_file(char const *const fname) }/* end switch */ switch (ehdr->e_ident[EI_CLASS ]) { -default : { +default :fprintf (stderr,"unrecognized ELF class %d %s\n" , ehdr->e_ident[EI_CLASS ], fname);fail_file (); - }break ; -case ELFCLASS32 : { +break ; +case ELFCLASS32 :if (w2 (ehdr->e_ehsize) !=sizeof (Elf32_Ehdr) ||w2 (ehdr->e_shentsize) !=sizeof (Elf32_Shdr)) { fprintf(stderr,
@@ -334,7 +334,7 @@ do_file(char const *const fname) is_fake_mcount32 = MIPS32_is_fake_mcount; }do32 (ehdr, fname, reltype); - }break ; +break ;case ELFCLASS64 : {Elf64_Ehdr *const ghdr = (Elf64_Ehdr *)ehdr; if (w2(ghdr->e_ehsize) != sizeof(Elf64_Ehdr)
@@ -352,7 +352,8 @@ do_file(char const *const fname) is_fake_mcount64 = MIPS64_is_fake_mcount; }do64 (ghdr, fname, reltype); - }break ; +break ; + } }/* end switch */ cleanup ();
@@ -386,23 +387,23 @@ main(int argc, char const *argv[])continue ;switch (sjval) { -default : { +default :fprintf (stderr,"internal error: %s\n" , argv[0 ]);exit (1 ); - }break ; -case SJ_SETJMP : {/* normal sequence */ +break ; +case SJ_SETJMP :/* normal sequence */ /* Avoid problems if early cleanup() */ fd_map =-1 ; ehdr_curr =NULL ; mmap_failed =1 ;do_file (argv[0 ]); - }break ; -case SJ_FAIL : {/* error in do_file or below */ +break ; +case SJ_FAIL :/* error in do_file or below */ ++n_error; - }break ; -case SJ_SUCCEED : {/* premature success */ +break ; +case SJ_SUCCEED :/* premature success */ /* do nothing */ - }break ; +break ; }/* end switch */ }return !!n_error;
RFC PATCH 3/11 ftrace: Add .kprobe.text section to whitelist for recordmcount.c
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
The .kprobe.text section is safe to modify mcount to nop and tracing. Add it to the whitelist in recordmcount.c and recordmcount.pl.
--- scripts/recordmcount.c | 1 + scripts/recordmcount.pl | 1 + 2 files changed, 2 insertions(+), 0 deletions(-)
scripts/recordmcount.c +1 -0
@@ -211,6 +211,7 @@ is_mcounted_section_name(char const *const txtname)strcmp (".sched.text" , txtname) ==0 ||strcmp (".spinlock.text" , txtname) ==0 ||strcmp (".irqentry.text" , txtname) ==0 || +strcmp (".kprobes.text" , txtname) ==0 ||strcmp (".text.unlikely" , txtname) ==0 ; }
scripts/recordmcount.pl +1 -0
@@ -134,6 +134,7 @@ my %text_sections = ( ".sched.text" => 1, ".spinlock.text" => 1, ".irqentry.text" => 1, + ".kprobes.text" => 1, ".text.unlikely" => 1, );
Signature · 1 line
1.7.2.3
[tip:perf/core] ftrace: Add .kprobe.text section to whitelist for recordmcount.c
Commit-ID: 9f087e7612115b7a201d4f3392a95ac7408948ab Gitweb: http://git.kernel.org/tip/9f087e7612115b7a201d4f3392a95ac7408948ab Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 6 Apr 2011 14:10:22 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Mon, 16 May 2011 14:42:15 -0400
ftrace: Add .kprobe.text section to whitelist for recordmcount.c
The .kprobe.text section is safe to modify mcount to nop and tracing. Add it to the whitelist in recordmcount.c and recordmcount.pl.
--- scripts/recordmcount.c | 1 + scripts/recordmcount.pl | 1 + 2 files changed, 2 insertions(+), 0 deletions(-)
scripts/recordmcount.c +1 -0
@@ -211,6 +211,7 @@ is_mcounted_section_name(char const *const txtname)strcmp (".sched.text" , txtname) ==0 ||strcmp (".spinlock.text" , txtname) ==0 ||strcmp (".irqentry.text" , txtname) ==0 || +strcmp (".kprobes.text" , txtname) ==0 ||strcmp (".text.unlikely" , txtname) ==0 ; }
scripts/recordmcount.pl +1 -0
@@ -134,6 +134,7 @@ my %text_sections = ( ".sched.text" => 1, ".spinlock.text" => 1, ".irqentry.text" => 1, + ".kprobes.text" => 1, ".text.unlikely" => 1, );
[tip:perf/core] ftrace: Add .kprobe.text section to whitelist for recordmcount.c
In reply to Steven RostedtCommit-ID: bde66c3f45d777082a0df01e64870f47ba2a5055 Gitweb: http://git.kernel.org/tip/bde66c3f45d777082a0df01e64870f47ba2a5055 Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 6 Apr 2011 14:10:22 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Tue, 17 May 2011 10:41:36 -0400
ftrace: Add .kprobe.text section to whitelist for recordmcount.c
The .kprobe.text section is safe to modify mcount to nop and tracing. Add it to the whitelist in recordmcount.c and recordmcount.pl.
--- scripts/recordmcount.c | 1 + scripts/recordmcount.pl | 1 + 2 files changed, 2 insertions(+), 0 deletions(-)
scripts/recordmcount.c +1 -0
@@ -211,6 +211,7 @@ is_mcounted_section_name(char const *const txtname)strcmp (".sched.text" , txtname) ==0 ||strcmp (".spinlock.text" , txtname) ==0 ||strcmp (".irqentry.text" , txtname) ==0 || +strcmp (".kprobes.text" , txtname) ==0 ||strcmp (".text.unlikely" , txtname) ==0 ; }
scripts/recordmcount.pl +1 -0
@@ -134,6 +134,7 @@ my %text_sections = ( ".sched.text" => 1, ".spinlock.text" => 1, ".irqentry.text" => 1, + ".kprobes.text" => 1, ".text.unlikely" => 1, );
RFC PATCH 4/11 ftrace/recordmcount: Modify only executable sections
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
PROGBITS is not enough to determine if the section should be modified or not. Only process sections that are marked as executable.
--- scripts/recordmcount.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
scripts/recordmcount.h +1 -0
@@ -360,6 +360,7 @@ __has_rel_mcount(Elf_Shdr const *const relhdr, /* is SHT_REL or SHT_RELA */succeed_file (); }if (w (txthdr->sh_type) !=SHT_PROGBITS || + !(w (txthdr->sh_flags) &SHF_EXECINSTR ) || !is_mcounted_section_name (txtname))return NULL ;return txtname;
Signature · 1 line
1.7.2.3
[tip:perf/core] ftrace/recordmcount: Modify only executable sections
Commit-ID: 8abd5724a7f1631ab2276954156c629d4d17149a Gitweb: http://git.kernel.org/tip/8abd5724a7f1631ab2276954156c629d4d17149a Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 13 Apr 2011 13:31:08 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Mon, 16 May 2011 14:42:56 -0400
ftrace/recordmcount: Modify only executable sections
PROGBITS is not enough to determine if the section should be modified or not. Only process sections that are marked as executable.
--- scripts/recordmcount.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
scripts/recordmcount.h +1 -0
@@ -360,6 +360,7 @@ __has_rel_mcount(Elf_Shdr const *const relhdr, /* is SHT_REL or SHT_RELA */succeed_file (); }if (w (txthdr->sh_type) !=SHT_PROGBITS || + !(w (txthdr->sh_flags) &SHF_EXECINSTR ) || !is_mcounted_section_name (txtname))return NULL ;return txtname;
[tip:perf/core] ftrace/recordmcount: Modify only executable sections
In reply to Steven RostedtCommit-ID: df2ccb69454d022ce99e3a3b7ee7f9fb4a4e9563 Gitweb: http://git.kernel.org/tip/df2ccb69454d022ce99e3a3b7ee7f9fb4a4e9563 Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 13 Apr 2011 13:31:08 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Tue, 17 May 2011 10:41:39 -0400
ftrace/recordmcount: Modify only executable sections
PROGBITS is not enough to determine if the section should be modified or not. Only process sections that are marked as executable.
--- scripts/recordmcount.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
scripts/recordmcount.h +1 -0
@@ -360,6 +360,7 @@ __has_rel_mcount(Elf_Shdr const *const relhdr, /* is SHT_REL or SHT_RELA */succeed_file (); }if (w (txthdr->sh_type) !=SHT_PROGBITS || + !(w (txthdr->sh_flags) &SHF_EXECINSTR ) || !is_mcounted_section_name (txtname))return NULL ;return txtname;
RFC PATCH 5/11 ftrace/recordmcount: Make ignored mcount calls into nops at compile time
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
There are sections that are ignored by ftrace for the function tracing because the text is in a section that can be removed without notice. The mcount calls in these sections are ignored and ftrace never sees them. The downside of this is that the functions in these sections still call mcount. Although the mcount function is defined in assembly simply as a return, this added overhead is unnecessary.
The solution is to convert these callers into nops at compile time. A better solution is to add 'notrace' to the section markers, but as new sections come up all the time, it would be nice that they are delt with when they are created.
Later patches will deal with finding these sections and doing the proper solution.
Thanks to H. Peter Anvin for giving me the right nops to use for x86.
--- scripts/recordmcount.c | 40 ++++++++++++++++++++++- scripts/recordmcount.h | 82 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 116 insertions(+), 6 deletions(-)
scripts/recordmcount.c +38 -2
@@ -118,6 +118,34 @@ umalloc(size_t size)return addr; } +static unsigned char ideal_nop5_x86_64[5 ] = {0x0f ,0x1f ,0x44 ,0x00 ,0x00 }; +static unsigned char ideal_nop5_x86_32[5 ] = {0x3e ,0x8d ,0x74 ,0x26 ,0x00 }; +static unsigned char *ideal_nop; + +static char rel_type_nop; + +static int (*make_nop)(void *map,size_t const offset); + +static int make_nop_x86 (void *map,size_t const offset) +{ +uint32_t *ptr; +unsigned char *op; + +/* Confirm we have 0xe8 0x0 0x0 0x0 0x0 */ + ptr = map + offset; +if (*ptr !=0 ) +return -1 ; + + op = map + offset -1 ; +if (*op !=0xe8 ) +return -1 ; + +/* convert to nop */ +ulseek (fd_map, offset -1 ,SEEK_SET ); +uwrite (fd_map, ideal_nop,5 ); +return 0 ; +} +/* * Get the whole file as a programming convenience in order to avoid * malloc+lseek+read+free of many pieces. If successful, then mmap
@@ -301,7 +329,11 @@ do_file(char const *const fname) w2(ehdr->e_machine), fname);fail_file ();break ; -case EM_386 : reltype =R_386_32 ;break ; +case EM_386 : + reltype =R_386_32 ; + make_nop = make_nop_x86; + ideal_nop = ideal_nop5_x86_32; +break ;case EM_ARM : reltype =R_ARM_ABS32 ; altmcount ="__gnu_mcount_nc" ;break ;
@@ -312,7 +344,11 @@ do_file(char const *const fname)case EM_S390 :/* reltype: e_class */ gpfx ='_' ;break ;case EM_SH : reltype =R_SH_DIR32 ;break ;case EM_SPARCV9 : reltype =R_SPARC_64 ; gpfx ='_' ;break ; -case EM_X86_64 : reltype =R_X86_64_64 ;break ; +case EM_X86_64 : + make_nop = make_nop_x86; + ideal_nop = ideal_nop5_x86_64; + reltype =R_X86_64_64 ; +break ; }/* end switch */ switch (ehdr->e_ident[EI_CLASS ]) {
scripts/recordmcount.h +78 -4
132 lines not on this page · raw message
Signature · 1 line
1.7.2.3
[tip:perf/core] ftrace/recordmcount: Make ignored mcount calls into nops at compile time
Commit-ID: ffd618fa39284f8cc343894b566dd42ec6e74e77 Gitweb: http://git.kernel.org/tip/ffd618fa39284f8cc343894b566dd42ec6e74e77 Author: Steven Rostedt <[email protected]> AuthorDate: Fri, 8 Apr 2011 03:58:48 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Mon, 16 May 2011 14:43:32 -0400
ftrace/recordmcount: Make ignored mcount calls into nops at compile time
There are sections that are ignored by ftrace for the function tracing because the text is in a section that can be removed without notice. The mcount calls in these sections are ignored and ftrace never sees them. The downside of this is that the functions in these sections still call mcount. Although the mcount function is defined in assembly simply as a return, this added overhead is unnecessary.
The solution is to convert these callers into nops at compile time. A better solution is to add 'notrace' to the section markers, but as new sections come up all the time, it would be nice that they are delt with when they are created.
Later patches will deal with finding these sections and doing the proper solution.
Thanks to H. Peter Anvin for giving me the right nops to use for x86.
--- scripts/recordmcount.c | 40 ++++++++++++++++++++++- scripts/recordmcount.h | 82 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 116 insertions(+), 6 deletions(-)
scripts/recordmcount.c +38 -2
@@ -118,6 +118,34 @@ umalloc(size_t size)return addr; } +static unsigned char ideal_nop5_x86_64[5 ] = {0x0f ,0x1f ,0x44 ,0x00 ,0x00 }; +static unsigned char ideal_nop5_x86_32[5 ] = {0x3e ,0x8d ,0x74 ,0x26 ,0x00 }; +static unsigned char *ideal_nop; + +static char rel_type_nop; + +static int (*make_nop)(void *map,size_t const offset); + +static int make_nop_x86 (void *map,size_t const offset) +{ +uint32_t *ptr; +unsigned char *op; + +/* Confirm we have 0xe8 0x0 0x0 0x0 0x0 */ + ptr = map + offset; +if (*ptr !=0 ) +return -1 ; + + op = map + offset -1 ; +if (*op !=0xe8 ) +return -1 ; + +/* convert to nop */ +ulseek (fd_map, offset -1 ,SEEK_SET ); +uwrite (fd_map, ideal_nop,5 ); +return 0 ; +} +/* * Get the whole file as a programming convenience in order to avoid * malloc+lseek+read+free of many pieces. If successful, then mmap
@@ -301,7 +329,11 @@ do_file(char const *const fname) w2(ehdr->e_machine), fname);fail_file ();break ; -case EM_386 : reltype =R_386_32 ;break ; +case EM_386 : + reltype =R_386_32 ; + make_nop = make_nop_x86; + ideal_nop = ideal_nop5_x86_32; +break ;case EM_ARM : reltype =R_ARM_ABS32 ; altmcount ="__gnu_mcount_nc" ;break ;
@@ -312,7 +344,11 @@ do_file(char const *const fname)case EM_S390 :/* reltype: e_class */ gpfx ='_' ;break ;case EM_SH : reltype =R_SH_DIR32 ;break ;case EM_SPARCV9 : reltype =R_SPARC_64 ; gpfx ='_' ;break ; -case EM_X86_64 : reltype =R_X86_64_64 ;break ; +case EM_X86_64 : + make_nop = make_nop_x86; + ideal_nop = ideal_nop5_x86_64; + reltype =R_X86_64_64 ; +break ; }/* end switch */ switch (ehdr->e_ident[EI_CLASS ]) {
scripts/recordmcount.h +78 -4
132 lines not on this page · raw message
[tip:perf/core] ftrace/recordmcount: Make ignored mcount calls into nops at compile time
In reply to Steven RostedtCommit-ID: 68eb1d2e5370c6da4c871c80fdccbe315dc2f3c1 Gitweb: http://git.kernel.org/tip/68eb1d2e5370c6da4c871c80fdccbe315dc2f3c1 Author: Steven Rostedt <[email protected]> AuthorDate: Fri, 8 Apr 2011 03:58:48 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Tue, 17 May 2011 10:41:42 -0400
ftrace/recordmcount: Make ignored mcount calls into nops at compile time
There are sections that are ignored by ftrace for the function tracing because the text is in a section that can be removed without notice. The mcount calls in these sections are ignored and ftrace never sees them. The downside of this is that the functions in these sections still call mcount. Although the mcount function is defined in assembly simply as a return, this added overhead is unnecessary.
The solution is to convert these callers into nops at compile time. A better solution is to add 'notrace' to the section markers, but as new sections come up all the time, it would be nice that they are delt with when they are created.
Later patches will deal with finding these sections and doing the proper solution.
Thanks to H. Peter Anvin for giving me the right nops to use for x86.
--- scripts/recordmcount.c | 40 ++++++++++++++++++++++- scripts/recordmcount.h | 82 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 116 insertions(+), 6 deletions(-)
scripts/recordmcount.c +38 -2
@@ -118,6 +118,34 @@ umalloc(size_t size)return addr; } +static unsigned char ideal_nop5_x86_64[5 ] = {0x0f ,0x1f ,0x44 ,0x00 ,0x00 }; +static unsigned char ideal_nop5_x86_32[5 ] = {0x3e ,0x8d ,0x74 ,0x26 ,0x00 }; +static unsigned char *ideal_nop; + +static char rel_type_nop; + +static int (*make_nop)(void *map,size_t const offset); + +static int make_nop_x86 (void *map,size_t const offset) +{ +uint32_t *ptr; +unsigned char *op; + +/* Confirm we have 0xe8 0x0 0x0 0x0 0x0 */ + ptr = map + offset; +if (*ptr !=0 ) +return -1 ; + + op = map + offset -1 ; +if (*op !=0xe8 ) +return -1 ; + +/* convert to nop */ +ulseek (fd_map, offset -1 ,SEEK_SET ); +uwrite (fd_map, ideal_nop,5 ); +return 0 ; +} +/* * Get the whole file as a programming convenience in order to avoid * malloc+lseek+read+free of many pieces. If successful, then mmap
@@ -301,7 +329,11 @@ do_file(char const *const fname) w2(ehdr->e_machine), fname);fail_file ();break ; -case EM_386 : reltype =R_386_32 ;break ; +case EM_386 : + reltype =R_386_32 ; + make_nop = make_nop_x86; + ideal_nop = ideal_nop5_x86_32; +break ;case EM_ARM : reltype =R_ARM_ABS32 ; altmcount ="__gnu_mcount_nc" ;break ;
@@ -312,7 +344,11 @@ do_file(char const *const fname)case EM_S390 :/* reltype: e_class */ gpfx ='_' ;break ;case EM_SH : reltype =R_SH_DIR32 ;break ;case EM_SPARCV9 : reltype =R_SPARC_64 ; gpfx ='_' ;break ; -case EM_X86_64 : reltype =R_X86_64_64 ;break ; +case EM_X86_64 : + make_nop = make_nop_x86; + ideal_nop = ideal_nop5_x86_64; + reltype =R_X86_64_64 ; +break ; }/* end switch */ switch (ehdr->e_ident[EI_CLASS ]) {
scripts/recordmcount.h +78 -4
132 lines not on this page · raw message
RFC PATCH 6/11 ftrace/recordmcount: Add warning logic to warn on mcount not recorded
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
There's some sections that should not have mcount recorded and should not have modifications to the that code. But currently they waste some time by calling mcount anyway (which simply returns). As the real answer should be to either whitelist the section or have gcc ignore it fully.
This change adds a option to recordmcount to warn when it finds a section that is ignored by ftrace but still contains mcount callers. This is not on by default as developers may not know if the section should be completely ignored or added to the whitelist.
--- scripts/recordmcount.c | 32 ++++++++++++++++++++++++-------- scripts/recordmcount.h | 22 +++++++++++++++++----- 2 files changed, 41 insertions(+), 13 deletions(-)
scripts/recordmcount.c +24 -8
@@ -24,6 +24,7 @@#include <sys/types.h> #include <sys/mman.h> #include <sys/stat.h> +#include <getopt.h> #include <elf.h> #include <fcntl.h> #include <setjmp.h>
@@ -39,6 +40,7 @@ static char gpfx; /* prefix for global symbol name (sometimes '_') */static struct stat sb;/* Remember .st_size, etc. */ static jmp_buf jmpenv;/* setjmp/longjmp per-file error escape */ static const char *altmcount;/* alternate mcount symbol name */ +static int warn_on_notrace_sect;/* warn when section has mcount not being recorded */ /* setjmp() return values */ enum {
@@ -397,19 +399,33 @@ do_file(char const *const fname) }int -main (int argc,char const *argv[]) +main (int argc,char *argv[]) {const char ftrace[] ="/ftrace.o" ;int ftrace_size =sizeof (ftrace) -1 ;int n_error =0 ;/* gcc-4.3.0 false positive complaint */ +int c; +int i; -if (argc <=1 ) { -fprintf (stderr,"usage: recordmcount file.o...\n" ); +while ((c =getopt (argc, argv,"w" )) >=0 ) { +switch (c) { +case 'w' : + warn_on_notrace_sect =1 ; +break ; +default : +fprintf (stderr,"usage: recordmcount [-w] file.o...\n" ); +return 0 ; + } + } + +if ((argc - optind) <1 ) { +fprintf (stderr,"usage: recordmcount [-w] file.o...\n" );return 0 ; }/* Process each file in turn, allowing deep failure. */ -for (--argc, ++argv; argc >0 ; --argc, ++argv) { +for (i = optind; i < argc; i++) { +char *file = argv[i];int const sjval =setjmp (jmpenv);int len;
@@ -418,14 +434,14 @@ main(int argc, char const *argv[])* function but does not call it. Since ftrace.o should * not be traced anyway, we just skip it. */ - len =strlen (argv[0 ]); + len =strlen (file);if (len >= ftrace_size && -strcmp (argv[0 ] + (len - ftrace_size), ftrace) ==0 ) +strcmp (file + (len - ftrace_size), ftrace) ==0 )continue ;switch (sjval) {default : -fprintf (stderr,"internal error: %s\n" , argv[0 ]); +fprintf (stderr,"internal error: %s\n" , file);exit (1 );break ;case SJ_SETJMP :/* normal sequence */
@@ -433,7 +449,7 @@ main(int argc, char const *argv[]) fd_map =-1 ; ehdr_curr =NULL ; mmap_failed =1 ; -do_file (argv[0 ]); +do_file (file);break ;case SJ_FAIL :/* error in do_file or below */ ++n_error;
scripts/recordmcount.h +17 -5
@@ -313,7 +313,8 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,* into nops. */ static void nop_mcount (Elf_Shdr const *const relhdr, -Elf_Ehdr const *const ehdr) +Elf_Ehdr const *const ehdr, +const char *const txtname) {Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) + (void *)ehdr);
@@ -336,6 +337,7 @@ static void nop_mcount(Elf_Shdr const *const relhdr,unsigned mcountsym =0 ;unsigned t; +int once =0 ;for (t = nrel; t; --t) {int ret =-1 ;
@@ -353,8 +355,18 @@ static void nop_mcount(Elf_Shdr const *const relhdr, mcountsym =Elf_r_sym (relp); } -if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) - ret =make_nop ((void *)ehdr, shdr->sh_offset + relp->r_offset); +if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) { +if (make_nop) + ret =make_nop ((void *)ehdr, shdr->sh_offset + relp->r_offset); +if (warn_on_notrace_sect && !once) { +printf ("Section %s has mcount callers being ignored\n" , + txtname); + once =1 ; +/* just warn? */ +if (!make_nop) +return ; + } + }/* * If we successfully removed the mcount, mark the relocation
@@ -501,12 +513,12 @@ do_func(Elf_Ehdr *const ehdr, char const *const fname, unsigned const reltype) mlocp =sift_rel_mcount (mlocp, (void *)mlocp - (void *)mloc0, &mrelp, relhdr, ehdr, recsym, recval, reltype); - }else if (make_nop && txtname) { + }else if (txtname && (warn_on_notrace_sect || make_nop)) {/* * This section is ignored by ftrace, but still * has mcount calls. Convert them to nops now. */ -nop_mcount (relhdr, ehdr); +nop_mcount (relhdr, ehdr, txtname); } }if (mloc0 != mlocp) {
Signature · 1 line
1.7.2.3
[tip:perf/core] ftrace/recordmcount: Add warning logic to warn on mcount not recorded
Commit-ID: dfad3d598c4bbbaf137588e22bac1ce624529f7e Gitweb: http://git.kernel.org/tip/dfad3d598c4bbbaf137588e22bac1ce624529f7e Author: Steven Rostedt <[email protected]> AuthorDate: Tue, 12 Apr 2011 18:53:25 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Mon, 16 May 2011 14:44:20 -0400
ftrace/recordmcount: Add warning logic to warn on mcount not recorded
There's some sections that should not have mcount recorded and should not have modifications to the that code. But currently they waste some time by calling mcount anyway (which simply returns). As the real answer should be to either whitelist the section or have gcc ignore it fully.
This change adds a option to recordmcount to warn when it finds a section that is ignored by ftrace but still contains mcount callers. This is not on by default as developers may not know if the section should be completely ignored or added to the whitelist.
--- scripts/recordmcount.c | 32 ++++++++++++++++++++++++-------- scripts/recordmcount.h | 22 +++++++++++++++++----- 2 files changed, 41 insertions(+), 13 deletions(-)
scripts/recordmcount.c +24 -8
@@ -24,6 +24,7 @@#include <sys/types.h> #include <sys/mman.h> #include <sys/stat.h> +#include <getopt.h> #include <elf.h> #include <fcntl.h> #include <setjmp.h>
@@ -39,6 +40,7 @@ static char gpfx; /* prefix for global symbol name (sometimes '_') */static struct stat sb;/* Remember .st_size, etc. */ static jmp_buf jmpenv;/* setjmp/longjmp per-file error escape */ static const char *altmcount;/* alternate mcount symbol name */ +static int warn_on_notrace_sect;/* warn when section has mcount not being recorded */ /* setjmp() return values */ enum {
@@ -397,19 +399,33 @@ do_file(char const *const fname) }int -main (int argc,char const *argv[]) +main (int argc,char *argv[]) {const char ftrace[] ="/ftrace.o" ;int ftrace_size =sizeof (ftrace) -1 ;int n_error =0 ;/* gcc-4.3.0 false positive complaint */ +int c; +int i; -if (argc <=1 ) { -fprintf (stderr,"usage: recordmcount file.o...\n" ); +while ((c =getopt (argc, argv,"w" )) >=0 ) { +switch (c) { +case 'w' : + warn_on_notrace_sect =1 ; +break ; +default : +fprintf (stderr,"usage: recordmcount [-w] file.o...\n" ); +return 0 ; + } + } + +if ((argc - optind) <1 ) { +fprintf (stderr,"usage: recordmcount [-w] file.o...\n" );return 0 ; }/* Process each file in turn, allowing deep failure. */ -for (--argc, ++argv; argc >0 ; --argc, ++argv) { +for (i = optind; i < argc; i++) { +char *file = argv[i];int const sjval =setjmp (jmpenv);int len;
@@ -418,14 +434,14 @@ main(int argc, char const *argv[])* function but does not call it. Since ftrace.o should * not be traced anyway, we just skip it. */ - len =strlen (argv[0 ]); + len =strlen (file);if (len >= ftrace_size && -strcmp (argv[0 ] + (len - ftrace_size), ftrace) ==0 ) +strcmp (file + (len - ftrace_size), ftrace) ==0 )continue ;switch (sjval) {default : -fprintf (stderr,"internal error: %s\n" , argv[0 ]); +fprintf (stderr,"internal error: %s\n" , file);exit (1 );break ;case SJ_SETJMP :/* normal sequence */
@@ -433,7 +449,7 @@ main(int argc, char const *argv[]) fd_map =-1 ; ehdr_curr =NULL ; mmap_failed =1 ; -do_file (argv[0 ]); +do_file (file);break ;case SJ_FAIL :/* error in do_file or below */ ++n_error;
scripts/recordmcount.h +17 -5
@@ -313,7 +313,8 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,* into nops. */ static void nop_mcount (Elf_Shdr const *const relhdr, -Elf_Ehdr const *const ehdr) +Elf_Ehdr const *const ehdr, +const char *const txtname) {Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) + (void *)ehdr);
@@ -336,6 +337,7 @@ static void nop_mcount(Elf_Shdr const *const relhdr,unsigned mcountsym =0 ;unsigned t; +int once =0 ;for (t = nrel; t; --t) {int ret =-1 ;
@@ -353,8 +355,18 @@ static void nop_mcount(Elf_Shdr const *const relhdr, mcountsym =Elf_r_sym (relp); } -if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) - ret =make_nop ((void *)ehdr, shdr->sh_offset + relp->r_offset); +if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) { +if (make_nop) + ret =make_nop ((void *)ehdr, shdr->sh_offset + relp->r_offset); +if (warn_on_notrace_sect && !once) { +printf ("Section %s has mcount callers being ignored\n" , + txtname); + once =1 ; +/* just warn? */ +if (!make_nop) +return ; + } + }/* * If we successfully removed the mcount, mark the relocation
@@ -501,12 +513,12 @@ do_func(Elf_Ehdr *const ehdr, char const *const fname, unsigned const reltype) mlocp =sift_rel_mcount (mlocp, (void *)mlocp - (void *)mloc0, &mrelp, relhdr, ehdr, recsym, recval, reltype); - }else if (make_nop && txtname) { + }else if (txtname && (warn_on_notrace_sect || make_nop)) {/* * This section is ignored by ftrace, but still * has mcount calls. Convert them to nops now. */ -nop_mcount (relhdr, ehdr); +nop_mcount (relhdr, ehdr, txtname); } }if (mloc0 != mlocp) {
[tip:perf/core] ftrace/recordmcount: Add warning logic to warn on mcount not recorded
In reply to Steven RostedtCommit-ID: 06fd6f6301cce9af4a03dd9e40bfca167e931ff1 Gitweb: http://git.kernel.org/tip/06fd6f6301cce9af4a03dd9e40bfca167e931ff1 Author: Steven Rostedt <[email protected]> AuthorDate: Tue, 12 Apr 2011 18:53:25 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Tue, 17 May 2011 10:41:45 -0400
ftrace/recordmcount: Add warning logic to warn on mcount not recorded
There's some sections that should not have mcount recorded and should not have modifications to the that code. But currently they waste some time by calling mcount anyway (which simply returns). As the real answer should be to either whitelist the section or have gcc ignore it fully.
This change adds a option to recordmcount to warn when it finds a section that is ignored by ftrace but still contains mcount callers. This is not on by default as developers may not know if the section should be completely ignored or added to the whitelist.
--- scripts/recordmcount.c | 32 ++++++++++++++++++++++++-------- scripts/recordmcount.h | 22 +++++++++++++++++----- 2 files changed, 41 insertions(+), 13 deletions(-)
scripts/recordmcount.c +24 -8
@@ -24,6 +24,7 @@#include <sys/types.h> #include <sys/mman.h> #include <sys/stat.h> +#include <getopt.h> #include <elf.h> #include <fcntl.h> #include <setjmp.h>
@@ -39,6 +40,7 @@ static char gpfx; /* prefix for global symbol name (sometimes '_') */static struct stat sb;/* Remember .st_size, etc. */ static jmp_buf jmpenv;/* setjmp/longjmp per-file error escape */ static const char *altmcount;/* alternate mcount symbol name */ +static int warn_on_notrace_sect;/* warn when section has mcount not being recorded */ /* setjmp() return values */ enum {
@@ -397,19 +399,33 @@ do_file(char const *const fname) }int -main (int argc,char const *argv[]) +main (int argc,char *argv[]) {const char ftrace[] ="/ftrace.o" ;int ftrace_size =sizeof (ftrace) -1 ;int n_error =0 ;/* gcc-4.3.0 false positive complaint */ +int c; +int i; -if (argc <=1 ) { -fprintf (stderr,"usage: recordmcount file.o...\n" ); +while ((c =getopt (argc, argv,"w" )) >=0 ) { +switch (c) { +case 'w' : + warn_on_notrace_sect =1 ; +break ; +default : +fprintf (stderr,"usage: recordmcount [-w] file.o...\n" ); +return 0 ; + } + } + +if ((argc - optind) <1 ) { +fprintf (stderr,"usage: recordmcount [-w] file.o...\n" );return 0 ; }/* Process each file in turn, allowing deep failure. */ -for (--argc, ++argv; argc >0 ; --argc, ++argv) { +for (i = optind; i < argc; i++) { +char *file = argv[i];int const sjval =setjmp (jmpenv);int len;
@@ -418,14 +434,14 @@ main(int argc, char const *argv[])* function but does not call it. Since ftrace.o should * not be traced anyway, we just skip it. */ - len =strlen (argv[0 ]); + len =strlen (file);if (len >= ftrace_size && -strcmp (argv[0 ] + (len - ftrace_size), ftrace) ==0 ) +strcmp (file + (len - ftrace_size), ftrace) ==0 )continue ;switch (sjval) {default : -fprintf (stderr,"internal error: %s\n" , argv[0 ]); +fprintf (stderr,"internal error: %s\n" , file);exit (1 );break ;case SJ_SETJMP :/* normal sequence */
@@ -433,7 +449,7 @@ main(int argc, char const *argv[]) fd_map =-1 ; ehdr_curr =NULL ; mmap_failed =1 ; -do_file (argv[0 ]); +do_file (file);break ;case SJ_FAIL :/* error in do_file or below */ ++n_error;
scripts/recordmcount.h +17 -5
@@ -313,7 +313,8 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,* into nops. */ static void nop_mcount (Elf_Shdr const *const relhdr, -Elf_Ehdr const *const ehdr) +Elf_Ehdr const *const ehdr, +const char *const txtname) {Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) + (void *)ehdr);
@@ -336,6 +337,7 @@ static void nop_mcount(Elf_Shdr const *const relhdr,unsigned mcountsym =0 ;unsigned t; +int once =0 ;for (t = nrel; t; --t) {int ret =-1 ;
@@ -353,8 +355,18 @@ static void nop_mcount(Elf_Shdr const *const relhdr, mcountsym =Elf_r_sym (relp); } -if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) - ret =make_nop ((void *)ehdr, shdr->sh_offset + relp->r_offset); +if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) { +if (make_nop) + ret =make_nop ((void *)ehdr, shdr->sh_offset + relp->r_offset); +if (warn_on_notrace_sect && !once) { +printf ("Section %s has mcount callers being ignored\n" , + txtname); + once =1 ; +/* just warn? */ +if (!make_nop) +return ; + } + }/* * If we successfully removed the mcount, mark the relocation
@@ -501,12 +513,12 @@ do_func(Elf_Ehdr *const ehdr, char const *const fname, unsigned const reltype) mlocp =sift_rel_mcount (mlocp, (void *)mlocp - (void *)mloc0, &mrelp, relhdr, ehdr, recsym, recval, reltype); - }else if (make_nop && txtname) { + }else if (txtname && (warn_on_notrace_sect || make_nop)) {/* * This section is ignored by ftrace, but still * has mcount calls. Convert them to nops now. */ -nop_mcount (relhdr, ehdr); +nop_mcount (relhdr, ehdr, txtname); } }if (mloc0 != mlocp) {
RFC PATCH 7/11 kbuild/recordmcount: Add RECORDMCOUNT_WARN to warn about mcount callers
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
When mcount is called in a section that ftrace will not modify it into a nop, we want to warn about this. But not warn about this always. Now if the user builds the kernel with the option RECORDMCOUNT_WARN=1 then the build will warn about mcount callers that are ignored and will just waste execution time.
--- Makefile | 1 + scripts/Makefile.build | 5 ++++- 2 files changed, 5 insertions(+), 1 deletions(-)
Makefile +1 -0
@@ -1268,6 +1268,7 @@ help: @echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)' @echo ' make C=2 [targets] Force check of all c source with $$CHECK' @echo ' make W=1 [targets] Enable extra gcc checks' + @echo ' make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections' @echo '' @echo 'Execute "make" or "make all" to build all targets marked with [*] ' @echo 'For further info see the ./README file'
scripts/Makefile.build +4 -1
@@ -244,13 +244,16 @@ endif ifdef CONFIG_FTRACE_MCOUNT_RECORD ifdef BUILD_C_RECORDMCOUNT +ifeq ("$(origin RECORDMCOUNT_WARN)", "command line") + RECORDMCOUNT_FLAGS = -w +endif # Due to recursion, we must skip empty.o. # The empty.o file is created in the make process in order to determine # the target endianness and word size. It is made before all other C # files, including recordmcount. sub_cmd_record_mcount = \ if [ $(@) != "scripts/mod/empty.o" ]; then \ - $(objtree)/scripts/recordmcount "$(@)"; \ + $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \ fi; else sub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
Signature · 1 line
1.7.2.3
Re: [RFC][PATCH 07/11] kbuild/recordmcount: Add RECORDMCOUNT_WARN to warn about mcount callers
Quoted 10 lines · Steven Rostedt
plain text document attachment (0007-kbuild-recordmcount-Add-RECORDMCOUNT_WARN-to-warn-ab.patch)
From: Steven Rostedt <[email protected]>When mcount is called in a section that ftrace will not modify it into a nop, we want to warn about this. But not warn about this always. Now if the user builds the kernel with the option RECORDMCOUNT_WARN=1 then the build will warn about mcount callers that are ignored and will just waste execution time.
Quoted 3 lines
Cc Michal Marek <[email protected]>Signed-off-by Steven Rostedt <[email protected]>
Michal,
Can I get an Acked-by from you for this patch. Or comments if it doesn't suit you?
Thanks,
-- Stvee
Re: [RFC][PATCH 07/11] kbuild/recordmcount: Add RECORDMCOUNT_WARN to warn about mcount callers
In reply to Steven Rostedtscripts/Makefile.build endif · line 249
Quoted 3 lines · Steven Rostedt
scripts/Makefile.build +3
-0+ifeq ("$(origin RECORDMCOUNT_WARN)", "command line") + RECORDMCOUNT_FLAGS = -w +endif
RECORDMCOUNT_WARN is IMO unlikely to be used with some other meaning in the environment, so I think you can drop the origin check. Nevertheless
Michal
Re: [RFC][PATCH 07/11] kbuild/recordmcount: Add RECORDMCOUNT_WARN to warn about mcount callers
Quoted 7 lines · Michal Marek
scripts/Makefile.build endif · line 249
Quoted 3 lines · Steven Rostedt
scripts/Makefile.build +3
-0+ifeq ("$(origin RECORDMCOUNT_WARN)", "command line") + RECORDMCOUNT_FLAGS = -w +endif
RECORDMCOUNT_WARNis IMO unlikely to be used with some other meaning in the environment, so I think you can drop the origin check. Nevertheless
You haven't seen my environment variables ;)
Quoted 2 lines
Acked-by Michal Marek <[email protected]>
Thanks!
-- Steve
[tip:perf/core] kbuild/recordmcount: Add RECORDMCOUNT_WARN to warn about mcount callers
In reply to Steven RostedtCommit-ID: 85356f802225fedeee8c3e65bdd93b263ace0a8b Gitweb: http://git.kernel.org/tip/85356f802225fedeee8c3e65bdd93b263ace0a8b Author: Steven Rostedt <[email protected]> AuthorDate: Tue, 12 Apr 2011 18:59:10 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Mon, 16 May 2011 14:45:03 -0400
kbuild/recordmcount: Add RECORDMCOUNT_WARN to warn about mcount callers
When mcount is called in a section that ftrace will not modify it into a nop, we want to warn about this. But not warn about this always. Now if the user builds the kernel with the option RECORDMCOUNT_WARN=1 then the build will warn about mcount callers that are ignored and will just waste execution time.
--- Makefile | 1 + scripts/Makefile.build | 5 ++++- 2 files changed, 5 insertions(+), 1 deletions(-)
Makefile +1 -0
@@ -1268,6 +1268,7 @@ help: @echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)' @echo ' make C=2 [targets] Force check of all c source with $$CHECK' @echo ' make W=1 [targets] Enable extra gcc checks' + @echo ' make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections' @echo '' @echo 'Execute "make" or "make all" to build all targets marked with [*] ' @echo 'For further info see the ./README file'
scripts/Makefile.build +4 -1
@@ -244,13 +244,16 @@ endif ifdef CONFIG_FTRACE_MCOUNT_RECORD ifdef BUILD_C_RECORDMCOUNT +ifeq ("$(origin RECORDMCOUNT_WARN)", "command line") + RECORDMCOUNT_FLAGS = -w +endif # Due to recursion, we must skip empty.o. # The empty.o file is created in the make process in order to determine # the target endianness and word size. It is made before all other C # files, including recordmcount. sub_cmd_record_mcount = \ if [ $(@) != "scripts/mod/empty.o" ]; then \ - $(objtree)/scripts/recordmcount "$(@)"; \ + $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \ fi; else sub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
[tip:perf/core] kbuild/recordmcount: Add RECORDMCOUNT_WARN to warn about mcount callers
In reply to Steven RostedtCommit-ID: a3a8350ab2f588f3a7a08dc86658bf90773f9a52 Gitweb: http://git.kernel.org/tip/a3a8350ab2f588f3a7a08dc86658bf90773f9a52 Author: Steven Rostedt <[email protected]> AuthorDate: Tue, 12 Apr 2011 18:59:10 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Tue, 17 May 2011 10:41:49 -0400
kbuild/recordmcount: Add RECORDMCOUNT_WARN to warn about mcount callers
When mcount is called in a section that ftrace will not modify it into a nop, we want to warn about this. But not warn about this always. Now if the user builds the kernel with the option RECORDMCOUNT_WARN=1 then the build will warn about mcount callers that are ignored and will just waste execution time.
--- Makefile | 1 + scripts/Makefile.build | 5 ++++- 2 files changed, 5 insertions(+), 1 deletions(-)
Makefile +1 -0
@@ -1268,6 +1268,7 @@ help: @echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)' @echo ' make C=2 [targets] Force check of all c source with $$CHECK' @echo ' make W=1 [targets] Enable extra gcc checks' + @echo ' make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections' @echo '' @echo 'Execute "make" or "make all" to build all targets marked with [*] ' @echo 'For further info see the ./README file'
scripts/Makefile.build +4 -1
@@ -244,13 +244,16 @@ endif ifdef CONFIG_FTRACE_MCOUNT_RECORD ifdef BUILD_C_RECORDMCOUNT +ifeq ("$(origin RECORDMCOUNT_WARN)", "command line") + RECORDMCOUNT_FLAGS = -w +endif # Due to recursion, we must skip empty.o. # The empty.o file is created in the make process in order to determine # the target endianness and word size. It is made before all other C # files, including recordmcount. sub_cmd_record_mcount = \ if [ $(@) != "scripts/mod/empty.o" ]; then \ - $(objtree)/scripts/recordmcount "$(@)"; \ + $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \ fi; recordmcount_source := $(srctree)/scripts/recordmcount.c \ $(srctree)/scripts/recordmcount.h
RFC PATCH 8/11 ftrace: Avoid recording mcount on .init sections directly
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
The init and exit sections should not be traced and adding a call to mcount to them is a waste of text and instruction cache. Have the macro section attributes include notrace to ignore these functions for tracing from the build.
--- include/linux/init.h | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-)
include/linux/init.h +7 -7
@@ -79,29 +79,29 @@#define __exitused __used#endif -#define __exit __section(.exit.text) __exitused __cold +#define __exit __section(.exit.text) __exitused __cold notrace/* Used for HOTPLUG */ -#define __devinit __section(.devinit.text) __cold +#define __devinit __section(.devinit.text) __cold notrace#define __devinitdata __section(.devinit.data)#define __devinitconst __section(.devinit.rodata) -#define __devexit __section(.devexit.text) __exitused __cold +#define __devexit __section(.devexit.text) __exitused __cold notrace#define __devexitdata __section(.devexit.data)#define __devexitconst __section(.devexit.rodata)/* Used for HOTPLUG_CPU */ -#define __cpuinit __section(.cpuinit.text) __cold +#define __cpuinit __section(.cpuinit.text) __cold notrace#define __cpuinitdata __section(.cpuinit.data)#define __cpuinitconst __section(.cpuinit.rodata) -#define __cpuexit __section(.cpuexit.text) __exitused __cold +#define __cpuexit __section(.cpuexit.text) __exitused __cold notrace#define __cpuexitdata __section(.cpuexit.data)#define __cpuexitconst __section(.cpuexit.rodata)/* Used for MEMORY_HOTPLUG */ -#define __meminit __section(.meminit.text) __cold +#define __meminit __section(.meminit.text) __cold notrace#define __meminitdata __section(.meminit.data)#define __meminitconst __section(.meminit.rodata) -#define __memexit __section(.memexit.text) __exitused __cold +#define __memexit __section(.memexit.text) __exitused __cold notrace#define __memexitdata __section(.memexit.data)#define __memexitconst __section(.memexit.rodata)
Signature · 1 line
1.7.2.3
[tip:perf/core] ftrace: Avoid recording mcount on .init sections directly
Commit-ID: f0201738b61b1adcf6b2c4719c5c415745014c1c Gitweb: http://git.kernel.org/tip/f0201738b61b1adcf6b2c4719c5c415745014c1c Author: Steven Rostedt <[email protected]> AuthorDate: Tue, 12 Apr 2011 19:06:39 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Mon, 16 May 2011 14:46:30 -0400
ftrace: Avoid recording mcount on .init sections directly
The init and exit sections should not be traced and adding a call to mcount to them is a waste of text and instruction cache. Have the macro section attributes include notrace to ignore these functions for tracing from the build.
--- include/linux/init.h | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-)
include/linux/init.h +7 -7
@@ -79,29 +79,29 @@#define __exitused __used#endif -#define __exit __section(.exit.text) __exitused __cold +#define __exit __section(.exit.text) __exitused __cold notrace/* Used for HOTPLUG */ -#define __devinit __section(.devinit.text) __cold +#define __devinit __section(.devinit.text) __cold notrace#define __devinitdata __section(.devinit.data)#define __devinitconst __section(.devinit.rodata) -#define __devexit __section(.devexit.text) __exitused __cold +#define __devexit __section(.devexit.text) __exitused __cold notrace#define __devexitdata __section(.devexit.data)#define __devexitconst __section(.devexit.rodata)/* Used for HOTPLUG_CPU */ -#define __cpuinit __section(.cpuinit.text) __cold +#define __cpuinit __section(.cpuinit.text) __cold notrace#define __cpuinitdata __section(.cpuinit.data)#define __cpuinitconst __section(.cpuinit.rodata) -#define __cpuexit __section(.cpuexit.text) __exitused __cold +#define __cpuexit __section(.cpuexit.text) __exitused __cold notrace#define __cpuexitdata __section(.cpuexit.data)#define __cpuexitconst __section(.cpuexit.rodata)/* Used for MEMORY_HOTPLUG */ -#define __meminit __section(.meminit.text) __cold +#define __meminit __section(.meminit.text) __cold notrace#define __meminitdata __section(.meminit.data)#define __meminitconst __section(.meminit.rodata) -#define __memexit __section(.memexit.text) __exitused __cold +#define __memexit __section(.memexit.text) __exitused __cold notrace#define __memexitdata __section(.memexit.data)#define __memexitconst __section(.memexit.rodata)
[tip:perf/core] ftrace: Avoid recording mcount on .init sections directly
In reply to Steven RostedtCommit-ID: 5f9b93c39239507d2af03f79c8b0df9ebb9be768 Gitweb: http://git.kernel.org/tip/5f9b93c39239507d2af03f79c8b0df9ebb9be768 Author: Steven Rostedt <[email protected]> AuthorDate: Tue, 12 Apr 2011 19:06:39 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Tue, 17 May 2011 10:41:52 -0400
ftrace: Avoid recording mcount on .init sections directly
The init and exit sections should not be traced and adding a call to mcount to them is a waste of text and instruction cache. Have the macro section attributes include notrace to ignore these functions for tracing from the build.
--- include/linux/init.h | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-)
include/linux/init.h +7 -7
@@ -79,29 +79,29 @@#define __exitused __used#endif -#define __exit __section(.exit.text) __exitused __cold +#define __exit __section(.exit.text) __exitused __cold notrace/* Used for HOTPLUG */ -#define __devinit __section(.devinit.text) __cold +#define __devinit __section(.devinit.text) __cold notrace#define __devinitdata __section(.devinit.data)#define __devinitconst __section(.devinit.rodata) -#define __devexit __section(.devexit.text) __exitused __cold +#define __devexit __section(.devexit.text) __exitused __cold notrace#define __devexitdata __section(.devexit.data)#define __devexitconst __section(.devexit.rodata)/* Used for HOTPLUG_CPU */ -#define __cpuinit __section(.cpuinit.text) __cold +#define __cpuinit __section(.cpuinit.text) __cold notrace#define __cpuinitdata __section(.cpuinit.data)#define __cpuinitconst __section(.cpuinit.rodata) -#define __cpuexit __section(.cpuexit.text) __exitused __cold +#define __cpuexit __section(.cpuexit.text) __exitused __cold notrace#define __cpuexitdata __section(.cpuexit.data)#define __cpuexitconst __section(.cpuexit.rodata)/* Used for MEMORY_HOTPLUG */ -#define __meminit __section(.meminit.text) __cold +#define __meminit __section(.meminit.text) __cold notrace#define __meminitdata __section(.meminit.data)#define __meminitconst __section(.meminit.rodata) -#define __memexit __section(.memexit.text) __exitused __cold +#define __memexit __section(.memexit.text) __exitused __cold notrace#define __memexitdata __section(.memexit.data)#define __memexitconst __section(.memexit.rodata)
RFC PATCH 9/11 ftrace/x86: Do not trace .discard.text section
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
The section called .discard.text has tracing attached to it and is currently ignored by ftrace. But it does include a call to the mcount stub. Adding a notrace to the code keeps gcc from adding the useless mcount caller to it.
--- arch/x86/include/asm/setup.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
arch/x86/include/asm/setup.h +1 -1
@@ -88,7 +88,7 @@ void *extend_brk(size_t size, size_t align);* executable.) */ #define RESERVE_BRK (name,sz) \ - static void __section(.discard.text) __used \ + static void __section(.discard.text) __used notrace \ __brk_reservation_fn_##name##__(void) { \ asm volatile ( \ ".pushsection .brk_reservation,\"aw\",@nobits;" \
Signature · 1 line
1.7.2.3
[tip:perf/core] ftrace/x86: Do not trace .discard.text section
Commit-ID: 2895cd2ab81dfb7bc22637bc110857db44a30b4a Gitweb: http://git.kernel.org/tip/2895cd2ab81dfb7bc22637bc110857db44a30b4a Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 13 Apr 2011 16:43:29 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Mon, 16 May 2011 14:47:13 -0400
ftrace/x86: Do not trace .discard.text section
The section called .discard.text has tracing attached to it and is currently ignored by ftrace. But it does include a call to the mcount stub. Adding a notrace to the code keeps gcc from adding the useless mcount caller to it.
--- arch/x86/include/asm/setup.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
arch/x86/include/asm/setup.h +1 -1
@@ -88,7 +88,7 @@ void *extend_brk(size_t size, size_t align);* executable.) */ #define RESERVE_BRK (name,sz) \ - static void __section(.discard.text) __used \ + static void __section(.discard.text) __used notrace \ __brk_reservation_fn_##name##__(void) { \ asm volatile ( \ ".pushsection .brk_reservation,\"aw\",@nobits;" \
[tip:perf/core] ftrace/x86: Do not trace .discard.text section
In reply to Steven RostedtCommit-ID: 406a733db0052fed66d17008430b6047ecea7b92 Gitweb: http://git.kernel.org/tip/406a733db0052fed66d17008430b6047ecea7b92 Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 13 Apr 2011 16:43:29 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Tue, 17 May 2011 10:41:55 -0400
ftrace/x86: Do not trace .discard.text section
The section called .discard.text has tracing attached to it and is currently ignored by ftrace. But it does include a call to the mcount stub. Adding a notrace to the code keeps gcc from adding the useless mcount caller to it.
--- arch/x86/include/asm/setup.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
arch/x86/include/asm/setup.h +1 -1
@@ -88,7 +88,7 @@ void *extend_brk(size_t size, size_t align);* executable.) */ #define RESERVE_BRK (name,sz) \ - static void __section(.discard.text) __used \ + static void __section(.discard.text) __used notrace \ __brk_reservation_fn_##name##__(void) { \ asm volatile ( \ ".pushsection .brk_reservation,\"aw\",@nobits;" \
RFC PATCH 10/11 ftrace/recordmcount: Remove duplicate code to find mcount symbol
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
The code in sift_rel_mcount() and nop_mcount() to get the mcount symbol number is identical. Replace the two locations with a call to a function that does the work.
--- scripts/recordmcount.h | 51 +++++++++++++++++++++++++---------------------- 1 files changed, 27 insertions(+), 24 deletions(-)
scripts/recordmcount.h +27 -24
@@ -28,6 +28,7 @@#undef __has_rel_mcount#undef has_rel_mcount#undef tot_relsize +#undef get_mcountsym#undef do_func#undef Elf_Addr#undef Elf_Ehdr
@@ -56,6 +57,7 @@# define has_rel_mcount has64_rel_mcount# define tot_relsize tot64_relsize# define do_func do64 +# define get_mcountsym get_mcountsym_64# define is_fake_mcount is_fake_mcount64# define fn_is_fake_mcount fn_is_fake_mcount64# define MIPS_is_fake_mcount MIPS64_is_fake_mcount
@@ -85,6 +87,7 @@# define has_rel_mcount has32_rel_mcount# define tot_relsize tot32_relsize# define do_func do32 +# define get_mcountsym get_mcountsym_32# define is_fake_mcount is_fake_mcount32# define fn_is_fake_mcount fn_is_fake_mcount32# define MIPS_is_fake_mcount MIPS32_is_fake_mcount
@@ -237,6 +240,26 @@ static void append_func(Elf_Ehdr *const ehdr,uwrite (fd_map, ehdr,sizeof (*ehdr)); } +static unsigned get_mcountsym (Elf_Sym const *const sym0, +Elf_Rel const *relp, +char const *const str0) +{ +unsigned mcountsym =0 ; + +Elf_Sym const *const symp = + &sym0[Elf_r_sym (relp)]; +char const *symname = &str0[w (symp->st_name)]; +char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; + +if (symname[0 ] =='.' ) + ++symname;/* ppc64 hack */ +if (strcmp (mcount, symname) ==0 || + (altmcount &&strcmp (altmcount, symname) ==0 )) + mcountsym =Elf_r_sym (relp); + +return mcountsym; +} +/* * Look at the relocations in order to find the calls to mcount. * Accumulate the section offsets that are found, and their relocation info,
@@ -274,18 +297,8 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,unsigned t;for (t = nrel; t; --t) { -if (!mcountsym) { -Elf_Sym const *const symp = - &sym0[Elf_r_sym (relp)]; -char const *symname = &str0[w (symp->st_name)]; -char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; - -if (symname[0 ] =='.' ) - ++symname;/* ppc64 hack */ -if (strcmp (mcount, symname) ==0 || - (altmcount &&strcmp (altmcount, symname) ==0 )) - mcountsym =Elf_r_sym (relp); - } +if (!mcountsym) + mcountsym =get_mcountsym (sym0, relp, str0);if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) {uint_t const addend =_w (_w (relp->r_offset) - recval);
@@ -342,18 +355,8 @@ static void nop_mcount(Elf_Shdr const *const relhdr,for (t = nrel; t; --t) {int ret =-1 ; -if (!mcountsym) { -Elf_Sym const *const symp = - &sym0[Elf_r_sym (relp)]; -char const *symname = &str0[w (symp->st_name)]; -char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; - -if (symname[0 ] =='.' ) - ++symname;/* ppc64 hack */ -if (strcmp (mcount, symname) ==0 || - (altmcount &&strcmp (altmcount, symname) ==0 )) - mcountsym =Elf_r_sym (relp); - } +if (!mcountsym) + mcountsym =get_mcountsym (sym0, relp, str0);if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) {if (make_nop)
Signature · 1 line
1.7.2.3
[tip:perf/core] ftrace/recordmcount: Remove duplicate code to find mcount symbol
Commit-ID: 37762cb9977626343b3cd1aab9146313c94748c2 Gitweb: http://git.kernel.org/tip/37762cb9977626343b3cd1aab9146313c94748c2 Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 20 Apr 2011 20:47:34 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Mon, 16 May 2011 14:48:02 -0400
ftrace/recordmcount: Remove duplicate code to find mcount symbol
The code in sift_rel_mcount() and nop_mcount() to get the mcount symbol number is identical. Replace the two locations with a call to a function that does the work.
--- scripts/recordmcount.h | 51 +++++++++++++++++++++++++---------------------- 1 files changed, 27 insertions(+), 24 deletions(-)
scripts/recordmcount.h +27 -24
@@ -28,6 +28,7 @@#undef __has_rel_mcount#undef has_rel_mcount#undef tot_relsize +#undef get_mcountsym#undef do_func#undef Elf_Addr#undef Elf_Ehdr
@@ -56,6 +57,7 @@# define has_rel_mcount has64_rel_mcount# define tot_relsize tot64_relsize# define do_func do64 +# define get_mcountsym get_mcountsym_64# define is_fake_mcount is_fake_mcount64# define fn_is_fake_mcount fn_is_fake_mcount64# define MIPS_is_fake_mcount MIPS64_is_fake_mcount
@@ -85,6 +87,7 @@# define has_rel_mcount has32_rel_mcount# define tot_relsize tot32_relsize# define do_func do32 +# define get_mcountsym get_mcountsym_32# define is_fake_mcount is_fake_mcount32# define fn_is_fake_mcount fn_is_fake_mcount32# define MIPS_is_fake_mcount MIPS32_is_fake_mcount
@@ -237,6 +240,26 @@ static void append_func(Elf_Ehdr *const ehdr,uwrite (fd_map, ehdr,sizeof (*ehdr)); } +static unsigned get_mcountsym (Elf_Sym const *const sym0, +Elf_Rel const *relp, +char const *const str0) +{ +unsigned mcountsym =0 ; + +Elf_Sym const *const symp = + &sym0[Elf_r_sym (relp)]; +char const *symname = &str0[w (symp->st_name)]; +char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; + +if (symname[0 ] =='.' ) + ++symname;/* ppc64 hack */ +if (strcmp (mcount, symname) ==0 || + (altmcount &&strcmp (altmcount, symname) ==0 )) + mcountsym =Elf_r_sym (relp); + +return mcountsym; +} +/* * Look at the relocations in order to find the calls to mcount. * Accumulate the section offsets that are found, and their relocation info,
@@ -274,18 +297,8 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,unsigned t;for (t = nrel; t; --t) { -if (!mcountsym) { -Elf_Sym const *const symp = - &sym0[Elf_r_sym (relp)]; -char const *symname = &str0[w (symp->st_name)]; -char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; - -if (symname[0 ] =='.' ) - ++symname;/* ppc64 hack */ -if (strcmp (mcount, symname) ==0 || - (altmcount &&strcmp (altmcount, symname) ==0 )) - mcountsym =Elf_r_sym (relp); - } +if (!mcountsym) + mcountsym =get_mcountsym (sym0, relp, str0);if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) {uint_t const addend =_w (_w (relp->r_offset) - recval);
@@ -342,18 +355,8 @@ static void nop_mcount(Elf_Shdr const *const relhdr,for (t = nrel; t; --t) {int ret =-1 ; -if (!mcountsym) { -Elf_Sym const *const symp = - &sym0[Elf_r_sym (relp)]; -char const *symname = &str0[w (symp->st_name)]; -char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; - -if (symname[0 ] =='.' ) - ++symname;/* ppc64 hack */ -if (strcmp (mcount, symname) ==0 || - (altmcount &&strcmp (altmcount, symname) ==0 )) - mcountsym =Elf_r_sym (relp); - } +if (!mcountsym) + mcountsym =get_mcountsym (sym0, relp, str0);if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) {if (make_nop)
[tip:perf/core] ftrace/recordmcount: Remove duplicate code to find mcount symbol
In reply to Steven RostedtCommit-ID: f6d4f08194d77c86fe3af6e2e4b9184347014926 Gitweb: http://git.kernel.org/tip/f6d4f08194d77c86fe3af6e2e4b9184347014926 Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 20 Apr 2011 20:47:34 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Tue, 17 May 2011 10:41:59 -0400
ftrace/recordmcount: Remove duplicate code to find mcount symbol
The code in sift_rel_mcount() and nop_mcount() to get the mcount symbol number is identical. Replace the two locations with a call to a function that does the work.
--- scripts/recordmcount.h | 51 +++++++++++++++++++++++++---------------------- 1 files changed, 27 insertions(+), 24 deletions(-)
scripts/recordmcount.h +27 -24
@@ -28,6 +28,7 @@#undef __has_rel_mcount#undef has_rel_mcount#undef tot_relsize +#undef get_mcountsym#undef do_func#undef Elf_Addr#undef Elf_Ehdr
@@ -56,6 +57,7 @@# define has_rel_mcount has64_rel_mcount# define tot_relsize tot64_relsize# define do_func do64 +# define get_mcountsym get_mcountsym_64# define is_fake_mcount is_fake_mcount64# define fn_is_fake_mcount fn_is_fake_mcount64# define MIPS_is_fake_mcount MIPS64_is_fake_mcount
@@ -85,6 +87,7 @@# define has_rel_mcount has32_rel_mcount# define tot_relsize tot32_relsize# define do_func do32 +# define get_mcountsym get_mcountsym_32# define is_fake_mcount is_fake_mcount32# define fn_is_fake_mcount fn_is_fake_mcount32# define MIPS_is_fake_mcount MIPS32_is_fake_mcount
@@ -237,6 +240,26 @@ static void append_func(Elf_Ehdr *const ehdr,uwrite (fd_map, ehdr,sizeof (*ehdr)); } +static unsigned get_mcountsym (Elf_Sym const *const sym0, +Elf_Rel const *relp, +char const *const str0) +{ +unsigned mcountsym =0 ; + +Elf_Sym const *const symp = + &sym0[Elf_r_sym (relp)]; +char const *symname = &str0[w (symp->st_name)]; +char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; + +if (symname[0 ] =='.' ) + ++symname;/* ppc64 hack */ +if (strcmp (mcount, symname) ==0 || + (altmcount &&strcmp (altmcount, symname) ==0 )) + mcountsym =Elf_r_sym (relp); + +return mcountsym; +} +/* * Look at the relocations in order to find the calls to mcount. * Accumulate the section offsets that are found, and their relocation info,
@@ -274,18 +297,8 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,unsigned t;for (t = nrel; t; --t) { -if (!mcountsym) { -Elf_Sym const *const symp = - &sym0[Elf_r_sym (relp)]; -char const *symname = &str0[w (symp->st_name)]; -char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; - -if (symname[0 ] =='.' ) - ++symname;/* ppc64 hack */ -if (strcmp (mcount, symname) ==0 || - (altmcount &&strcmp (altmcount, symname) ==0 )) - mcountsym =Elf_r_sym (relp); - } +if (!mcountsym) + mcountsym =get_mcountsym (sym0, relp, str0);if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) {uint_t const addend =_w (_w (relp->r_offset) - recval);
@@ -342,18 +355,8 @@ static void nop_mcount(Elf_Shdr const *const relhdr,for (t = nrel; t; --t) {int ret =-1 ; -if (!mcountsym) { -Elf_Sym const *const symp = - &sym0[Elf_r_sym (relp)]; -char const *symname = &str0[w (symp->st_name)]; -char const *mcount = gpfx =='_' ?"_mcount" :"mcount" ; - -if (symname[0 ] =='.' ) - ++symname;/* ppc64 hack */ -if (strcmp (mcount, symname) ==0 || - (altmcount &&strcmp (altmcount, symname) ==0 )) - mcountsym =Elf_r_sym (relp); - } +if (!mcountsym) + mcountsym =get_mcountsym (sym0, relp, str0);if (mcountsym ==Elf_r_sym (relp) && !is_fake_mcount (relp)) {if (make_nop)
RFC PATCH 11/11 ftrace/recordmcount: Add helper function get_sym_str_and_relp()
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
The code to get the symbol, string, and relp pointers in the two functions sift_rel_mcount() and nop_mcount() are identical and also non-trivial. Moving this duplicate code into a single helper function makes the code easier to read and more maintainable.
--- scripts/recordmcount.h | 67 ++++++++++++++++++++++++++--------------------- 1 files changed, 37 insertions(+), 30 deletions(-)
scripts/recordmcount.h +37 -30
@@ -29,6 +29,7 @@#undef has_rel_mcount#undef tot_relsize#undef get_mcountsym +#undef get_sym_str_and_relp#undef do_func#undef Elf_Addr#undef Elf_Ehdr
@@ -56,6 +57,7 @@# define __has_rel_mcount __has64_rel_mcount# define has_rel_mcount has64_rel_mcount# define tot_relsize tot64_relsize +# define get_sym_str_and_relp get_sym_str_and_relp_64# define do_func do64# define get_mcountsym get_mcountsym_64# define is_fake_mcount is_fake_mcount64
@@ -86,6 +88,7 @@# define __has_rel_mcount __has32_rel_mcount# define has_rel_mcount has32_rel_mcount# define tot_relsize tot32_relsize +# define get_sym_str_and_relp get_sym_str_and_relp_32# define do_func do32# define get_mcountsym get_mcountsym_32# define is_fake_mcount is_fake_mcount32
@@ -260,6 +263,29 @@ static unsigned get_mcountsym(Elf_Sym const *const sym0,return mcountsym; } +static void get_sym_str_and_relp (Elf_Shdr const *const relhdr, +Elf_Ehdr const *const ehdr, +Elf_Sym const **sym0, +char const **str0, +Elf_Rel const **relp) +{ +Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) + + (void *)ehdr); +unsigned const symsec_sh_link =w (relhdr->sh_link); +Elf_Shdr const *const symsec = &shdr0[symsec_sh_link]; +Elf_Shdr const *const strsec = &shdr0[w (symsec->sh_link)]; +Elf_Rel const *const rel0 = (Elf_Rel const *)(_w (relhdr->sh_offset) + + (void *)ehdr); + + *sym0 = (Elf_Sym const *)(_w (symsec->sh_offset) + + (void *)ehdr); + + *str0 = (char const *)(_w (strsec->sh_offset) + + (void *)ehdr); + + *relp = rel0; +} +/* * Look at the relocations in order to find the calls to mcount. * Accumulate the section offsets that are found, and their relocation info,
@@ -276,26 +302,16 @@ static uint_t *sift_rel_mcount(uint_t *mlocp, {uint_t *const mloc0 = mlocp;Elf_Rel *mrelp = *mrelpp; -Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) - + (void *)ehdr); -unsigned const symsec_sh_link =w (relhdr->sh_link); -Elf_Shdr const *const symsec = &shdr0[symsec_sh_link]; -Elf_Sym const *const sym0 = (Elf_Sym const *)(_w (symsec->sh_offset) - + (void *)ehdr); - -Elf_Shdr const *const strsec = &shdr0[w (symsec->sh_link)]; -char const *const str0 = (char const *)(_w (strsec->sh_offset) - + (void *)ehdr); - -Elf_Rel const *const rel0 = (Elf_Rel const *)(_w (relhdr->sh_offset) - + (void *)ehdr); +Elf_Sym const *sym0; +char const *str0; +Elf_Rel const *relp;unsigned rel_entsize =_w (relhdr->sh_entsize);unsigned const nrel =_w (relhdr->sh_size) / rel_entsize; -Elf_Rel const *relp = rel0; -unsigned mcountsym =0 ;unsigned t; +get_sym_str_and_relp (relhdr, ehdr, &sym0, &str0, &relp); +for (t = nrel; t; --t) {if (!mcountsym) mcountsym =get_mcountsym (sym0, relp, str0);
@@ -331,27 +347,18 @@ static void nop_mcount(Elf_Shdr const *const relhdr, {Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) + (void *)ehdr); -unsigned const symsec_sh_link =w (relhdr->sh_link); -Elf_Shdr const *const symsec = &shdr0[symsec_sh_link]; -Elf_Sym const *const sym0 = (Elf_Sym const *)(_w (symsec->sh_offset) - + (void *)ehdr); - -Elf_Shdr const *const strsec = &shdr0[w (symsec->sh_link)]; -char const *const str0 = (char const *)(_w (strsec->sh_offset) - + (void *)ehdr); - -Elf_Rel const *const rel0 = (Elf_Rel const *)(_w (relhdr->sh_offset) - + (void *)ehdr); +Elf_Sym const *sym0; +char const *str0; +Elf_Rel const *relp; +Elf_Shdr const *const shdr = &shdr0[w (relhdr->sh_info)];unsigned rel_entsize =_w (relhdr->sh_entsize);unsigned const nrel =_w (relhdr->sh_size) / rel_entsize; -Elf_Rel const *relp = rel0; - -Elf_Shdr const *const shdr = &shdr0[w (relhdr->sh_info)]; -unsigned mcountsym =0 ;unsigned t;int once =0 ; +get_sym_str_and_relp (relhdr, ehdr, &sym0, &str0, &relp); +for (t = nrel; t; --t) {int ret =-1 ;
Signature · 1 line
1.7.2.3
[tip:perf/core] ftrace/recordmcount: Add helper function get_sym_str_and_relp()
Commit-ID: 41b402a201a12efdff4acc990e023a89a409cd41 Gitweb: http://git.kernel.org/tip/41b402a201a12efdff4acc990e023a89a409cd41 Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 20 Apr 2011 21:13:06 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Mon, 16 May 2011 14:48:55 -0400
ftrace/recordmcount: Add helper function get_sym_str_and_relp()
The code to get the symbol, string, and relp pointers in the two functions sift_rel_mcount() and nop_mcount() are identical and also non-trivial. Moving this duplicate code into a single helper function makes the code easier to read and more maintainable.
--- scripts/recordmcount.h | 67 ++++++++++++++++++++++++++--------------------- 1 files changed, 37 insertions(+), 30 deletions(-)
scripts/recordmcount.h +37 -30
@@ -29,6 +29,7 @@#undef has_rel_mcount#undef tot_relsize#undef get_mcountsym +#undef get_sym_str_and_relp#undef do_func#undef Elf_Addr#undef Elf_Ehdr
@@ -56,6 +57,7 @@# define __has_rel_mcount __has64_rel_mcount# define has_rel_mcount has64_rel_mcount# define tot_relsize tot64_relsize +# define get_sym_str_and_relp get_sym_str_and_relp_64# define do_func do64# define get_mcountsym get_mcountsym_64# define is_fake_mcount is_fake_mcount64
@@ -86,6 +88,7 @@# define __has_rel_mcount __has32_rel_mcount# define has_rel_mcount has32_rel_mcount# define tot_relsize tot32_relsize +# define get_sym_str_and_relp get_sym_str_and_relp_32# define do_func do32# define get_mcountsym get_mcountsym_32# define is_fake_mcount is_fake_mcount32
@@ -260,6 +263,29 @@ static unsigned get_mcountsym(Elf_Sym const *const sym0,return mcountsym; } +static void get_sym_str_and_relp (Elf_Shdr const *const relhdr, +Elf_Ehdr const *const ehdr, +Elf_Sym const **sym0, +char const **str0, +Elf_Rel const **relp) +{ +Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) + + (void *)ehdr); +unsigned const symsec_sh_link =w (relhdr->sh_link); +Elf_Shdr const *const symsec = &shdr0[symsec_sh_link]; +Elf_Shdr const *const strsec = &shdr0[w (symsec->sh_link)]; +Elf_Rel const *const rel0 = (Elf_Rel const *)(_w (relhdr->sh_offset) + + (void *)ehdr); + + *sym0 = (Elf_Sym const *)(_w (symsec->sh_offset) + + (void *)ehdr); + + *str0 = (char const *)(_w (strsec->sh_offset) + + (void *)ehdr); + + *relp = rel0; +} +/* * Look at the relocations in order to find the calls to mcount. * Accumulate the section offsets that are found, and their relocation info,
@@ -276,26 +302,16 @@ static uint_t *sift_rel_mcount(uint_t *mlocp, {uint_t *const mloc0 = mlocp;Elf_Rel *mrelp = *mrelpp; -Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) - + (void *)ehdr); -unsigned const symsec_sh_link =w (relhdr->sh_link); -Elf_Shdr const *const symsec = &shdr0[symsec_sh_link]; -Elf_Sym const *const sym0 = (Elf_Sym const *)(_w (symsec->sh_offset) - + (void *)ehdr); - -Elf_Shdr const *const strsec = &shdr0[w (symsec->sh_link)]; -char const *const str0 = (char const *)(_w (strsec->sh_offset) - + (void *)ehdr); - -Elf_Rel const *const rel0 = (Elf_Rel const *)(_w (relhdr->sh_offset) - + (void *)ehdr); +Elf_Sym const *sym0; +char const *str0; +Elf_Rel const *relp;unsigned rel_entsize =_w (relhdr->sh_entsize);unsigned const nrel =_w (relhdr->sh_size) / rel_entsize; -Elf_Rel const *relp = rel0; -unsigned mcountsym =0 ;unsigned t; +get_sym_str_and_relp (relhdr, ehdr, &sym0, &str0, &relp); +for (t = nrel; t; --t) {if (!mcountsym) mcountsym =get_mcountsym (sym0, relp, str0);
@@ -331,27 +347,18 @@ static void nop_mcount(Elf_Shdr const *const relhdr, {Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) + (void *)ehdr); -unsigned const symsec_sh_link =w (relhdr->sh_link); -Elf_Shdr const *const symsec = &shdr0[symsec_sh_link]; -Elf_Sym const *const sym0 = (Elf_Sym const *)(_w (symsec->sh_offset) - + (void *)ehdr); - -Elf_Shdr const *const strsec = &shdr0[w (symsec->sh_link)]; -char const *const str0 = (char const *)(_w (strsec->sh_offset) - + (void *)ehdr); - -Elf_Rel const *const rel0 = (Elf_Rel const *)(_w (relhdr->sh_offset) - + (void *)ehdr); +Elf_Sym const *sym0; +char const *str0; +Elf_Rel const *relp; +Elf_Shdr const *const shdr = &shdr0[w (relhdr->sh_info)];unsigned rel_entsize =_w (relhdr->sh_entsize);unsigned const nrel =_w (relhdr->sh_size) / rel_entsize; -Elf_Rel const *relp = rel0; - -Elf_Shdr const *const shdr = &shdr0[w (relhdr->sh_info)]; -unsigned mcountsym =0 ;unsigned t;int once =0 ; +get_sym_str_and_relp (relhdr, ehdr, &sym0, &str0, &relp); +for (t = nrel; t; --t) {int ret =-1 ;
[tip:perf/core] ftrace/recordmcount: Add helper function get_sym_str_and_relp()
In reply to Steven RostedtCommit-ID: 0286d2d12d78ea8aaf0722473dd20cb609a99709 Gitweb: http://git.kernel.org/tip/0286d2d12d78ea8aaf0722473dd20cb609a99709 Author: Steven Rostedt <[email protected]> AuthorDate: Wed, 20 Apr 2011 21:13:06 -0400 Committer: Steven Rostedt <[email protected]> CommitDate: Tue, 17 May 2011 10:42:02 -0400
ftrace/recordmcount: Add helper function get_sym_str_and_relp()
The code to get the symbol, string, and relp pointers in the two functions sift_rel_mcount() and nop_mcount() are identical and also non-trivial. Moving this duplicate code into a single helper function makes the code easier to read and more maintainable.
--- scripts/recordmcount.h | 67 ++++++++++++++++++++++++++--------------------- 1 files changed, 37 insertions(+), 30 deletions(-)
scripts/recordmcount.h +37 -30
@@ -29,6 +29,7 @@#undef has_rel_mcount#undef tot_relsize#undef get_mcountsym +#undef get_sym_str_and_relp#undef do_func#undef Elf_Addr#undef Elf_Ehdr
@@ -56,6 +57,7 @@# define __has_rel_mcount __has64_rel_mcount# define has_rel_mcount has64_rel_mcount# define tot_relsize tot64_relsize +# define get_sym_str_and_relp get_sym_str_and_relp_64# define do_func do64# define get_mcountsym get_mcountsym_64# define is_fake_mcount is_fake_mcount64
@@ -86,6 +88,7 @@# define __has_rel_mcount __has32_rel_mcount# define has_rel_mcount has32_rel_mcount# define tot_relsize tot32_relsize +# define get_sym_str_and_relp get_sym_str_and_relp_32# define do_func do32# define get_mcountsym get_mcountsym_32# define is_fake_mcount is_fake_mcount32
@@ -260,6 +263,29 @@ static unsigned get_mcountsym(Elf_Sym const *const sym0,return mcountsym; } +static void get_sym_str_and_relp (Elf_Shdr const *const relhdr, +Elf_Ehdr const *const ehdr, +Elf_Sym const **sym0, +char const **str0, +Elf_Rel const **relp) +{ +Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) + + (void *)ehdr); +unsigned const symsec_sh_link =w (relhdr->sh_link); +Elf_Shdr const *const symsec = &shdr0[symsec_sh_link]; +Elf_Shdr const *const strsec = &shdr0[w (symsec->sh_link)]; +Elf_Rel const *const rel0 = (Elf_Rel const *)(_w (relhdr->sh_offset) + + (void *)ehdr); + + *sym0 = (Elf_Sym const *)(_w (symsec->sh_offset) + + (void *)ehdr); + + *str0 = (char const *)(_w (strsec->sh_offset) + + (void *)ehdr); + + *relp = rel0; +} +/* * Look at the relocations in order to find the calls to mcount. * Accumulate the section offsets that are found, and their relocation info,
@@ -276,26 +302,16 @@ static uint_t *sift_rel_mcount(uint_t *mlocp, {uint_t *const mloc0 = mlocp;Elf_Rel *mrelp = *mrelpp; -Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) - + (void *)ehdr); -unsigned const symsec_sh_link =w (relhdr->sh_link); -Elf_Shdr const *const symsec = &shdr0[symsec_sh_link]; -Elf_Sym const *const sym0 = (Elf_Sym const *)(_w (symsec->sh_offset) - + (void *)ehdr); - -Elf_Shdr const *const strsec = &shdr0[w (symsec->sh_link)]; -char const *const str0 = (char const *)(_w (strsec->sh_offset) - + (void *)ehdr); - -Elf_Rel const *const rel0 = (Elf_Rel const *)(_w (relhdr->sh_offset) - + (void *)ehdr); +Elf_Sym const *sym0; +char const *str0; +Elf_Rel const *relp;unsigned rel_entsize =_w (relhdr->sh_entsize);unsigned const nrel =_w (relhdr->sh_size) / rel_entsize; -Elf_Rel const *relp = rel0; -unsigned mcountsym =0 ;unsigned t; +get_sym_str_and_relp (relhdr, ehdr, &sym0, &str0, &relp); +for (t = nrel; t; --t) {if (!mcountsym) mcountsym =get_mcountsym (sym0, relp, str0);
@@ -331,27 +347,18 @@ static void nop_mcount(Elf_Shdr const *const relhdr, {Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w (ehdr->e_shoff) + (void *)ehdr); -unsigned const symsec_sh_link =w (relhdr->sh_link); -Elf_Shdr const *const symsec = &shdr0[symsec_sh_link]; -Elf_Sym const *const sym0 = (Elf_Sym const *)(_w (symsec->sh_offset) - + (void *)ehdr); - -Elf_Shdr const *const strsec = &shdr0[w (symsec->sh_link)]; -char const *const str0 = (char const *)(_w (strsec->sh_offset) - + (void *)ehdr); - -Elf_Rel const *const rel0 = (Elf_Rel const *)(_w (relhdr->sh_offset) - + (void *)ehdr); +Elf_Sym const *sym0; +char const *str0; +Elf_Rel const *relp; +Elf_Shdr const *const shdr = &shdr0[w (relhdr->sh_info)];unsigned rel_entsize =_w (relhdr->sh_entsize);unsigned const nrel =_w (relhdr->sh_size) / rel_entsize; -Elf_Rel const *relp = rel0; - -Elf_Shdr const *const shdr = &shdr0[w (relhdr->sh_info)]; -unsigned mcountsym =0 ;unsigned t;int once =0 ; +get_sym_str_and_relp (relhdr, ehdr, &sym0, &str0, &relp); +for (t = nrel; t; --t) {int ret =-1 ;