perf ftrace: Add option '-m/--buffer-size' to set per-cpu buffer size
This adds an option '-m/--buffer-size' to allow us set the size of per-cpu tracing buffer. Committer testing: Before running with this option: # find /sys/kernel/tracing/ -name buffer_size_kb | xargs cat 1408 1408 1408 1408 1408 1408 1408 1408 1408 # Then, run: # perf ftrace -m 2048K | head -10 2) | mutex_unlock() { 2) ==========> | 2) | smp_irq_work_interrupt() { 2) | irq_enter() { 2) 0.121 us | rcu_irq_enter(); 2) 0.128 us | irqtime_account_irq(); 2) 0.719 us | } 2) | __wake_up() { 2) | __wake_up_common_lock() { 2) 0.105 us | _raw_spin_lock_irqsave(); # Now look at those tracefs knobs: # find /sys/kernel/tracing/ -name buffer_size_kb | xargs cat 2048 2048 2048 2048 2048 2048 2048 2048 2048 # This should be similar to the -m option in the other perf tools, such as 'perf record', 'perf trace', etc. Signed-off-by: Changbin Du <changbin.du@gmail.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt (VMware) <rostedt@goodmis.org> Link: http://lore.kernel.org/lkml/20200808023141.14227-5-changbin.du@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
68faab0f93
commit
846e193980
|
@ -53,6 +53,11 @@ OPTIONS
|
|||
Ranges of CPUs are specified with -: 0-2.
|
||||
Default is to trace on all online CPUs.
|
||||
|
||||
-m::
|
||||
--buffer-size::
|
||||
Set the size of per-cpu tracing buffer, <size> is expected to
|
||||
be a number with appended unit character - B/K/M/G.
|
||||
|
||||
-T::
|
||||
--trace-funcs=::
|
||||
Select function tracer and set function filter on the given
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "thread_map.h"
|
||||
#include "util/cap.h"
|
||||
#include "util/config.h"
|
||||
#include "util/units.h"
|
||||
|
||||
#define DEFAULT_TRACER "function_graph"
|
||||
|
||||
|
@ -39,6 +40,7 @@ struct perf_ftrace {
|
|||
struct list_head graph_funcs;
|
||||
struct list_head nograph_funcs;
|
||||
int graph_depth;
|
||||
unsigned long percpu_buffer_size;
|
||||
};
|
||||
|
||||
struct filter_entry {
|
||||
|
@ -324,6 +326,21 @@ static int set_tracing_depth(struct perf_ftrace *ftrace)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int set_tracing_percpu_buffer_size(struct perf_ftrace *ftrace)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (ftrace->percpu_buffer_size == 0)
|
||||
return 0;
|
||||
|
||||
ret = write_tracing_file_int("buffer_size_kb",
|
||||
ftrace->percpu_buffer_size / 1024);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
|
||||
{
|
||||
char *trace_file;
|
||||
|
@ -388,6 +405,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
|
|||
goto out_reset;
|
||||
}
|
||||
|
||||
if (set_tracing_percpu_buffer_size(ftrace) < 0) {
|
||||
pr_err("failed to set tracing per-cpu buffer size\n");
|
||||
goto out_reset;
|
||||
}
|
||||
|
||||
if (write_tracing_file("current_tracer", ftrace->tracer) < 0) {
|
||||
pr_err("failed to set current_tracer to %s\n", ftrace->tracer);
|
||||
goto out_reset;
|
||||
|
@ -506,6 +528,37 @@ static void delete_filter_func(struct list_head *head)
|
|||
}
|
||||
}
|
||||
|
||||
static int parse_buffer_size(const struct option *opt,
|
||||
const char *str, int unset)
|
||||
{
|
||||
unsigned long *s = (unsigned long *)opt->value;
|
||||
static struct parse_tag tags_size[] = {
|
||||
{ .tag = 'B', .mult = 1 },
|
||||
{ .tag = 'K', .mult = 1 << 10 },
|
||||
{ .tag = 'M', .mult = 1 << 20 },
|
||||
{ .tag = 'G', .mult = 1 << 30 },
|
||||
{ .tag = 0 },
|
||||
};
|
||||
unsigned long val;
|
||||
|
||||
if (unset) {
|
||||
*s = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
val = parse_tag_value(str, tags_size);
|
||||
if (val != (unsigned long) -1) {
|
||||
if (val < 1024) {
|
||||
pr_err("buffer size too small, must larger than 1KB.");
|
||||
return -1;
|
||||
}
|
||||
*s = val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void select_tracer(struct perf_ftrace *ftrace)
|
||||
{
|
||||
bool graph = !list_empty(&ftrace->graph_funcs) ||
|
||||
|
@ -560,6 +613,8 @@ int cmd_ftrace(int argc, const char **argv)
|
|||
"Set nograph filter on given functions", parse_filter_func),
|
||||
OPT_INTEGER('D', "graph-depth", &ftrace.graph_depth,
|
||||
"Max depth for function graph tracer"),
|
||||
OPT_CALLBACK('m', "buffer-size", &ftrace.percpu_buffer_size, "size",
|
||||
"size of per cpu buffer", parse_buffer_size),
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue