tracing: merge seq_print_sym_short() and seq_print_sym_offset()
PATCH v2 1/3 tracing: merge seq_print_sym_short() and seq_print_sym_offset()
These two functions are nearly identical, so we can avoid some code duplication by moving the conditional into a common implementation.
--- kernel/trace/trace_output.c | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-)
kernel/trace/trace_output.c +7 -27
@@ -339,34 +339,17 @@ static inline const char *kretprobed(const char *name)#endif /* CONFIG_KRETPROBES */ static void -seq_print_sym_short (struct trace_seq *s,const char *fmt,unsigned long address) +seq_print_sym (struct trace_seq *s,const char *fmt,unsigned long address, +bool with_offset) {char str[KSYM_SYMBOL_LEN ];#ifdef CONFIG_KALLSYMS const char *name; -kallsyms_lookup (address,NULL ,NULL ,NULL , str); - - name =kretprobed (str); - -if (name &&strlen (name)) { -trace_seq_printf (s, fmt, name); -return ; - } -#endif -snprintf (str,KSYM_SYMBOL_LEN ,"0x%08lx" , address); -trace_seq_printf (s, fmt, str); -} - -static void -seq_print_sym_offset (struct trace_seq *s,const char *fmt, -unsigned long address) -{ -char str[KSYM_SYMBOL_LEN ]; -#ifdef CONFIG_KALLSYMS -const char *name; - -sprint_symbol (str, address); +if (with_offset) +sprint_symbol (str, address); +else +kallsyms_lookup (address,NULL ,NULL ,NULL , str); name =kretprobed (str);if (name &&strlen (name)) {
@@ -424,10 +407,7 @@ seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags) goto out; } -if (sym_flags &TRACE_ITER_SYM_OFFSET ) -seq_print_sym_offset (s,"%s" , ip); -else -seq_print_sym_short (s,"%s" , ip); +seq_print_sym (s,"%s" , ip, sym_flags &TRACE_ITER_SYM_OFFSET );if (sym_flags &TRACE_ITER_SYM_ADDR )trace_seq_printf (s," <" IP_FMT ">" , ip);
Signature · 1 line
2.19.1.6.gbde171bbf5
PATCH v2 2/3 tracing: avoid -Wformat-nonliteral warning
Building with -Wformat-nonliteral, gcc complains
kernel/trace/trace_output.c: In function ‘seq_print_sym’:kernel/trace/trace_output.c:356:3: warning: format not a string literal, argument types not checked [-Wformat-nonliteral]
trace_seq_printf(s, fmt, name);
But seq_print_sym only has a single caller which passes "%s" as fmt, so we might as well just use that directly. That also paves the way for further cleanups that will actually make that format string go away entirely.
--- kernel/trace/trace_output.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
kernel/trace/trace_output.c +4 -5
@@ -339,8 +339,7 @@ static inline const char *kretprobed(const char *name)#endif /* CONFIG_KRETPROBES */ static void -seq_print_sym (struct trace_seq *s,const char *fmt,unsigned long address, -bool with_offset) +seq_print_sym (struct trace_seq *s,unsigned long address,bool with_offset) {char str[KSYM_SYMBOL_LEN ];#ifdef CONFIG_KALLSYMS
@@ -353,12 +352,12 @@ seq_print_sym(struct trace_seq *s, const char *fmt, unsigned long address, name =kretprobed (str);if (name &&strlen (name)) { -trace_seq_printf (s, fmt, name); +trace_seq_printf (s,"%s" , name);return ; }#endif snprintf (str,KSYM_SYMBOL_LEN ,"0x%08lx" , address); -trace_seq_printf (s, fmt, str); +trace_seq_printf (s,"%s" , str); }#ifndef CONFIG_64BIT
@@ -407,7 +406,7 @@ seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags) goto out; } -seq_print_sym (s,"%s" , ip, sym_flags &TRACE_ITER_SYM_OFFSET ); +seq_print_sym (s, ip, sym_flags &TRACE_ITER_SYM_OFFSET );if (sym_flags &TRACE_ITER_SYM_ADDR )trace_seq_printf (s," <" IP_FMT ">" , ip);
Signature · 1 line
2.19.1.6.gbde171bbf5
PATCH v2 3/3 tracing: simplify printf'ing in seq_print_sym
In reply to Rasmus Villemoestrace_seq_printf(..., "%s", ...) can be done with trace_seq_puts() instead, avoiding printf overhead. In the second instance, the string we're copying was just created from an snprintf() to a stack buffer, so we might as well do that printf directly. This naturally leads to moving the declaration of the str buffer inside the CONFIG_KALLSYMS guard, which in turn will make gcc inline the function for !CONFIG_KALLSYMS (it only has a single caller, but the huge stack frame seems to make gcc not inline it for CONFIG_KALLSYMS).
--- kernel/trace/trace_output.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
kernel/trace/trace_output.c +3 -4
@@ -341,8 +341,8 @@ static inline const char *kretprobed(const char *name)static void seq_print_sym (struct trace_seq *s,unsigned long address,bool with_offset) { -char str[KSYM_SYMBOL_LEN ];#ifdef CONFIG_KALLSYMS +char str[KSYM_SYMBOL_LEN ];const char *name;if (with_offset)
@@ -352,12 +352,11 @@ seq_print_sym(struct trace_seq *s, unsigned long address, bool with_offset) name =kretprobed (str);if (name &&strlen (name)) { -trace_seq_printf (s,"%s" , name); +trace_seq_puts (s, name);return ; }#endif -snprintf (str,KSYM_SYMBOL_LEN ,"0x%08lx" , address); -trace_seq_printf (s,"%s" , str); +trace_seq_printf (s,"0x%08lx" , address); }#ifndef CONFIG_64BIT
Signature · 1 line
2.19.1.6.gbde171bbf5
Steven Rostedt
maintainerHi Ramus,
Thanks for sending these patches. I have some small nits though.
First, please send a cover letter whenever sending more than one patch. It just groups them better in my inbox.
The second is embedded below.
Quoted 13 lines · On Fri, 26 Oct 2018 23:13:44 +0200 Rasmus Villemoes <[email protected]>…
These two functions are nearly identical, so we can avoid some code duplication by moving the conditional into a common implementation.
Signed-off-by Rasmus Villemoes <[email protected]>--- kernel/trace/trace_output.c | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-)kernel/trace/trace_output.c +0
-0
kernel/trace/trace_output.c static inline const char *kretprobed(const char *name) · line 343
Quoted 6 lines
kernel/trace/trace_output.c +2
-1@@ -339,34 +339,17 @@ static inline const char *kretprobed(const char *name)#endif /* CONFIG_KRETPROBES */ static void -seq_print_sym_short (struct trace_seq *s,const char *fmt,unsigned long address) +seq_print_sym (struct trace_seq *s,const char *fmt,unsigned long address, +bool with_offset)
Just call the variable "offset". It's rather obvious what that means.
The other patches look good, but can you send a v2 of the series, with these updates?
Thanks!
-- Steve
Quoted 46 lines
kernel/trace/trace_output.c +5
-26{char str[KSYM_SYMBOL_LEN ];#ifdef CONFIG_KALLSYMS const char *name; -kallsyms_lookup (address,NULL ,NULL ,NULL , str); - - name =kretprobed (str); - -if (name &&strlen (name)) { -trace_seq_printf (s, fmt, name); -return ; - } -#endif -snprintf (str,KSYM_SYMBOL_LEN ,"0x%08lx" , address); -trace_seq_printf (s, fmt, str); -} - -static void -seq_print_sym_offset (struct trace_seq *s,const char *fmt, -unsigned long address) -{ -char str[KSYM_SYMBOL_LEN ]; -#ifdef CONFIG_KALLSYMS -const char *name; - -sprint_symbol (str, address); +if (with_offset) +sprint_symbol (str, address); +else +kallsyms_lookup (address,NULL ,NULL ,NULL , str); name =kretprobed (str);if (name &&strlen (name)) {@@ -424,10 +407,7 @@ seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags) goto out; } -if (sym_flags &TRACE_ITER_SYM_OFFSET ) -seq_print_sym_offset (s,"%s" , ip); -else -seq_print_sym_short (s,"%s" , ip); +seq_print_sym (s,"%s" , ip, sym_flags &TRACE_ITER_SYM_OFFSET );if (sym_flags &TRACE_ITER_SYM_ADDR )trace_seq_printf (s," <" IP_FMT ">" , ip);
v2 cover tracing: a few simplifying patches
In reply to Rasmus VillemoesPlaying around with -Wformat-nonliteral, I stumbled on two instances in trace_output.c. Looking at the code a bit, turns out one can remove the use of the non-constant format string and eliminate some code duplication at the same time.
v2: Include cover letter, rename argument with_offset -> offset.
Rasmus Villemoes (3):
tracing: merge seq_print_sym_short() and seq_print_sym_offset()
tracing: avoid -Wformat-nonliteral warning
tracing: simplify printf'ing in seq_print_sym
kernel/trace/trace_output.c | 38 ++++++++----------------------------- 1 file changed, 8 insertions(+), 30 deletions(-)
Signature · 1 line
2.19.1.6.gbde171bbf5
PATCH v2 1/3 tracing: merge seq_print_sym_short() and seq_print_sym_offset()
These two functions are nearly identical, so we can avoid some code duplication by moving the conditional into a common implementation.
--- kernel/trace/trace_output.c | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-)
kernel/trace/trace_output.c +7 -27
@@ -339,34 +339,17 @@ static inline const char *kretprobed(const char *name)#endif /* CONFIG_KRETPROBES */ static void -seq_print_sym_short (struct trace_seq *s,const char *fmt,unsigned long address) +seq_print_sym (struct trace_seq *s,const char *fmt,unsigned long address, +bool offset) {char str[KSYM_SYMBOL_LEN ];#ifdef CONFIG_KALLSYMS const char *name; -kallsyms_lookup (address,NULL ,NULL ,NULL , str); - - name =kretprobed (str); - -if (name &&strlen (name)) { -trace_seq_printf (s, fmt, name); -return ; - } -#endif -snprintf (str,KSYM_SYMBOL_LEN ,"0x%08lx" , address); -trace_seq_printf (s, fmt, str); -} - -static void -seq_print_sym_offset (struct trace_seq *s,const char *fmt, -unsigned long address) -{ -char str[KSYM_SYMBOL_LEN ]; -#ifdef CONFIG_KALLSYMS -const char *name; - -sprint_symbol (str, address); +if (offset) +sprint_symbol (str, address); +else +kallsyms_lookup (address,NULL ,NULL ,NULL , str); name =kretprobed (str);if (name &&strlen (name)) {
@@ -424,10 +407,7 @@ seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags) goto out; } -if (sym_flags &TRACE_ITER_SYM_OFFSET ) -seq_print_sym_offset (s,"%s" , ip); -else -seq_print_sym_short (s,"%s" , ip); +seq_print_sym (s,"%s" , ip, sym_flags &TRACE_ITER_SYM_OFFSET );if (sym_flags &TRACE_ITER_SYM_ADDR )trace_seq_printf (s," <" IP_FMT ">" , ip);
Signature · 1 line
2.19.1.6.gbde171bbf5
PATCH v2 2/3 tracing: avoid -Wformat-nonliteral warning
In reply to Rasmus VillemoesBuilding with -Wformat-nonliteral, gcc complains
kernel/trace/trace_output.c: In function ‘seq_print_sym’:kernel/trace/trace_output.c:356:3: warning: format not a string literal, argument types not checked [-Wformat-nonliteral]
trace_seq_printf(s, fmt, name);
But seq_print_sym only has a single caller which passes "%s" as fmt, so we might as well just use that directly. That also paves the way for further cleanups that will actually make that format string go away entirely.
--- kernel/trace/trace_output.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
kernel/trace/trace_output.c +4 -5
@@ -339,8 +339,7 @@ static inline const char *kretprobed(const char *name)#endif /* CONFIG_KRETPROBES */ static void -seq_print_sym (struct trace_seq *s,const char *fmt,unsigned long address, -bool offset) +seq_print_sym (struct trace_seq *s,unsigned long address,bool offset) {char str[KSYM_SYMBOL_LEN ];#ifdef CONFIG_KALLSYMS
@@ -353,12 +352,12 @@ seq_print_sym(struct trace_seq *s, const char *fmt, unsigned long address, name =kretprobed (str);if (name &&strlen (name)) { -trace_seq_printf (s, fmt, name); +trace_seq_printf (s,"%s" , name);return ; }#endif snprintf (str,KSYM_SYMBOL_LEN ,"0x%08lx" , address); -trace_seq_printf (s, fmt, str); +trace_seq_printf (s,"%s" , str); }#ifndef CONFIG_64BIT
@@ -407,7 +406,7 @@ seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags) goto out; } -seq_print_sym (s,"%s" , ip, sym_flags &TRACE_ITER_SYM_OFFSET ); +seq_print_sym (s, ip, sym_flags &TRACE_ITER_SYM_OFFSET );if (sym_flags &TRACE_ITER_SYM_ADDR )trace_seq_printf (s," <" IP_FMT ">" , ip);
Signature · 1 line
2.19.1.6.gbde171bbf5
PATCH v2 3/3 tracing: simplify printf'ing in seq_print_sym
In reply to Rasmus Villemoestrace_seq_printf(..., "%s", ...) can be done with trace_seq_puts() instead, avoiding printf overhead. In the second instance, the string we're copying was just created from an snprintf() to a stack buffer, so we might as well do that printf directly. This naturally leads to moving the declaration of the str buffer inside the CONFIG_KALLSYMS guard, which in turn will make gcc inline the function for !CONFIG_KALLSYMS (it only has a single caller, but the huge stack frame seems to make gcc not inline it for CONFIG_KALLSYMS).
--- kernel/trace/trace_output.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
kernel/trace/trace_output.c +3 -4
@@ -341,8 +341,8 @@ static inline const char *kretprobed(const char *name)static void seq_print_sym (struct trace_seq *s,unsigned long address,bool offset) { -char str[KSYM_SYMBOL_LEN ];#ifdef CONFIG_KALLSYMS +char str[KSYM_SYMBOL_LEN ];const char *name;if (offset)
@@ -352,12 +352,11 @@ seq_print_sym(struct trace_seq *s, unsigned long address, bool offset) name =kretprobed (str);if (name &&strlen (name)) { -trace_seq_printf (s,"%s" , name); +trace_seq_puts (s, name);return ; }#endif -snprintf (str,KSYM_SYMBOL_LEN ,"0x%08lx" , address); -trace_seq_printf (s,"%s" , str); +trace_seq_printf (s,"0x%08lx" , address); }#ifndef CONFIG_64BIT
Signature · 1 line
2.19.1.6.gbde171bbf5
Steven Rostedt
maintainerRe: [PATCH v2 0/3] tracing: a few simplifying patches
In reply to Rasmus VillemoesOn Mon, 29 Oct 2018 23:35:39 +0100
Rasmus Villemoes <[email protected]> wrote:
Hi Rasmus,
I'm currently traveling. I'll try to take a look at these later. If you don't hear from me by next week, feel free to send me a gentle reminder ;-)
-- Steve
Quoted 15 lines
Playing around with -Wformat-nonliteral, I stumbled on two instances in
trace_output.c. Looking at the code a bit, turns out one can remove the use of the non-constant format string and eliminate some code duplication at the same time.v2: Include cover letter, rename argument
with_offset-> offset.Rasmus Villemoes (3):
tracing: mergeseq_print_sym_short()andseq_print_sym_offset()
tracing: avoid -Wformat-nonliteral warning
tracing: simplify printf'ing inseq_print_symkernel/trace/trace_output.c | 38 ++++++++----------------------------- 1 file changed, 8 insertions(+), 30 deletions(-)