unlikely profiler and tracer
Subsystems (4)
Steven Rostedt
maintainercover unlikely profiler and tracer
Ingo,
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
branch: tip/devel
Steven Rostedt (2):
trace: profile likely and unlikely annotations
ftrace: unlikely annotation tracer
----
arch/x86/kernel/vsyscall_64.c | 8 + include/asm-generic/vmlinux.lds.h | 14 ++- include/linux/compiler.h | 61 ++++++++- kernel/trace/Kconfig | 38 +++++ kernel/trace/Makefile | 7 + kernel/trace/trace.c | 29 ++++ kernel/trace/trace.h | 39 +++++ kernel/trace/trace_unlikely.c | 278 +++++++++++++++++++++++++++++++++++++ 8 files changed, 471 insertions(+), 3 deletions(-)
Steven Rostedt
maintainerPATCH 1/2 trace: profile likely and unlikely annotations
Impact: new unlikely/likely profiler
Andrew Morton recently suggested having an in-kernel way to profile likely and unlikely macros. This patch achieves that goal.
When configured, every(*) likely and unlikely macro gets a counter attached to it. When the condition is hit, the hit and misses of that condition are recorded. These numbers can later be retrieved by:
/debugfs/tracing/profile_likely - All likely markers
/debugfs/tracing/profile_unlikely - All unlikely markers.
# cat /debug/tracing/profile_unlikely | head
correct incorrect % Function File Line
------- --------- - -------- ---- ----
2167 0 0 do_arch_prctl process_64.c 832
0 0 0 do_arch_prctl process_64.c 804
2670 0 0 IS_ERR err.h 34
71230 5693 7 __switch_to process_64.c 673
76919 0 0 __switch_to process_64.c 639
43184 33743 43 __switch_to process_64.c 624
12740 64181 83 __switch_to process_64.c 594
12740 64174 83 __switch_to process_64.c 590# cat /debug/tracing/profile_unlikely | \
awk '{ if ($3 > 25) print $0; }' |head -20
44963 35259 43 __switch_to process_64.c 624
12762 67454 84 __switch_to process_64.c 594
12762 67447 84 __switch_to process_64.c 590
1478 595 28 syscall_get_error syscall.h 51
0 2821 100 syscall_trace_leave ptrace.c 1567
0 1 100 native_smp_prepare_cpus smpboot.c 1237
86338 265881 75 calc_delta_fair sched_fair.c 408
210410 108540 34 calc_delta_mine sched.c 1267
0 54550 100 sched_info_queued sched_stats.h 222
51899 66435 56 pick_next_task_fair sched_fair.c 1422
6 10 62 yield_task_fair sched_fair.c 982
7325 2692 26 rt_policy sched.c 144
0 1270 100 pre_schedule_rt sched_rt.c 1261
1268 48073 97 pick_next_task_rt sched_rt.c 884
0 45181 100 sched_info_dequeued sched_stats.h 177
0 15 100 sched_move_task sched.c 8700
0 15 100 sched_move_task sched.c 8690
53167 33217 38 schedule sched.c 4457
0 80208 100 sched_info_switch sched_stats.h 270
30585 49631 61 context_switch sched.c 2619# cat /debug/tracing/profile_likely | awk '{ if ($3 > 25) print $0; }'
39900 36577 47 pick_next_task sched.c 4397
20824 15233 42 switch_mm mmu_context_64.h 18
0 7 100 __cancel_work_timer workqueue.c 560
617 66484 99 clocksource_adjust timekeeping.c 456
0 346340 100 audit_syscall_exit auditsc.c 1570
38 347350 99 audit_get_context auditsc.c 732
0 345244 100 audit_syscall_entry auditsc.c 1541
38 1017 96 audit_free auditsc.c 1446
0 1090 100 audit_alloc auditsc.c 862
2618 1090 29 audit_alloc auditsc.c 858
0 6 100 move_masked_irq migration.c 9
1 198 99 probe_sched_wakeup trace_sched_switch.c 58
2 2 50 probe_wakeup trace_sched_wakeup.c 227
0 2 100 probe_wakeup_sched_switch trace_sched_wakeup.c 144
4514 2090 31 __grab_cache_page filemap.c 2149
12882 228786 94 mapping_unevictable pagemap.h 50
4 11 73 __flush_cpu_slab slub.c 1466
627757 330451 34 slab_free slub.c 1731
2959 61245 95 dentry_lru_del_init dcache.c 153
946 1217 56 load_elf_binary binfmt_elf.c 904
102 82 44 disk_put_part genhd.h 206
1 1 50 dst_gc_task dst.c 82
0 19 100 tcp_mss_split_point tcp_output.c 1126As you can see by the above, there's a bit of work to do in rethinking the use of some unlikelys and likelys. Note: the unlikely case had 71 hits that were more than 25%.
Note: After submitting my first version of this patch, Andrew Morton
showed me a version written by Daniel Walker, where I picked up the following ideas from:
1) Using __builtin_constant_p to avoid profiling fixed values. 2) Using __FILE__ instead of instruction pointers. 3) Using the preprocessor to stop all profiling of likely
annotations from vsyscall_64.c.
Thanks to Andrew Morton, Arjan van de Ven, Theodore Tso and Ingo Molnar for their feed back on this patch.
(*) Not ever unlikely is recorded, those that are used by vsyscalls
(a few of them) had to have profiling disabled.
--- arch/x86/kernel/vsyscall_64.c | 8 ++ include/asm-generic/vmlinux.lds.h | 14 +++- include/linux/compiler.h | 61 +++++++++++++- kernel/trace/Kconfig | 16 ++++ kernel/trace/Makefile | 1 + kernel/trace/trace_unlikely.c | 164 +++++++++++++++++++++++++++++++++++++ 6 files changed, 261 insertions(+), 3 deletions(-) create mode 100644 kernel/trace/trace_unlikely.c
arch/x86/kernel/vsyscall_64.c +8 -0
@@ -17,6 +17,14 @@* want per guest time just set the kernel.vsyscall64 sysctl to 0. */ +/* Protect userspace from profiling */ +#ifdef CONFIG_TRACE_UNLIKELY_PROFILE +# undef likely +# undef unlikely +# define likely (x) likely_notrace(x) +# define unlikely (x) unlikely_notrace(x) +#endif +#include <linux/time.h> #include <linux/init.h> #include <linux/kernel.h>
include/asm-generic/vmlinux.lds.h +13 -1
@@ -45,6 +45,17 @@#define MCOUNT_REC ()#endif +#ifdef CONFIG_TRACE_UNLIKELY_PROFILE +#define LIKELY_PROFILE () VMLINUX_SYMBOL(__start_likely_profile) = .; \ + *(_ftrace_likely) \ + VMLINUX_SYMBOL(__stop_likely_profile) = .; \ + VMLINUX_SYMBOL(__start_unlikely_profile) = .; \ + *(_ftrace_unlikely) \ + VMLINUX_SYMBOL(__stop_unlikely_profile) = .; +#else +#define LIKELY_PROFILE () +#endif +/* .data section */ #define DATA_DATA \ *(.data) \
@@ -62,7 +73,8 @@ VMLINUX_SYMBOL(__stop___markers) = .; \ VMLINUX_SYMBOL(__start___tracepoints) = .; \ *(__tracepoints ) \ - VMLINUX_SYMBOL(__stop___tracepoints) = .; + VMLINUX_SYMBOL(__stop___tracepoints) = .; \ +LIKELY_PROFILE () #define RO_DATA(align) \ . = ALIGN((align)); \
include/linux/compiler.h +59 -2
67 lines not on this page · raw message
kernel/trace/Kconfig +16 -0
@@ -159,6 +159,22 @@ config BOOT_TRACER selected, because the self-tests are an initcall as well and that would invalidate the boot trace. ) +config TRACE_UNLIKELY_PROFILE + bool "Trace likely/unlikely profiler" + depends on DEBUG_KERNEL + select TRACING + help + This tracer profiles all the the likely and unlikely macros + in the kernel. It will display the results in: + + /debugfs/tracing/profile_likely + /debugfs/tracing/profile_unlikely + + Note: this will add a significant overhead, only turn this + on if you need to profile the system's use of these macros. + + Say N if unsure. + config STACK_TRACER bool "Trace max stack" depends on HAVE_FUNCTION_TRACER
kernel/trace/Makefile +1 -0
@@ -25,5 +25,6 @@ obj-$(CONFIG_STACK_TRACER) += trace_stack.o obj-$(CONFIG_MMIOTRACE) += trace_mmiotrace.o obj-$(CONFIG_BOOT_TRACER) += trace_boot.o obj-$(CONFIG_FUNCTION_RET_TRACER) += trace_functions_return.o +obj-$(CONFIG_TRACE_UNLIKELY_PROFILE) += trace_unlikely.o libftrace-y := ftrace.o
kernel/trace/trace_unlikely.c new file +164 -0
164 lines not on this page · raw message
Signature · 3 lines
1.5.6.5 --
Steven Rostedt
maintainerPATCH 2/2 ftrace: unlikely annotation tracer
In reply to Steven RostedtImpact: new unlikely tracer
This patch adds a way to record the instances of the likely and unlikely condition annotations.
When "unlikely" is set in /debugfs/tracing/iter_ctrl the unlikely conditions will be added to any of the ftrace tracers. The change takes effect when a new tracer is passed into the current_tracer file.
For example:
bash-3471 [003] 357.014755: [INCORRECT] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [correct] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014759: [correct] account_group_exec_runtime:sched_stats.h:356 bash-3471 [003] 357.014761: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014763: [INCORRECT] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014765: [correct] calc_delta_mine:sched.c:1279
Which shows the normal tracer heading, as well as whether the condition was correct "[correct]" or was mistaken "[INCORRECT]", followed by the function, file name and line number.
--- kernel/trace/Kconfig | 22 ++++++++ kernel/trace/Makefile | 6 ++ kernel/trace/trace.c | 29 ++++++++++ kernel/trace/trace.h | 39 ++++++++++++++ kernel/trace/trace_unlikely.c | 114 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 210 insertions(+), 0 deletions(-)
kernel/trace/Kconfig +22 -0
@@ -175,6 +175,28 @@ config TRACE_UNLIKELY_PROFILE Say N if unsure. +config TRACING_UNLIKELY + bool + help + Selected by tracers that will trace the likely and unlikely + conditions. This prevents the tracers themselves from being + profiled. Profiling the tracing infrastructure can only happen + when the likelys and unlikelys are not being traced. + +config UNLIKELY_TRACER + bool "Trace likely/unlikely instances" + depends on TRACE_UNLIKELY_PROFILE + select TRACING_UNLIKELY + help + This traces the events of likely and unlikely condition + calls in the kernel. The difference between this and the + "Trace likely/unlikely profiler" is that this is not a + histogram of the callers, but actually places the calling + events into a running trace buffer to see when and where the + events happened, as well as their results. + + Say N if unsure. + config STACK_TRACER bool "Trace max stack" depends on HAVE_FUNCTION_TRACER
kernel/trace/Makefile +6 -0
@@ -10,6 +10,12 @@ CFLAGS_trace_selftest_dynamic.o = -pg obj-y += trace_selftest_dynamic.o endif +# If unlikely tracing is enabled, do not trace these files +ifdef CONFIG_TRACING_UNLIKELY +KBUILD_CFLAGS += '-Dlikely(x)=likely_notrace(x)' +KBUILD_CFLAGS += '-Dunlikely(x)=unlikely_notrace(x)' +endif + obj-$(CONFIG_FUNCTION_TRACER) += libftrace.o obj-$(CONFIG_RING_BUFFER) += ring_buffer.o
kernel/trace/trace.c +29 -0
@@ -258,6 +258,9 @@ static const char *trace_options[] = {"sched-tree" ,"ftrace_printk" ,"ftrace_preempt" , +#ifdef CONFIG_UNLIKELY_TRACER +"unlikely" , +#endif NULL };
@@ -1648,6 +1651,18 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)trace_seq_print_cont (s, iter);break ; } +case TRACE_UNLIKELY : { +struct trace_unlikely *field; + +trace_assign_type (field, entry); + +trace_seq_printf (s,"[%s] %s:%s:%d\n" , + field->correct ?"correct" :"INCORRECT" , + field->func, + field->file, + field->line); +break ; + }default :trace_seq_printf (s,"Unknown type %d\n" , entry->type); }
@@ -1787,6 +1802,18 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)return print_return_function (iter);break ; } +case TRACE_UNLIKELY : { +struct trace_unlikely *field; + +trace_assign_type (field, entry); + +trace_seq_printf (s,"[%s] %s:%s:%d\n" , + field->correct ?"correct" :"INCORRECT" , + field->func, + field->file, + field->line); +break ; + } }return TRACE_TYPE_HANDLED ; }
@@ -2592,6 +2619,7 @@ static int tracing_set_tracer(char *buf)if (t == current_trace) goto out; +trace_unlikely_disable ();if (current_trace && current_trace->reset) current_trace->reset (tr);
@@ -2599,6 +2627,7 @@ static int tracing_set_tracer(char *buf)if (t->init) t->init (tr); +trace_unlikely_enable (tr); out:mutex_unlock (&trace_types_lock);
kernel/trace/trace.h +39 -0
@@ -21,6 +21,7 @@ enum trace_type {TRACE_SPECIAL ,TRACE_MMIO_RW ,TRACE_MMIO_MAP , +TRACE_UNLIKELY ,TRACE_BOOT , TRACE_FN_RET,
@@ -127,6 +128,16 @@ struct trace_boot {struct boot_trace initcall; }; +#define TRACE_FUNC_SIZE 30 +#define TRACE_FILE_SIZE 20 +struct trace_unlikely { +struct trace_entry ent; +unsigned line; +char func[TRACE_FUNC_SIZE +1 ]; +char file[TRACE_FILE_SIZE +1 ]; +char correct; +}; +/* * trace_flag_type is an enumeration that holds different * states when a trace occurs. These are:
@@ -228,6 +239,7 @@ extern void __ftrace_bad_type(void); IF_ASSIGN(var, ent, struct trace_mmiotrace_map, \TRACE_MMIO_MAP ); \ IF_ASSIGN(var, ent, struct trace_boot, TRACE_BOOT); \ + IF_ASSIGN(var, ent, struct trace_unlikely, TRACE_UNLIKELY); \ IF_ASSIGN(var, ent, struct ftrace_ret_entry, TRACE_FN_RET); \__ftrace_bad_type (); \ }while (0 )
@@ -448,6 +460,9 @@ enum trace_iterator_flags {TRACE_ITER_SCHED_TREE =0x200 ,TRACE_ITER_PRINTK =0x400 ,TRACE_ITER_PREEMPTONLY =0x800 , +#ifdef CONFIG_UNLIKELY_TRACER + TRACE_ITER_UNLIKELY = 0x1000, +#endif };/*
@@ -507,4 +522,28 @@ static inline void ftrace_preempt_enable(int resched) preempt_enable_notrace(); } +#ifdef CONFIG_UNLIKELY_TRACER +extern int enable_unlikely_tracing (struct trace_array *tr); +extern void disable_unlikely_tracing (void ); +static inline int trace_unlikely_enable (struct trace_array *tr) +{ +if (trace_flags &TRACE_ITER_UNLIKELY ) +return enable_unlikely_tracing (tr); +return 0 ; +} +static inline void trace_unlikely_disable (void ) +{ +/* due to races, always disable */ +disable_unlikely_tracing (); +} +#else +static inline int trace_unlikely_enable (struct trace_array *tr) +{ +return 0 ; +} +static inline void trace_unlikely_disable (void ) +{ +} +#endif /* CONFIG_UNLIKELY_TRACER */ +#endif /* _LINUX_KERNEL_TRACE_H */
kernel/trace/trace_unlikely.c +114 -0
122 lines not on this page · raw message
Signature · 3 lines
1.5.6.5 --
PATCH 1/1 tracing: branch tracer, tweak output
a small detail:
Quoted 9 lines
For example:
bash-3471 [003] 357.014755: [INCORRECT] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [correct] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014759: [correct] account_group_exec_runtime:sched_stats.h:356 bash-3471 [003] 357.014761: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014763: [INCORRECT] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014765: [correct] calc_delta_mine:sched.c:1279
it's always good to have such fields aligned vertically. Something like this would be shorter and visually much easier to parse:
bash-3471 [003] 357.014755: [ MISS ] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [ .... ] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [ .... ] calc_delta_fair:sched_fair.c:411
any objections against the patch below which implements this?
Ingo
----------->
Quoted 1 line
From
f88c4ae9f8c3939bee4337c75c7a673b5de7a8a7Mon Sep 17 00:00:00 2001
From: Ingo Molnar <[email protected]>
Date: Wed, 12 Nov 2008 11:55:41 +0100
Subject: [PATCH] tracing: branch tracer, tweak output
Impact: modify the tracer output, to make it a bit easier to read
Change the output from:
Quoted 3 lines
bash-3471 [003] 357.014755: [INCORRECT] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [correct] calc_delta_fair:sched_fair.c:411
to:
Quoted 3 lines
bash-3471 [003] 357.014755: [ MISS ] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [ .... ] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [ .... ] calc_delta_fair:sched_fair.c:411
it's good to have fields aligned vertically, and the only important information is a prediction miss, so display only that information.
--- kernel/trace/trace.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
kernel/trace/trace.c +2 -2
@@ -1657,7 +1657,7 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)trace_assign_type (field, entry);trace_seq_printf (s,"[%s] %s:%s:%d\n" , - field->correct ?"correct" :"INCORRECT" , + field->correct ?" .... " :" MISS " , field->func, field->file, field->line);
@@ -1808,7 +1808,7 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)trace_assign_type (field, entry);trace_seq_printf (s,"[%s] %s:%s:%d\n" , - field->correct ?"correct" :"INCORRECT" , + field->correct ?" .... " :" MISS " , field->func, field->file, field->line);
Re: [PATCH] tracing: branch tracer, tweak output
Quoted 12 lines · Ingo Molnar
a small detail:
Quoted 9 lines
For example:
bash-3471 [003] 357.014755: [INCORRECT] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [correct] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014759: [correct] account_group_exec_runtime:sched_stats.h:356 bash-3471 [003] 357.014761: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014763: [INCORRECT] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014765: [correct] calc_delta_mine:sched.c:1279
Quoted 8 lines
it's always good to have such fields aligned vertically. Something like this would be shorter and visually much easier to parse:
bash-3471 [003] 357.014755: [ MISS ] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [ .... ] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [ .... ] calc_delta_fair:sched_fair.c:411any objections against the patch below which implements this?
and note that this is really a "branch tracer/profiler", with branch taken/untaken prediction hits/misses. The likely()/unlikely() is an in-kernel tool to manually predict branch likelyhood - and for now we trace and profile those points that we tweaked manually - but there's no reason why that should be true for future versions too.
So i think it's generally better to think of these events as hit/miss events.
Ingo
PATCH 1/1 tracing: branch tracer, fix vdso crash
In reply to Ingo MolnarQuoted 1 line
From
2b7d0390a6d6d595f43ea3806639664afe5b9ebeMon Sep 17 00:00:00 2001
From: Ingo Molnar <[email protected]>
Date: Wed, 12 Nov 2008 13:17:38 +0100
Subject: [PATCH] tracing: branch tracer, fix vdso crash
Impact: fix bootup crash
the branch tracer missed arch/x86/vdso/vclock_gettime.c from disabling tracing, which caused such bootup crashes:
[ 201.840097] init[1]: segfault at 7fffed3fe7c0 ip 00007fffed3fea2e sp 000077
also clean up the ugly ifdefs in arch/x86/kernel/vsyscall_64.c by creating DISABLE_UNLIKELY_PROFILE facility for code to turn off instrumentation on a per file basis.
--- arch/x86/kernel/vsyscall_64.c | 9 ++------- arch/x86/vdso/vclock_gettime.c | 3 +++ include/linux/compiler.h | 6 +++++- 3 files changed, 10 insertions(+), 8 deletions(-)
arch/x86/kernel/vsyscall_64.c +2 -7
@@ -17,13 +17,8 @@* want per guest time just set the kernel.vsyscall64 sysctl to 0. */ -/* Protect userspace from profiling */ -#ifdef CONFIG_TRACE_UNLIKELY_PROFILE -# undef likely -# undef unlikely -# define likely (x) likely_notrace(x) -# define unlikely (x) unlikely_notrace(x) -#endif +/* Disable profiling for userspace code: */ +#define DISABLE_UNLIKELY_PROFILE #include <linux/time.h> #include <linux/init.h>
arch/x86/vdso/vclock_gettime.c +3 -0
@@ -9,6 +9,9 @@* Also alternative() doesn't work. */ +/* Disable profiling for userspace code: */ +#define DISABLE_UNLIKELY_PROFILE +#include <linux/kernel.h> #include <linux/posix-timers.h> #include <linux/time.h>
include/linux/compiler.h +5 -1
@@ -59,7 +59,11 @@ extern void __chk_io_ptr(const volatile void __iomem *);* specific implementations come from the above header files */ -#ifdef CONFIG_TRACE_UNLIKELY_PROFILE +/* +* Note: DISABLE_UNLIKELY_PROFILE can be used by special lowlevel code +* to disable branch tracing on a per file basis. +*/ +#if defined(CONFIG_TRACE_UNLIKELY_PROFILE) && !defined(DISABLE_UNLIKELY_PROFILE) struct ftrace_likely_data { const char *func; const char *file;
Steven Rostedt
maintainerRe: [PATCH] tracing: branch tracer, tweak output
In reply to Ingo MolnarQuoted 13 lines · Ingo Molnar
a small detail:
Quoted 9 lines
For example:
bash-3471 [003] 357.014755: [INCORRECT] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [correct] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014759: [correct] account_group_exec_runtime:sched_stats.h:356 bash-3471 [003] 357.014761: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014763: [INCORRECT] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014765: [correct] calc_delta_mine:sched.c:1279
Quoted 8 lines
it's always good to have such fields aligned vertically. Something like this would be shorter and visually much easier to parse:
bash-3471 [003] 357.014755: [ MISS ] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [ .... ] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [ .... ] calc_delta_fair:sched_fair.c:411any objections against the patch below which implements this?
How about "[ OK ]" instead of "[ .... ]". That would be easier to understand.
-- Steve
Quoted 55 lines
Ingo
----------->
Quoted 1 line
From
f88c4ae9f8c3939bee4337c75c7a673b5de7a8a7Mon Sep 17 00:00:00 2001From: Ingo Molnar <[email protected]>
Date: Wed, 12 Nov 2008 11:55:41 +0100
Subject: [PATCH] tracing: branch tracer, tweak outputImpact: modify the tracer output, to make it a bit easier to read
Change the output from:
Quoted 3 lines
bash-3471 [003] 357.014755: [INCORRECT] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [correct] calc_delta_fair:sched_fair.c:411to:
Quoted 3 lines
bash-3471 [003] 357.014755: [ MISS ] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [ .... ] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [ .... ] calc_delta_fair:sched_fair.c:411it's good to have fields aligned vertically, and the only important information is a prediction miss, so display only that information.
Signed-off-by Ingo Molnar <[email protected]>--- kernel/trace/trace.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)kernel/trace/trace.c +2
-2@@ -1657,7 +1657,7 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)trace_assign_type (field, entry);trace_seq_printf (s,"[%s] %s:%s:%d\n" , - field->correct ?"correct" :"INCORRECT" , + field->correct ?" .... " :" MISS " , field->func, field->file, field->line);@@ -1808,7 +1808,7 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)trace_assign_type (field, entry);trace_seq_printf (s,"[%s] %s:%s:%d\n" , - field->correct ?"correct" :"INCORRECT" , + field->correct ?" .... " :" MISS " , field->func, field->file, field->line);
Ingo Molnar
Acked-by Steven RostedtRe: [PATCH] tracing: branch tracer, tweak output
Quoted 19 lines · Steven Rostedt
Quoted 16 lines · Ingo Molnar
a small detail:
Quoted 9 lines
For example:
bash-3471 [003] 357.014755: [INCORRECT] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [correct] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014759: [correct] account_group_exec_runtime:sched_stats.h:356 bash-3471 [003] 357.014761: [correct] update_curr:sched_fair.c:489 bash-3471 [003] 357.014763: [INCORRECT] calc_delta_fair:sched_fair.c:411 bash-3471 [003] 357.014765: [correct] calc_delta_mine:sched.c:1279it's always good to have such fields aligned vertically. Something like this would be shorter and visually much easier to parse:
Quoted 8 lines
Quoted 5 lines
bash-3471 [003] 357.014755: [ MISS ] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [ .... ] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [ .... ] calc_delta_fair:sched_fair.c:411any objections against the patch below which implements this?
How about "[ OK ]" instead of "[ .... ]". That would be easier to understand.
ok, agreed - just the use of capitals is not good, as it unnecessarily draws visual attention. How about:
Quoted 3 lines
bash-3471 [003] 357.014755: [ MISS ] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [ ok ] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [ ok ] calc_delta_fair:sched_fair.c:411
via the patch below?
Ingo
-------------->
Quoted 1 line
From
68d119f0a66f7e3663304343b072e56a2693446bMon Sep 17 00:00:00 2001
From: Ingo Molnar <[email protected]>
Date: Wed, 12 Nov 2008 14:09:30 +0100
Subject: [PATCH] tracing: finetune branch-tracer output
Steve suggested the to change the output from this:
Quoted 3 lines
bash-3471 [003] 357.014755: [ MISS ] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [ .... ] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [ .... ] calc_delta_fair:sched_fair.c:411
to this:
Quoted 3 lines
bash-3471 [003] 357.014755: [ MISS ] sched_info_dequeued:sched_stats.h:177 bash-3471 [003] 357.014756: [ ok ] update_curr:sched_fair.c:489 bash-3471 [003] 357.014758: [ ok ] calc_delta_fair:sched_fair.c:411
as it makes it clearer to the user what it means exactly.
--- kernel/trace/trace.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
kernel/trace/trace.c +2 -2
@@ -1657,7 +1657,7 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)trace_assign_type (field, entry);trace_seq_printf (s,"[%s] %s:%s:%d\n" , - field->correct ?" .... " :" MISS " , + field->correct ?" ok " :" MISS " , field->func, field->file, field->line);
@@ -1808,7 +1808,7 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)trace_assign_type (field, entry);trace_seq_printf (s,"[%s] %s:%s:%d\n" , - field->correct ?" .... " :" MISS " , + field->correct ?" ok " :" MISS " , field->func, field->file, field->line);
Quoted 11 lines · Steven Rostedt
Ingo,
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.gitbranch: tip/devel
Steven Rostedt (2):
trace: profile likely and unlikely annotations
ftrace: unlikely annotation tracer
i've created a new topic branch for this tracer:
tip/tracing/branch-tracer, and applied your patches to that branch. Thanks Steve,
Ingo
Steven Rostedt
maintainerQuoted 8 lines · Ingo Molnar
Quoted 6 lines · Steven Rostedt
Ingo,
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
Quoted 8 lines
Quoted 5 lines
branch: tip/devel
Steven Rostedt (2):
trace: profile likely and unlikely annotations
ftrace: unlikely annotation traceri've created a new topic branch for this tracer:
tip/tracing/branch-tracer, and applied your patches to that branch.
Good idea,
This profiler is very useful, but also very intrusive. I would like it to get a broader audience for testing.
-- Steve
Quoted 16 lines · Steven Rostedt
Quoted 14 lines · Ingo Molnar
Quoted 11 lines · Steven Rostedt
Ingo,
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.gitbranch: tip/devel
Steven Rostedt (2):
trace: profile likely and unlikely annotations
ftrace: unlikely annotation tracer
Quoted 7 lines
Quoted 2 lines
i've created a new topic branch for this tracer:
tip/tracing/branch-tracer, and applied your patches to that branch.Good idea,
This profiler is very useful, but also very intrusive. I would like it to get a broader audience for testing.
two more small details i noticed:
- does it do proper self-test? It doesnt seem so at first sight.
- i'd suggest a rename patch that does UNLIKELY_PROFILE => BRANCH_PROFILING.
[ 'to profile' is the verb we use generally (it's a noun too but
we tend to use 'profiling' for that in other places of the kernel) - so we already have CONFIG_PROFILING, etc. ]
Ingo
Steven Rostedt
maintainerQuoted 3 lines · Ingo Molnar
two more small details i noticed:
- does it do proper self-test? It doesnt seem so at first sight.
Hmm, no. The problem is that it is a switch to be added to other tracers. There's not a branch profiling tracer itself. I could add one that just does that, and that could do the self test.
Quoted 6 lines
- i'd suggest a rename patch that does
UNLIKELY_PROFILE=>BRANCH_PROFILING.[ 'to profile' is the verb we use generally (it's a noun too but
we tend to use 'profiling' for that in other places of the kernel) - so we already haveCONFIG_PROFILING, etc. ]
I have no hard feelings on its name. Branch profiling is fine with me.
-- Steve
Quoted 9 lines · Steven Rostedt
Quoted 3 lines · Ingo Molnar
two more small details i noticed:
- does it do proper self-test? It doesnt seem so at first sight.
Hmm, no. The problem is that it is a switch to be added to other tracers. There's not a branch profiling tracer itself. I could add one that just does that, and that could do the self test.
i know that it's an iter_ctrl detail, but nevertheless the branch tracer (which is how people will be using this) should have some self-test.
it might also make sense to just have a standalone 'branch' tracer plugin as well. We have all the callbacks in place already, and people might be interested in just that info - not in some other tracing output.
Ingo