81dc9f0ef2
In order to help benchmark the time tracepoints take, a new config option is added called CONFIG_TRACEPOINT_BENCHMARK. When this option is set a tracepoint is created called "benchmark:benchmark_event". When the tracepoint is enabled, it kicks off a kernel thread that goes into an infinite loop (calling cond_sched() to let other tasks run), and calls the tracepoint. Each iteration will record the time it took to write to the tracepoint and the next iteration that data will be passed to the tracepoint itself. That is, the tracepoint will report the time it took to do the previous tracepoint. The string written to the tracepoint is a static string of 128 bytes to keep the time the same. The initial string is simply a write of "START". The second string records the cold cache time of the first write which is not added to the rest of the calculations. As it is a tight loop, it benchmarks as hot cache. That's fine because we care most about hot paths that are probably in cache already. An example of the output: START first=3672 [COLD CACHED] last=632 first=3672 max=632 min=632 avg=316 std=446 std^2=199712 last=278 first=3672 max=632 min=278 avg=303 std=316 std^2=100337 last=277 first=3672 max=632 min=277 avg=296 std=258 std^2=67064 last=273 first=3672 max=632 min=273 avg=292 std=224 std^2=50411 last=273 first=3672 max=632 min=273 avg=288 std=200 std^2=40389 last=281 first=3672 max=632 min=273 avg=287 std=183 std^2=33666 Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
42 lines
836 B
C
42 lines
836 B
C
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM benchmark
|
|
|
|
#if !defined(_TRACE_BENCHMARK_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_BENCHMARK_H
|
|
|
|
#include <linux/tracepoint.h>
|
|
|
|
extern void trace_benchmark_reg(void);
|
|
extern void trace_benchmark_unreg(void);
|
|
|
|
#define BENCHMARK_EVENT_STRLEN 128
|
|
|
|
TRACE_EVENT_FN(benchmark_event,
|
|
|
|
TP_PROTO(const char *str),
|
|
|
|
TP_ARGS(str),
|
|
|
|
TP_STRUCT__entry(
|
|
__array( char, str, BENCHMARK_EVENT_STRLEN )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
memcpy(__entry->str, str, BENCHMARK_EVENT_STRLEN);
|
|
),
|
|
|
|
TP_printk("%s", __entry->str),
|
|
|
|
trace_benchmark_reg, trace_benchmark_unreg
|
|
);
|
|
|
|
#endif /* _TRACE_BENCHMARK_H */
|
|
|
|
#undef TRACE_INCLUDE_FILE
|
|
#undef TRACE_INCLUDE_PATH
|
|
#define TRACE_INCLUDE_PATH .
|
|
#define TRACE_INCLUDE_FILE trace_benchmark
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|