* [PATCH v3 01/17] perf ftrace: select function/function_graph tracer automatically
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
@ 2020-07-08 16:45 ` Changbin Du
2020-07-08 16:45 ` [PATCH v3 02/17] perf ftrace: add option '-F/--funcs' to list available functions Changbin Du
` (16 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:45 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
The '-g/-G' options have already implied function_graph tracer should be
used instead of function tracer. So the extra option '--tracer' can be
killed.
This patch changes the behavior as below:
- By default, function tracer is used.
- If '-g' or '-G' option is on, then function_graph tracer is used.
- The perf configuration item 'ftrace.tracer' is marked as deprecated.
- The option '--tracer' is marked as deprecated.
Here are some examples.
This will start tracing all functions using function tracer:
$ sudo perf ftrace
This will trace all functions using function graph tracer:
$ sudo perf ftrace -G
This will trace function vfs_read using function graph tracer:
$ sudo perf ftrace -G vfs_read
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
v3: remove default '*' for -G/-T.
---
tools/perf/Documentation/perf-config.txt | 5 -----
tools/perf/Documentation/perf-ftrace.txt | 2 +-
tools/perf/builtin-ftrace.c | 15 ++++++++++-----
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/tools/perf/Documentation/perf-config.txt b/tools/perf/Documentation/perf-config.txt
index c7d3df5798e2..a25fee7de3b2 100644
--- a/tools/perf/Documentation/perf-config.txt
+++ b/tools/perf/Documentation/perf-config.txt
@@ -612,11 +612,6 @@ trace.*::
"libbeauty", the default, to use the same argument beautifiers used in the
strace-like sys_enter+sys_exit lines.
-ftrace.*::
- ftrace.tracer::
- Can be used to select the default tracer. Possible values are
- 'function' and 'function_graph'.
-
llvm.*::
llvm.clang-path::
Path to clang. If omit, search it from $PATH.
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index b80c84307dc9..952e46669168 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -24,7 +24,7 @@ OPTIONS
-t::
--tracer=::
- Tracer to use: function_graph or function.
+ Tracer to use: function_graph or function. This option is deprecated.
-v::
--verbose=::
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 2bfc1b0db536..5f53da87040d 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -27,7 +27,6 @@
#include "util/cap.h"
#include "util/config.h"
-#define DEFAULT_TRACER "function_graph"
struct perf_ftrace {
struct evlist *evlist;
@@ -419,6 +418,7 @@ static int perf_ftrace_config(const char *var, const char *value, void *cb)
if (strcmp(var, "ftrace.tracer"))
return -1;
+ pr_warning("Configuration ftrace.tracer is deprecated\n");
if (!strcmp(value, "function_graph") ||
!strcmp(value, "function")) {
ftrace->tracer = value;
@@ -459,7 +459,7 @@ int cmd_ftrace(int argc, const char **argv)
{
int ret;
struct perf_ftrace ftrace = {
- .tracer = DEFAULT_TRACER,
+ .tracer = "function",
.target = { .uid = UINT_MAX, },
};
const char * const ftrace_usage[] = {
@@ -469,7 +469,7 @@ int cmd_ftrace(int argc, const char **argv)
};
const struct option ftrace_options[] = {
OPT_STRING('t', "tracer", &ftrace.tracer, "tracer",
- "tracer to use: function_graph(default) or function"),
+ "tracer to use: function or function_graph (This option is deprecated)"),
OPT_STRING('p', "pid", &ftrace.target.pid, "pid",
"trace on existing process id"),
OPT_INCR('v', "verbose", &verbose,
@@ -479,11 +479,13 @@ int cmd_ftrace(int argc, const char **argv)
OPT_STRING('C', "cpu", &ftrace.target.cpu_list, "cpu",
"list of cpus to monitor"),
OPT_CALLBACK('T', "trace-funcs", &ftrace.filters, "func",
- "trace given functions only", parse_filter_func),
+ "trace given functions using function tracer",
+ parse_filter_func),
OPT_CALLBACK('N', "notrace-funcs", &ftrace.notrace, "func",
"do not trace given functions", parse_filter_func),
OPT_CALLBACK('G', "graph-funcs", &ftrace.graph_funcs, "func",
- "Set graph filter on given functions", parse_filter_func),
+ "trace given functions using function_graph tracer",
+ parse_filter_func),
OPT_CALLBACK('g', "nograph-funcs", &ftrace.nograph_funcs, "func",
"Set nograph filter on given functions", parse_filter_func),
OPT_INTEGER('D', "graph-depth", &ftrace.graph_depth,
@@ -505,6 +507,9 @@ int cmd_ftrace(int argc, const char **argv)
if (!argc && target__none(&ftrace.target))
ftrace.target.system_wide = true;
+ if (!list_empty(&ftrace.graph_funcs) || !list_empty(&ftrace.nograph_funcs))
+ ftrace.tracer = "function_graph";
+
ret = target__validate(&ftrace.target);
if (ret) {
char errbuf[512];
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 02/17] perf ftrace: add option '-F/--funcs' to list available functions
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
2020-07-08 16:45 ` [PATCH v3 01/17] perf ftrace: select function/function_graph tracer automatically Changbin Du
@ 2020-07-08 16:45 ` Changbin Du
2020-07-08 16:45 ` [PATCH v3 03/17] perf ftrace: add option -t/--tid to filter by thread id Changbin Du
` (15 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:45 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This adds an option '-F/--funcs' to list all available functions to trace,
which is read from tracing file 'available_filter_functions'.
$ sudo ./perf ftrace -F | head
trace_initcall_finish_cb
initcall_blacklisted
do_one_initcall
do_one_initcall
trace_initcall_start_cb
run_init_process
try_to_run_init_process
match_dev_by_label
match_dev_by_uuid
rootfs_init_fs_context
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
v2: option name '-l/--list-functions' -> '-F/--funcs'
---
tools/perf/Documentation/perf-ftrace.txt | 4 +++
tools/perf/builtin-ftrace.c | 43 ++++++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index 952e46669168..d79560dea19f 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -30,6 +30,10 @@ OPTIONS
--verbose=::
Verbosity level.
+-F::
+--funcs::
+ List all available functions to trace.
+
-p::
--pid=::
Trace on existing process id (comma separated list).
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 5f53da87040d..244cc8e6bd60 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -32,6 +32,7 @@ struct perf_ftrace {
struct evlist *evlist;
struct target target;
const char *tracer;
+ bool list_avail_functions;
struct list_head filters;
struct list_head notrace;
struct list_head graph_funcs;
@@ -127,6 +128,43 @@ static int append_tracing_file(const char *name, const char *val)
return __write_tracing_file(name, val, true);
}
+static int read_tracing_file_to_stdout(const char *name)
+{
+ char buf[4096];
+ char *file;
+ int fd;
+ int ret = -1;
+
+ file = get_tracing_file(name);
+ if (!file) {
+ pr_debug("cannot get tracing file: %s\n", name);
+ return -1;
+ }
+
+ fd = open(file, O_RDONLY);
+ if (fd < 0) {
+ pr_debug("cannot open tracing file: %s: %s\n",
+ name, str_error_r(errno, buf, sizeof(buf)));
+ goto out;
+ }
+
+ /* read contents to stdout */
+ while (true) {
+ int n = read(fd, buf, sizeof(buf));
+ if (n <= 0)
+ goto out_close;
+ if (fwrite(buf, n, 1, stdout) != 1)
+ goto out_close;
+ }
+ ret = 0;
+
+out_close:
+ close(fd);
+out:
+ put_tracing_file(file);
+ return ret;
+}
+
static int reset_tracing_cpu(void);
static void reset_tracing_filters(void);
@@ -301,6 +339,9 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
signal(SIGCHLD, sig_handler);
signal(SIGPIPE, sig_handler);
+ if (ftrace->list_avail_functions)
+ return read_tracing_file_to_stdout("available_filter_functions");
+
if (reset_tracing_files(ftrace) < 0) {
pr_err("failed to reset ftrace\n");
goto out;
@@ -470,6 +511,8 @@ int cmd_ftrace(int argc, const char **argv)
const struct option ftrace_options[] = {
OPT_STRING('t', "tracer", &ftrace.tracer, "tracer",
"tracer to use: function or function_graph (This option is deprecated)"),
+ OPT_BOOLEAN('F', "funcs", &ftrace.list_avail_functions,
+ "Show available functions to filter"),
OPT_STRING('p', "pid", &ftrace.target.pid, "pid",
"trace on existing process id"),
OPT_INCR('v', "verbose", &verbose,
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 03/17] perf ftrace: add option -t/--tid to filter by thread id
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
2020-07-08 16:45 ` [PATCH v3 01/17] perf ftrace: select function/function_graph tracer automatically Changbin Du
2020-07-08 16:45 ` [PATCH v3 02/17] perf ftrace: add option '-F/--funcs' to list available functions Changbin Du
@ 2020-07-08 16:45 ` Changbin Du
2020-07-08 16:45 ` [PATCH v3 04/17] perf ftrace: add option -d/--delay to delay tracing Changbin Du
` (14 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:45 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This allows us to trace single thread instead of the whole process.
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
tools/perf/Documentation/perf-ftrace.txt | 4 ++++
tools/perf/builtin-ftrace.c | 2 ++
2 files changed, 6 insertions(+)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index d79560dea19f..e204bf6d50d8 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -38,6 +38,10 @@ OPTIONS
--pid=::
Trace on existing process id (comma separated list).
+-t::
+--tid=::
+ Trace on existing thread id (comma separated list).
+
-a::
--all-cpus::
Force system-wide collection. Scripts run without a <command>
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 244cc8e6bd60..1188b82c6541 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -515,6 +515,8 @@ int cmd_ftrace(int argc, const char **argv)
"Show available functions to filter"),
OPT_STRING('p', "pid", &ftrace.target.pid, "pid",
"trace on existing process id"),
+ OPT_STRING('t', "tid", &ftrace.target.tid, "tid",
+ "trace on existing thread id (exclusive to --pid)"),
OPT_INCR('v', "verbose", &verbose,
"be more verbose"),
OPT_BOOLEAN('a', "all-cpus", &ftrace.target.system_wide,
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 04/17] perf ftrace: add option -d/--delay to delay tracing
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (2 preceding siblings ...)
2020-07-08 16:45 ` [PATCH v3 03/17] perf ftrace: add option -t/--tid to filter by thread id Changbin Du
@ 2020-07-08 16:45 ` Changbin Du
2020-07-08 16:45 ` [PATCH v3 05/17] perf ftrace: factor out function write_tracing_file_int() Changbin Du
` (13 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:45 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This adds an option '-d/--delay' to allow us to start tracing some
times later after workload is launched.
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
tools/perf/Documentation/perf-ftrace.txt | 4 ++++
tools/perf/builtin-ftrace.c | 19 ++++++++++++++++---
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index e204bf6d50d8..fd1776deebd7 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -42,6 +42,10 @@ OPTIONS
--tid=::
Trace on existing thread id (comma separated list).
+-d::
+--delay::
+ Time (ms) to wait before starting tracing after program start.
+
-a::
--all-cpus::
Force system-wide collection. Scripts run without a <command>
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 1188b82c6541..7793c3d083e0 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -38,6 +38,7 @@ struct perf_ftrace {
struct list_head graph_funcs;
struct list_head nograph_funcs;
int graph_depth;
+ unsigned initial_delay;
};
struct filter_entry {
@@ -402,13 +403,23 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
fcntl(trace_fd, F_SETFL, O_NONBLOCK);
pollfd.fd = trace_fd;
- if (write_tracing_file("tracing_on", "1") < 0) {
- pr_err("can't enable tracing\n");
- goto out_close_fd;
+ if (!ftrace->initial_delay) {
+ if (write_tracing_file("tracing_on", "1") < 0) {
+ pr_err("can't enable tracing\n");
+ goto out_close_fd;
+ }
}
perf_evlist__start_workload(ftrace->evlist);
+ if (ftrace->initial_delay) {
+ usleep(ftrace->initial_delay * 1000);
+ if (write_tracing_file("tracing_on", "1") < 0) {
+ pr_err("can't enable tracing\n");
+ goto out_close_fd;
+ }
+ }
+
while (!done) {
if (poll(&pollfd, 1, -1) < 0)
break;
@@ -535,6 +546,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_UINTEGER('d', "delay", &ftrace.initial_delay,
+ "ms to wait before starting tracing after program start"),
OPT_END()
};
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 05/17] perf ftrace: factor out function write_tracing_file_int()
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (3 preceding siblings ...)
2020-07-08 16:45 ` [PATCH v3 04/17] perf ftrace: add option -d/--delay to delay tracing Changbin Du
@ 2020-07-08 16:45 ` Changbin Du
2020-07-08 16:45 ` [PATCH v3 06/17] perf ftrace: add option '-m/--buffer-size' to set per-cpu buffer size Changbin Du
` (12 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:45 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
We will reuse this function later.
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
tools/perf/builtin-ftrace.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 7793c3d083e0..7eb41f7027c8 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -166,6 +166,17 @@ static int read_tracing_file_to_stdout(const char *name)
return ret;
}
+static int write_tracing_file_int(const char *name, int value)
+{
+ char buf[16];
+
+ snprintf(buf, sizeof(buf), "%d", value);
+ if (write_tracing_file(name, buf) < 0)
+ return -1;
+
+ return 0;
+}
+
static int reset_tracing_cpu(void);
static void reset_tracing_filters(void);
@@ -296,8 +307,6 @@ static void reset_tracing_filters(void)
static int set_tracing_depth(struct perf_ftrace *ftrace)
{
- char buf[16];
-
if (ftrace->graph_depth == 0)
return 0;
@@ -306,9 +315,7 @@ static int set_tracing_depth(struct perf_ftrace *ftrace)
return -1;
}
- snprintf(buf, sizeof(buf), "%d", ftrace->graph_depth);
-
- if (write_tracing_file("max_graph_depth", buf) < 0)
+ if (write_tracing_file_int("max_graph_depth", ftrace->graph_depth) < 0)
return -1;
return 0;
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 06/17] perf ftrace: add option '-m/--buffer-size' to set per-cpu buffer size
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (4 preceding siblings ...)
2020-07-08 16:45 ` [PATCH v3 05/17] perf ftrace: factor out function write_tracing_file_int() Changbin Du
@ 2020-07-08 16:45 ` Changbin Du
2020-07-08 16:45 ` [PATCH v3 07/17] perf ftrace: show trace column header Changbin Du
` (11 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:45 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This adds an option '-m/--buffer-size' to allow us set the size of per-cpu
tracing buffer.
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
v2: support units as a suffix.
---
tools/perf/Documentation/perf-ftrace.txt | 5 +++
tools/perf/builtin-ftrace.c | 56 +++++++++++++++++++++++-
2 files changed, 60 insertions(+), 1 deletion(-)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index fd1776deebd7..a26593dbdd76 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -60,6 +60,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=::
Only trace functions given by the argument. Multiple functions
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 7eb41f7027c8..66cdfe42b1fe 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -26,7 +26,7 @@
#include "thread_map.h"
#include "util/cap.h"
#include "util/config.h"
-
+#include "util/units.h"
struct perf_ftrace {
struct evlist *evlist;
@@ -39,6 +39,7 @@ struct perf_ftrace {
struct list_head nograph_funcs;
int graph_depth;
unsigned initial_delay;
+ unsigned long percpu_buffer_size;
};
struct filter_entry {
@@ -321,6 +322,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;
@@ -385,6 +401,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;
@@ -514,6 +535,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;
+}
+
int cmd_ftrace(int argc, const char **argv)
{
int ret;
@@ -555,6 +607,8 @@ int cmd_ftrace(int argc, const char **argv)
"Max depth for function graph tracer"),
OPT_UINTEGER('d', "delay", &ftrace.initial_delay,
"ms to wait before starting tracing after program start"),
+ OPT_CALLBACK('m', "buffer-size", &ftrace.percpu_buffer_size, "size",
+ "size of per cpu buffer", parse_buffer_size),
OPT_END()
};
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 07/17] perf ftrace: show trace column header
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (5 preceding siblings ...)
2020-07-08 16:45 ` [PATCH v3 06/17] perf ftrace: add option '-m/--buffer-size' to set per-cpu buffer size Changbin Du
@ 2020-07-08 16:45 ` Changbin Du
2020-07-08 16:45 ` [PATCH v3 08/17] perf ftrace: add option '--inherit' to trace children processes Changbin Du
` (10 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:45 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This makes perf-ftrace display column header before printing trace.
$ sudo perf ftrace
# tracer: function
#
# entries-in-buffer/entries-written: 0/0 #P:8
#
# TASK-PID CPU# TIMESTAMP FUNCTION
# | | | | |
<...>-9246 [006] 10726.262760: mutex_unlock <-rb_simple_write
<...>-9246 [006] 10726.262764: __fsnotify_parent <-vfs_write
<...>-9246 [006] 10726.262765: fsnotify <-vfs_write
<...>-9246 [006] 10726.262766: __sb_end_write <-vfs_write
<...>-9246 [006] 10726.262767: fpregs_assert_state_consistent <-do_syscall_64
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
tools/perf/builtin-ftrace.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 66cdfe42b1fe..885d11f369fc 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -431,6 +431,9 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
fcntl(trace_fd, F_SETFL, O_NONBLOCK);
pollfd.fd = trace_fd;
+ /* display column headers */
+ read_tracing_file_to_stdout("trace");
+
if (!ftrace->initial_delay) {
if (write_tracing_file("tracing_on", "1") < 0) {
pr_err("can't enable tracing\n");
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 08/17] perf ftrace: add option '--inherit' to trace children processes
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (6 preceding siblings ...)
2020-07-08 16:45 ` [PATCH v3 07/17] perf ftrace: show trace column header Changbin Du
@ 2020-07-08 16:45 ` Changbin Du
2020-07-08 16:45 ` [PATCH v3 09/17] perf: util: add general function to parse sublevel options Changbin Du
` (9 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:45 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This adds an option '--inherit' to allow us trace children
processes spawned by our target.
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
v2: option name '--trace-children' -> '--inherit'.
---
tools/perf/Documentation/perf-ftrace.txt | 3 ++
tools/perf/builtin-ftrace.c | 38 ++++++++++++++++++++++++
2 files changed, 41 insertions(+)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index a26593dbdd76..27381c0dafe7 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -65,6 +65,9 @@ OPTIONS
Set the size of per-cpu tracing buffer, <size> is expected to
be a number with appended unit character - B/K/M/G.
+--inherit::
+ Trace children processes spawned by our target.
+
-T::
--trace-funcs=::
Only trace functions given by the argument. Multiple functions
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 885d11f369fc..ab1435c2cd0e 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -40,6 +40,7 @@ struct perf_ftrace {
int graph_depth;
unsigned initial_delay;
unsigned long percpu_buffer_size;
+ bool inherit;
};
struct filter_entry {
@@ -178,9 +179,27 @@ static int write_tracing_file_int(const char *name, int value)
return 0;
}
+static int write_tracing_option_file(const char *name, const char *val)
+{
+ char *file;
+ int ret;
+
+ if (asprintf(&file, "options/%s", name) < 0)
+ return -1;
+
+ ret = __write_tracing_file(file, val, false);
+ free(file);
+ return ret;
+}
+
static int reset_tracing_cpu(void);
static void reset_tracing_filters(void);
+static void reset_tracing_options(struct perf_ftrace *ftrace __maybe_unused)
+{
+ write_tracing_option_file("function-fork", "0");
+}
+
static int reset_tracing_files(struct perf_ftrace *ftrace __maybe_unused)
{
if (write_tracing_file("tracing_on", "0") < 0)
@@ -199,6 +218,7 @@ static int reset_tracing_files(struct perf_ftrace *ftrace __maybe_unused)
return -1;
reset_tracing_filters();
+ reset_tracing_options(ftrace);
return 0;
}
@@ -337,6 +357,17 @@ static int set_tracing_percpu_buffer_size(struct perf_ftrace *ftrace)
return 0;
}
+static int set_tracing_trace_inherit(struct perf_ftrace *ftrace)
+{
+ if (!ftrace->inherit)
+ return 0;
+
+ if (write_tracing_option_file("function-fork", "1") < 0)
+ return -1;
+
+ return 0;
+}
+
static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
{
char *trace_file;
@@ -406,6 +437,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
goto out_reset;
}
+ if (set_tracing_trace_inherit(ftrace) < 0) {
+ pr_err("failed to set tracing option function-fork\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;
@@ -612,6 +648,8 @@ int cmd_ftrace(int argc, const char **argv)
"ms to wait before starting tracing after program start"),
OPT_CALLBACK('m', "buffer-size", &ftrace.percpu_buffer_size, "size",
"size of per cpu buffer", parse_buffer_size),
+ OPT_BOOLEAN(0, "inherit", &ftrace.inherit,
+ "trace children processes"),
OPT_END()
};
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 09/17] perf: util: add general function to parse sublevel options
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (7 preceding siblings ...)
2020-07-08 16:45 ` [PATCH v3 08/17] perf ftrace: add option '--inherit' to trace children processes Changbin Du
@ 2020-07-08 16:45 ` Changbin Du
2020-07-08 17:34 ` Arnaldo Carvalho de Melo
2020-07-08 16:45 ` [PATCH v3 10/17] perf ftrace: add support for tracing option 'func_stack_trace' Changbin Du
` (8 subsequent siblings)
17 siblings, 1 reply; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:45 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This factors out a general function perf_parse_sublevel_options() to parse
sublevel options. The 'sublevel' options is something like the '--debug'
options which allow more sublevel options.
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
tools/perf/util/debug.c | 61 ++++++++++++-----------------------------
tools/perf/util/util.c | 56 +++++++++++++++++++++++++++++++++++++
tools/perf/util/util.h | 7 +++++
3 files changed, 80 insertions(+), 44 deletions(-)
diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c
index adb656745ecc..79999c57a609 100644
--- a/tools/perf/util/debug.c
+++ b/tools/perf/util/debug.c
@@ -20,6 +20,7 @@
#include "target.h"
#include "ui/helpline.h"
#include "ui/ui.h"
+#include "util/util.h"
#include <linux/ctype.h>
@@ -173,65 +174,37 @@ void trace_event(union perf_event *event)
trace_event_printer, event);
}
-static struct debug_variable {
- const char *name;
- int *ptr;
-} debug_variables[] = {
- { .name = "verbose", .ptr = &verbose },
- { .name = "ordered-events", .ptr = &debug_ordered_events},
- { .name = "stderr", .ptr = &redirect_to_stderr},
- { .name = "data-convert", .ptr = &debug_data_convert },
- { .name = "perf-event-open", .ptr = &debug_peo_args },
+static struct sublevel_option debug_opts[] = {
+ { .name = "verbose", .value_ptr = &verbose },
+ { .name = "ordered-events", .value_ptr = &debug_ordered_events},
+ { .name = "stderr", .value_ptr = &redirect_to_stderr},
+ { .name = "data-convert", .value_ptr = &debug_data_convert },
+ { .name = "perf-event-open", .value_ptr = &debug_peo_args },
{ .name = NULL, }
};
int perf_debug_option(const char *str)
{
- struct debug_variable *var = &debug_variables[0];
- char *vstr, *s = strdup(str);
- int v = 1;
-
- vstr = strchr(s, '=');
- if (vstr)
- *vstr++ = 0;
-
- while (var->name) {
- if (!strcmp(s, var->name))
- break;
- var++;
- }
-
- if (!var->name) {
- pr_err("Unknown debug variable name '%s'\n", s);
- free(s);
- return -1;
- }
+ int ret;
- if (vstr) {
- v = atoi(vstr);
- /*
- * Allow only values in range (0, 10),
- * otherwise set 0.
- */
- v = (v < 0) || (v > 10) ? 0 : v;
- }
+ ret = perf_parse_sublevel_options(str, debug_opts);
+ if (ret)
+ return ret;
- if (quiet)
- v = -1;
+ /* Allow only verbose value in range (0, 10), otherwise set 0. */
+ verbose = (verbose < 0) || (verbose > 10) ? 0 : verbose;
- *var->ptr = v;
- free(s);
return 0;
}
int perf_quiet_option(void)
{
- struct debug_variable *var = &debug_variables[0];
+ struct sublevel_option *opt = &debug_opts[0];
/* disable all debug messages */
- while (var->name) {
- *var->ptr = -1;
- var++;
+ while (opt->name) {
+ *opt->value_ptr = -1;
+ opt++;
}
return 0;
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
index 37a9492edb3e..7e532a93835b 100644
--- a/tools/perf/util/util.c
+++ b/tools/perf/util/util.c
@@ -416,3 +416,59 @@ char *perf_exe(char *buf, int len)
}
return strcpy(buf, "perf");
}
+
+static int parse_one_sublevel_option(const char *str,
+ struct sublevel_option *opts)
+{
+ struct sublevel_option *opt = &opts[0];
+ char *vstr, *s = strdup(str);
+ int v = 1;
+
+ vstr = strchr(s, '=');
+ if (vstr)
+ *vstr++ = 0;
+
+ while (opt->name) {
+ if (!strcmp(s, opt->name))
+ break;
+ opt++;
+ }
+
+ if (!opt->name) {
+ pr_err("Unknown option name '%s'\n", s);
+ free(s);
+ return -1;
+ }
+
+ if (vstr)
+ v = atoi(vstr);
+
+ *opt->value_ptr = v;
+ free(s);
+ return 0;
+}
+
+/* parse options like --foo a=<n>,b,c... */
+int perf_parse_sublevel_options(const char *str, struct sublevel_option *opts)
+{
+ char *s = strdup(str);
+ char *p = NULL;
+ int ret;
+
+ if (!s)
+ return -1;
+
+ p = strtok(s, ",");
+ while (p) {
+ ret = parse_one_sublevel_option(p, opts);
+ if (ret) {
+ free(s);
+ return ret;
+ }
+
+ p = strtok(NULL, ",");
+ }
+
+ free(s);
+ return 0;
+}
\ No newline at end of file
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index f486fdd3a538..8cb1f980935c 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -52,6 +52,13 @@ void perf_set_multithreaded(void);
char *perf_exe(char *buf, int len);
+struct sublevel_option {
+ const char *name;
+ int *value_ptr;
+};
+
+int perf_parse_sublevel_options(const char *str, struct sublevel_option *opts);
+
#ifndef O_CLOEXEC
#ifdef __sparc__
#define O_CLOEXEC 0x400000
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* Re: [PATCH v3 09/17] perf: util: add general function to parse sublevel options
2020-07-08 16:45 ` [PATCH v3 09/17] perf: util: add general function to parse sublevel options Changbin Du
@ 2020-07-08 17:34 ` Arnaldo Carvalho de Melo
2020-07-10 13:14 ` Changbin Du
0 siblings, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2020-07-08 17:34 UTC (permalink / raw)
To: Changbin Du
Cc: Jiri Olsa, Peter Zijlstra, Ingo Molnar, Namhyung Kim,
Steven Rostedt, linux-kernel
Em Thu, Jul 09, 2020 at 12:45:57AM +0800, Changbin Du escreveu:
> This factors out a general function perf_parse_sublevel_options() to parse
> sublevel options. The 'sublevel' options is something like the '--debug'
> options which allow more sublevel options.
Please don't add stuff to util.h/util.c, its too generic a name and
we've been trying to move things to more appropriate locations, so
follow the example of:
[acme@quaco perf]$ ls -la tools/perf/util/parse-regs-options.*
-rw-rw-r--. 1 acme acme 1932 Feb 12 15:11 tools/perf/util/parse-regs-options.c
-rw-rw-r--. 1 acme acme 316 Dec 20 2019 tools/perf/util/parse-regs-options.h
[acme@quaco perf]$
Good job identifying this code and reusing it!
- Arnaldo
> Signed-off-by: Changbin Du <changbin.du@gmail.com>
> ---
> tools/perf/util/debug.c | 61 ++++++++++++-----------------------------
> tools/perf/util/util.c | 56 +++++++++++++++++++++++++++++++++++++
> tools/perf/util/util.h | 7 +++++
> 3 files changed, 80 insertions(+), 44 deletions(-)
>
> diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c
> index adb656745ecc..79999c57a609 100644
> --- a/tools/perf/util/debug.c
> +++ b/tools/perf/util/debug.c
> @@ -20,6 +20,7 @@
> #include "target.h"
> #include "ui/helpline.h"
> #include "ui/ui.h"
> +#include "util/util.h"
>
> #include <linux/ctype.h>
>
> @@ -173,65 +174,37 @@ void trace_event(union perf_event *event)
> trace_event_printer, event);
> }
>
> -static struct debug_variable {
> - const char *name;
> - int *ptr;
> -} debug_variables[] = {
> - { .name = "verbose", .ptr = &verbose },
> - { .name = "ordered-events", .ptr = &debug_ordered_events},
> - { .name = "stderr", .ptr = &redirect_to_stderr},
> - { .name = "data-convert", .ptr = &debug_data_convert },
> - { .name = "perf-event-open", .ptr = &debug_peo_args },
> +static struct sublevel_option debug_opts[] = {
> + { .name = "verbose", .value_ptr = &verbose },
> + { .name = "ordered-events", .value_ptr = &debug_ordered_events},
> + { .name = "stderr", .value_ptr = &redirect_to_stderr},
> + { .name = "data-convert", .value_ptr = &debug_data_convert },
> + { .name = "perf-event-open", .value_ptr = &debug_peo_args },
> { .name = NULL, }
> };
>
> int perf_debug_option(const char *str)
> {
> - struct debug_variable *var = &debug_variables[0];
> - char *vstr, *s = strdup(str);
> - int v = 1;
> -
> - vstr = strchr(s, '=');
> - if (vstr)
> - *vstr++ = 0;
> -
> - while (var->name) {
> - if (!strcmp(s, var->name))
> - break;
> - var++;
> - }
> -
> - if (!var->name) {
> - pr_err("Unknown debug variable name '%s'\n", s);
> - free(s);
> - return -1;
> - }
> + int ret;
>
> - if (vstr) {
> - v = atoi(vstr);
> - /*
> - * Allow only values in range (0, 10),
> - * otherwise set 0.
> - */
> - v = (v < 0) || (v > 10) ? 0 : v;
> - }
> + ret = perf_parse_sublevel_options(str, debug_opts);
> + if (ret)
> + return ret;
>
> - if (quiet)
> - v = -1;
> + /* Allow only verbose value in range (0, 10), otherwise set 0. */
> + verbose = (verbose < 0) || (verbose > 10) ? 0 : verbose;
>
> - *var->ptr = v;
> - free(s);
> return 0;
> }
>
> int perf_quiet_option(void)
> {
> - struct debug_variable *var = &debug_variables[0];
> + struct sublevel_option *opt = &debug_opts[0];
>
> /* disable all debug messages */
> - while (var->name) {
> - *var->ptr = -1;
> - var++;
> + while (opt->name) {
> + *opt->value_ptr = -1;
> + opt++;
> }
>
> return 0;
> diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
> index 37a9492edb3e..7e532a93835b 100644
> --- a/tools/perf/util/util.c
> +++ b/tools/perf/util/util.c
> @@ -416,3 +416,59 @@ char *perf_exe(char *buf, int len)
> }
> return strcpy(buf, "perf");
> }
> +
> +static int parse_one_sublevel_option(const char *str,
> + struct sublevel_option *opts)
> +{
> + struct sublevel_option *opt = &opts[0];
> + char *vstr, *s = strdup(str);
> + int v = 1;
> +
> + vstr = strchr(s, '=');
> + if (vstr)
> + *vstr++ = 0;
> +
> + while (opt->name) {
> + if (!strcmp(s, opt->name))
> + break;
> + opt++;
> + }
> +
> + if (!opt->name) {
> + pr_err("Unknown option name '%s'\n", s);
> + free(s);
> + return -1;
> + }
> +
> + if (vstr)
> + v = atoi(vstr);
> +
> + *opt->value_ptr = v;
> + free(s);
> + return 0;
> +}
> +
> +/* parse options like --foo a=<n>,b,c... */
> +int perf_parse_sublevel_options(const char *str, struct sublevel_option *opts)
> +{
> + char *s = strdup(str);
> + char *p = NULL;
> + int ret;
> +
> + if (!s)
> + return -1;
> +
> + p = strtok(s, ",");
> + while (p) {
> + ret = parse_one_sublevel_option(p, opts);
> + if (ret) {
> + free(s);
> + return ret;
> + }
> +
> + p = strtok(NULL, ",");
> + }
> +
> + free(s);
> + return 0;
> +}
> \ No newline at end of file
> diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
> index f486fdd3a538..8cb1f980935c 100644
> --- a/tools/perf/util/util.h
> +++ b/tools/perf/util/util.h
> @@ -52,6 +52,13 @@ void perf_set_multithreaded(void);
>
> char *perf_exe(char *buf, int len);
>
> +struct sublevel_option {
> + const char *name;
> + int *value_ptr;
> +};
> +
> +int perf_parse_sublevel_options(const char *str, struct sublevel_option *opts);
> +
> #ifndef O_CLOEXEC
> #ifdef __sparc__
> #define O_CLOEXEC 0x400000
> --
> 2.25.1
>
--
- Arnaldo
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH v3 09/17] perf: util: add general function to parse sublevel options
2020-07-08 17:34 ` Arnaldo Carvalho de Melo
@ 2020-07-10 13:14 ` Changbin Du
0 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-10 13:14 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Changbin Du, Jiri Olsa, Peter Zijlstra, Ingo Molnar, Namhyung Kim,
Steven Rostedt, linux-kernel
On Wed, Jul 08, 2020 at 02:34:23PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Thu, Jul 09, 2020 at 12:45:57AM +0800, Changbin Du escreveu:
> > This factors out a general function perf_parse_sublevel_options() to parse
> > sublevel options. The 'sublevel' options is something like the '--debug'
> > options which allow more sublevel options.
>
> Please don't add stuff to util.h/util.c, its too generic a name and
> we've been trying to move things to more appropriate locations, so
> follow the example of:
>
> [acme@quaco perf]$ ls -la tools/perf/util/parse-regs-options.*
> -rw-rw-r--. 1 acme acme 1932 Feb 12 15:11 tools/perf/util/parse-regs-options.c
> -rw-rw-r--. 1 acme acme 316 Dec 20 2019 tools/perf/util/parse-regs-options.h
> [acme@quaco perf]$
>
I crated files util/parse-sublevel-options.c and util/parse-sublevel-options.h
to hold this new function.
> Good job identifying this code and reusing it!
>
> - Arnaldo
>
> > Signed-off-by: Changbin Du <changbin.du@gmail.com>
> > ---
> > tools/perf/util/debug.c | 61 ++++++++++++-----------------------------
> > tools/perf/util/util.c | 56 +++++++++++++++++++++++++++++++++++++
> > tools/perf/util/util.h | 7 +++++
> > 3 files changed, 80 insertions(+), 44 deletions(-)
> >
> > diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c
> > index adb656745ecc..79999c57a609 100644
> > --- a/tools/perf/util/debug.c
> > +++ b/tools/perf/util/debug.c
> > @@ -20,6 +20,7 @@
> > #include "target.h"
> > #include "ui/helpline.h"
> > #include "ui/ui.h"
> > +#include "util/util.h"
> >
> > #include <linux/ctype.h>
> >
> > @@ -173,65 +174,37 @@ void trace_event(union perf_event *event)
> > trace_event_printer, event);
> > }
> >
> > -static struct debug_variable {
> > - const char *name;
> > - int *ptr;
> > -} debug_variables[] = {
> > - { .name = "verbose", .ptr = &verbose },
> > - { .name = "ordered-events", .ptr = &debug_ordered_events},
> > - { .name = "stderr", .ptr = &redirect_to_stderr},
> > - { .name = "data-convert", .ptr = &debug_data_convert },
> > - { .name = "perf-event-open", .ptr = &debug_peo_args },
> > +static struct sublevel_option debug_opts[] = {
> > + { .name = "verbose", .value_ptr = &verbose },
> > + { .name = "ordered-events", .value_ptr = &debug_ordered_events},
> > + { .name = "stderr", .value_ptr = &redirect_to_stderr},
> > + { .name = "data-convert", .value_ptr = &debug_data_convert },
> > + { .name = "perf-event-open", .value_ptr = &debug_peo_args },
> > { .name = NULL, }
> > };
> >
> > int perf_debug_option(const char *str)
> > {
> > - struct debug_variable *var = &debug_variables[0];
> > - char *vstr, *s = strdup(str);
> > - int v = 1;
> > -
> > - vstr = strchr(s, '=');
> > - if (vstr)
> > - *vstr++ = 0;
> > -
> > - while (var->name) {
> > - if (!strcmp(s, var->name))
> > - break;
> > - var++;
> > - }
> > -
> > - if (!var->name) {
> > - pr_err("Unknown debug variable name '%s'\n", s);
> > - free(s);
> > - return -1;
> > - }
> > + int ret;
> >
> > - if (vstr) {
> > - v = atoi(vstr);
> > - /*
> > - * Allow only values in range (0, 10),
> > - * otherwise set 0.
> > - */
> > - v = (v < 0) || (v > 10) ? 0 : v;
> > - }
> > + ret = perf_parse_sublevel_options(str, debug_opts);
> > + if (ret)
> > + return ret;
> >
> > - if (quiet)
> > - v = -1;
> > + /* Allow only verbose value in range (0, 10), otherwise set 0. */
> > + verbose = (verbose < 0) || (verbose > 10) ? 0 : verbose;
> >
> > - *var->ptr = v;
> > - free(s);
> > return 0;
> > }
> >
> > int perf_quiet_option(void)
> > {
> > - struct debug_variable *var = &debug_variables[0];
> > + struct sublevel_option *opt = &debug_opts[0];
> >
> > /* disable all debug messages */
> > - while (var->name) {
> > - *var->ptr = -1;
> > - var++;
> > + while (opt->name) {
> > + *opt->value_ptr = -1;
> > + opt++;
> > }
> >
> > return 0;
> > diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
> > index 37a9492edb3e..7e532a93835b 100644
> > --- a/tools/perf/util/util.c
> > +++ b/tools/perf/util/util.c
> > @@ -416,3 +416,59 @@ char *perf_exe(char *buf, int len)
> > }
> > return strcpy(buf, "perf");
> > }
> > +
> > +static int parse_one_sublevel_option(const char *str,
> > + struct sublevel_option *opts)
> > +{
> > + struct sublevel_option *opt = &opts[0];
> > + char *vstr, *s = strdup(str);
> > + int v = 1;
> > +
> > + vstr = strchr(s, '=');
> > + if (vstr)
> > + *vstr++ = 0;
> > +
> > + while (opt->name) {
> > + if (!strcmp(s, opt->name))
> > + break;
> > + opt++;
> > + }
> > +
> > + if (!opt->name) {
> > + pr_err("Unknown option name '%s'\n", s);
> > + free(s);
> > + return -1;
> > + }
> > +
> > + if (vstr)
> > + v = atoi(vstr);
> > +
> > + *opt->value_ptr = v;
> > + free(s);
> > + return 0;
> > +}
> > +
> > +/* parse options like --foo a=<n>,b,c... */
> > +int perf_parse_sublevel_options(const char *str, struct sublevel_option *opts)
> > +{
> > + char *s = strdup(str);
> > + char *p = NULL;
> > + int ret;
> > +
> > + if (!s)
> > + return -1;
> > +
> > + p = strtok(s, ",");
> > + while (p) {
> > + ret = parse_one_sublevel_option(p, opts);
> > + if (ret) {
> > + free(s);
> > + return ret;
> > + }
> > +
> > + p = strtok(NULL, ",");
> > + }
> > +
> > + free(s);
> > + return 0;
> > +}
> > \ No newline at end of file
> > diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
> > index f486fdd3a538..8cb1f980935c 100644
> > --- a/tools/perf/util/util.h
> > +++ b/tools/perf/util/util.h
> > @@ -52,6 +52,13 @@ void perf_set_multithreaded(void);
> >
> > char *perf_exe(char *buf, int len);
> >
> > +struct sublevel_option {
> > + const char *name;
> > + int *value_ptr;
> > +};
> > +
> > +int perf_parse_sublevel_options(const char *str, struct sublevel_option *opts);
> > +
> > #ifndef O_CLOEXEC
> > #ifdef __sparc__
> > #define O_CLOEXEC 0x400000
> > --
> > 2.25.1
> >
>
> --
>
> - Arnaldo
--
Cheers,
Changbin Du
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v3 10/17] perf ftrace: add support for tracing option 'func_stack_trace'
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (8 preceding siblings ...)
2020-07-08 16:45 ` [PATCH v3 09/17] perf: util: add general function to parse sublevel options Changbin Du
@ 2020-07-08 16:45 ` Changbin Du
2020-07-08 16:45 ` [PATCH v3 11/17] perf ftrace: add support for trace option sleep-time Changbin Du
` (7 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:45 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This adds support to display call trace for function tracer. To do this,
just specify a '--func-opts call-graph' option.
$ sudo perf ftrace -T vfs_read --func-opts call-graph
iio-sensor-prox-855 [003] 6168.369657: vfs_read <-ksys_read
iio-sensor-prox-855 [003] 6168.369677: <stack trace>
=> vfs_read
=> ksys_read
=> __x64_sys_read
=> do_syscall_64
=> entry_SYSCALL_64_after_hwframe
...
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
v3: switch to uniform option --func-opts.
v2: option name '-s' -> '--func-call-graph'
---
tools/perf/Documentation/perf-ftrace.txt | 4 +++
tools/perf/builtin-ftrace.c | 42 ++++++++++++++++++++++++
2 files changed, 46 insertions(+)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index 27381c0dafe7..eba0e85aa308 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -82,6 +82,10 @@ OPTIONS
(or glob patterns). It will be passed to 'set_ftrace_notrace'
in tracefs.
+--func-opts::
+ List of options allowed to set:
+ call-graph - Display kernel stack trace for function tracer.
+
-G::
--graph-funcs=::
Set graph filter on the given function (or a glob pattern).
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index ab1435c2cd0e..095471593d68 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -27,6 +27,7 @@
#include "util/cap.h"
#include "util/config.h"
#include "util/units.h"
+#include "util/util.h"
struct perf_ftrace {
struct evlist *evlist;
@@ -41,6 +42,7 @@ struct perf_ftrace {
unsigned initial_delay;
unsigned long percpu_buffer_size;
bool inherit;
+ int func_stack_trace;
};
struct filter_entry {
@@ -198,6 +200,7 @@ static void reset_tracing_filters(void);
static void reset_tracing_options(struct perf_ftrace *ftrace __maybe_unused)
{
write_tracing_option_file("function-fork", "0");
+ write_tracing_option_file("func_stack_trace", "0");
}
static int reset_tracing_files(struct perf_ftrace *ftrace __maybe_unused)
@@ -274,6 +277,17 @@ static int set_tracing_cpu(struct perf_ftrace *ftrace)
return set_tracing_cpumask(cpumap);
}
+static int set_tracing_func_stack_trace(struct perf_ftrace *ftrace)
+{
+ if (!ftrace->func_stack_trace)
+ return 0;
+
+ if (write_tracing_option_file("func_stack_trace", "1") < 0)
+ return -1;
+
+ return 0;
+}
+
static int reset_tracing_cpu(void)
{
struct perf_cpu_map *cpumap = perf_cpu_map__new(NULL);
@@ -422,6 +436,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
goto out_reset;
}
+ if (set_tracing_func_stack_trace(ftrace) < 0) {
+ pr_err("failed to set tracing option func_stack_trace\n");
+ goto out_reset;
+ }
+
if (set_tracing_filters(ftrace) < 0) {
pr_err("failed to set tracing filters\n");
goto out_reset;
@@ -605,6 +624,26 @@ static int parse_buffer_size(const struct option *opt,
return -1;
}
+static int parse_func_tracer_opts(const struct option *opt,
+ const char *str, int unset)
+{
+ int ret;
+ struct perf_ftrace *ftrace = (struct perf_ftrace *) opt->value;
+ struct sublevel_option func_tracer_opts[] = {
+ { .name = "call-graph", .value_ptr = &ftrace->func_stack_trace },
+ { .name = NULL, }
+ };
+
+ if (unset)
+ return 0;
+
+ ret = perf_parse_sublevel_options(str, func_tracer_opts);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
int cmd_ftrace(int argc, const char **argv)
{
int ret;
@@ -637,6 +676,9 @@ int cmd_ftrace(int argc, const char **argv)
parse_filter_func),
OPT_CALLBACK('N', "notrace-funcs", &ftrace.notrace, "func",
"do not trace given functions", parse_filter_func),
+ OPT_CALLBACK(0, "func-opts", &ftrace, "options",
+ "function tracer options, available options: call-graph",
+ parse_func_tracer_opts),
OPT_CALLBACK('G', "graph-funcs", &ftrace.graph_funcs, "func",
"trace given functions using function_graph tracer",
parse_filter_func),
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 11/17] perf ftrace: add support for trace option sleep-time
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (9 preceding siblings ...)
2020-07-08 16:45 ` [PATCH v3 10/17] perf ftrace: add support for tracing option 'func_stack_trace' Changbin Du
@ 2020-07-08 16:45 ` Changbin Du
2020-07-08 16:46 ` [PATCH v3 12/17] perf ftrace: add support for trace option funcgraph-irqs Changbin Du
` (6 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:45 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This adds an option '--graph-opts nosleep-time' which allow us
only to measure on-CPU time. This option is function_graph tracer
only.
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
v3: switch to uniform option --graph-opts.
v2: option name '--nosleep-time' -> '--graph-nosleep-time'.
---
tools/perf/Documentation/perf-ftrace.txt | 4 +++
tools/perf/builtin-ftrace.c | 41 ++++++++++++++++++++++++
2 files changed, 45 insertions(+)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index eba0e85aa308..2165a75f1da1 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -106,6 +106,10 @@ OPTIONS
--graph-depth=::
Set max depth for function graph tracer to follow
+--graph-opts::
+ List of options allowed to set:
+ nosleep-time - Measure on-CPU time only for function_graph tracer.
+
SEE ALSO
--------
linkperf:perf-record[1], linkperf:perf-trace[1]
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 095471593d68..57d04d0e1178 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -43,6 +43,7 @@ struct perf_ftrace {
unsigned long percpu_buffer_size;
bool inherit;
int func_stack_trace;
+ int graph_nosleep_time;
};
struct filter_entry {
@@ -201,6 +202,7 @@ static void reset_tracing_options(struct perf_ftrace *ftrace __maybe_unused)
{
write_tracing_option_file("function-fork", "0");
write_tracing_option_file("func_stack_trace", "0");
+ write_tracing_option_file("sleep-time", "1");
}
static int reset_tracing_files(struct perf_ftrace *ftrace __maybe_unused)
@@ -382,6 +384,17 @@ static int set_tracing_trace_inherit(struct perf_ftrace *ftrace)
return 0;
}
+static int set_tracing_sleep_time(struct perf_ftrace *ftrace)
+{
+ if (!ftrace->graph_nosleep_time)
+ return 0;
+
+ if (write_tracing_option_file("sleep-time", "0") < 0)
+ return -1;
+
+ return 0;
+}
+
static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
{
char *trace_file;
@@ -461,6 +474,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
goto out_reset;
}
+ if (set_tracing_sleep_time(ftrace) < 0) {
+ pr_err("failed to set tracing option sleep-time\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;
@@ -644,6 +662,26 @@ static int parse_func_tracer_opts(const struct option *opt,
return 0;
}
+static int parse_graph_tracer_opts(const struct option *opt,
+ const char *str, int unset)
+{
+ int ret;
+ struct perf_ftrace *ftrace = (struct perf_ftrace *) opt->value;
+ struct sublevel_option graph_tracer_opts[] = {
+ { .name = "nosleep-time", .value_ptr = &ftrace->graph_nosleep_time },
+ { .name = NULL, }
+ };
+
+ if (unset)
+ return 0;
+
+ ret = perf_parse_sublevel_options(str, graph_tracer_opts);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
int cmd_ftrace(int argc, const char **argv)
{
int ret;
@@ -686,6 +724,9 @@ 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(0, "graph-opts", &ftrace, "options",
+ "graph tracer options, available options: nosleep-time",
+ parse_graph_tracer_opts),
OPT_UINTEGER('d', "delay", &ftrace.initial_delay,
"ms to wait before starting tracing after program start"),
OPT_CALLBACK('m', "buffer-size", &ftrace.percpu_buffer_size, "size",
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 12/17] perf ftrace: add support for trace option funcgraph-irqs
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (10 preceding siblings ...)
2020-07-08 16:45 ` [PATCH v3 11/17] perf ftrace: add support for trace option sleep-time Changbin Du
@ 2020-07-08 16:46 ` Changbin Du
2020-07-08 16:46 ` [PATCH v3 13/17] perf ftrace: add support for tracing option 'irq-info' Changbin Du
` (5 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:46 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This adds an option '--graph-opts noirqs' to filter out functions executed
in irq context.
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
v2: option name '--nofuncgraph-irqs' -> '--graph-noirqs'.
---
tools/perf/Documentation/perf-ftrace.txt | 1 +
tools/perf/builtin-ftrace.c | 21 ++++++++++++++++++++-
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index 2165a75f1da1..5cc1f83795f5 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -109,6 +109,7 @@ OPTIONS
--graph-opts::
List of options allowed to set:
nosleep-time - Measure on-CPU time only for function_graph tracer.
+ noirqs - Ignore functions that happen inside interrupt.
SEE ALSO
--------
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 57d04d0e1178..330dac9ffe3d 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -44,6 +44,7 @@ struct perf_ftrace {
bool inherit;
int func_stack_trace;
int graph_nosleep_time;
+ int graph_noirqs;
};
struct filter_entry {
@@ -203,6 +204,7 @@ static void reset_tracing_options(struct perf_ftrace *ftrace __maybe_unused)
write_tracing_option_file("function-fork", "0");
write_tracing_option_file("func_stack_trace", "0");
write_tracing_option_file("sleep-time", "1");
+ write_tracing_option_file("funcgraph-irqs", "1");
}
static int reset_tracing_files(struct perf_ftrace *ftrace __maybe_unused)
@@ -395,6 +397,17 @@ static int set_tracing_sleep_time(struct perf_ftrace *ftrace)
return 0;
}
+static int set_tracing_funcgraph_irqs(struct perf_ftrace *ftrace)
+{
+ if (!ftrace->graph_noirqs)
+ return 0;
+
+ if (write_tracing_option_file("funcgraph-irqs", "0") < 0)
+ return -1;
+
+ return 0;
+}
+
static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
{
char *trace_file;
@@ -479,6 +492,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
goto out_reset;
}
+ if (set_tracing_funcgraph_irqs(ftrace) < 0) {
+ pr_err("failed to set tracing option funcgraph-irqs\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;
@@ -669,6 +687,7 @@ static int parse_graph_tracer_opts(const struct option *opt,
struct perf_ftrace *ftrace = (struct perf_ftrace *) opt->value;
struct sublevel_option graph_tracer_opts[] = {
{ .name = "nosleep-time", .value_ptr = &ftrace->graph_nosleep_time },
+ { .name = "noirqs", .value_ptr = &ftrace->graph_noirqs },
{ .name = NULL, }
};
@@ -725,7 +744,7 @@ int cmd_ftrace(int argc, const char **argv)
OPT_INTEGER('D', "graph-depth", &ftrace.graph_depth,
"Max depth for function graph tracer"),
OPT_CALLBACK(0, "graph-opts", &ftrace, "options",
- "graph tracer options, available options: nosleep-time",
+ "graph tracer options, available options: nosleep-time,noirqs",
parse_graph_tracer_opts),
OPT_UINTEGER('d', "delay", &ftrace.initial_delay,
"ms to wait before starting tracing after program start"),
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 13/17] perf ftrace: add support for tracing option 'irq-info'
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (11 preceding siblings ...)
2020-07-08 16:46 ` [PATCH v3 12/17] perf ftrace: add support for trace option funcgraph-irqs Changbin Du
@ 2020-07-08 16:46 ` Changbin Du
2020-07-08 16:46 ` [PATCH v3 14/17] perf ftrace: add option 'verbose' to show more info for graph tracer Changbin Du
` (4 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:46 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This adds support to display irq context info for function tracer. To do
this, just specify a '--func-opts irq-info' option.
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
tools/perf/Documentation/perf-ftrace.txt | 1 +
tools/perf/builtin-ftrace.c | 21 ++++++++++++++++++++-
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index 5cc1f83795f5..b157566e54a2 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -85,6 +85,7 @@ OPTIONS
--func-opts::
List of options allowed to set:
call-graph - Display kernel stack trace for function tracer.
+ irq-info - Display irq context info for function tracer.
-G::
--graph-funcs=::
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 330dac9ffe3d..a750ee78db4f 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -43,6 +43,7 @@ struct perf_ftrace {
unsigned long percpu_buffer_size;
bool inherit;
int func_stack_trace;
+ int func_irq_info;
int graph_nosleep_time;
int graph_noirqs;
};
@@ -205,6 +206,7 @@ static void reset_tracing_options(struct perf_ftrace *ftrace __maybe_unused)
write_tracing_option_file("func_stack_trace", "0");
write_tracing_option_file("sleep-time", "1");
write_tracing_option_file("funcgraph-irqs", "1");
+ write_tracing_option_file("irq-info", "0");
}
static int reset_tracing_files(struct perf_ftrace *ftrace __maybe_unused)
@@ -292,6 +294,17 @@ static int set_tracing_func_stack_trace(struct perf_ftrace *ftrace)
return 0;
}
+static int set_tracing_func_irqinfo(struct perf_ftrace *ftrace)
+{
+ if (!ftrace->func_irq_info)
+ return 0;
+
+ if (write_tracing_option_file("irq-info", "1") < 0)
+ return -1;
+
+ return 0;
+}
+
static int reset_tracing_cpu(void)
{
struct perf_cpu_map *cpumap = perf_cpu_map__new(NULL);
@@ -467,6 +480,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
goto out_reset;
}
+ if (set_tracing_func_irqinfo(ftrace) < 0) {
+ pr_err("failed to set tracing option irq-info\n");
+ goto out_reset;
+ }
+
if (set_tracing_filters(ftrace) < 0) {
pr_err("failed to set tracing filters\n");
goto out_reset;
@@ -667,6 +685,7 @@ static int parse_func_tracer_opts(const struct option *opt,
struct perf_ftrace *ftrace = (struct perf_ftrace *) opt->value;
struct sublevel_option func_tracer_opts[] = {
{ .name = "call-graph", .value_ptr = &ftrace->func_stack_trace },
+ { .name = "irq-info", .value_ptr = &ftrace->func_irq_info },
{ .name = NULL, }
};
@@ -734,7 +753,7 @@ int cmd_ftrace(int argc, const char **argv)
OPT_CALLBACK('N', "notrace-funcs", &ftrace.notrace, "func",
"do not trace given functions", parse_filter_func),
OPT_CALLBACK(0, "func-opts", &ftrace, "options",
- "function tracer options, available options: call-graph",
+ "function tracer options, available options: call-graph,irq-info",
parse_func_tracer_opts),
OPT_CALLBACK('G', "graph-funcs", &ftrace.graph_funcs, "func",
"trace given functions using function_graph tracer",
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 14/17] perf ftrace: add option 'verbose' to show more info for graph tracer
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (12 preceding siblings ...)
2020-07-08 16:46 ` [PATCH v3 13/17] perf ftrace: add support for tracing option 'irq-info' Changbin Du
@ 2020-07-08 16:46 ` Changbin Du
2020-07-08 16:46 ` [PATCH v3 15/17] perf ftrace: add support for trace option tracing_thresh Changbin Du
` (3 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:46 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
Sometimes we want ftrace display more and longer information about
the trace.
$ sudo perf ftrace -G
2) 0.979 us | mutex_unlock();
2) 1.540 us | __fsnotify_parent();
2) 0.433 us | fsnotify();
$ sudo perf ftrace -G --graph-opts verbose
14160.770883 | 0) <...>-47814 | .... | 1.289 us | mutex_unlock();
14160.770886 | 0) <...>-47814 | .... | 1.624 us | __fsnotify_parent();
14160.770887 | 0) <...>-47814 | .... | 0.636 us | fsnotify();
14160.770888 | 0) <...>-47814 | .... | 0.328 us | __sb_end_write();
14160.770888 | 0) <...>-47814 | d... | 0.430 us | fpregs_assert_state_consistent();
14160.770889 | 0) <...>-47814 | d... | | do_syscall_64() {
14160.770889 | 0) <...>-47814 | .... | | __x64_sys_close() {
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
tools/perf/Documentation/perf-ftrace.txt | 1 +
tools/perf/builtin-ftrace.c | 29 +++++++++++++++++++++++-
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index b157566e54a2..e88ed3865c8b 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -111,6 +111,7 @@ OPTIONS
List of options allowed to set:
nosleep-time - Measure on-CPU time only for function_graph tracer.
noirqs - Ignore functions that happen inside interrupt.
+ verbose - Show process names, PIDs, timestamps, etc.
SEE ALSO
--------
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index a750ee78db4f..8c537bc6adbb 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -46,6 +46,7 @@ struct perf_ftrace {
int func_irq_info;
int graph_nosleep_time;
int graph_noirqs;
+ int graph_verbose;
};
struct filter_entry {
@@ -206,6 +207,9 @@ static void reset_tracing_options(struct perf_ftrace *ftrace __maybe_unused)
write_tracing_option_file("func_stack_trace", "0");
write_tracing_option_file("sleep-time", "1");
write_tracing_option_file("funcgraph-irqs", "1");
+ write_tracing_option_file("funcgraph-proc", "0");
+ write_tracing_option_file("funcgraph-abstime", "0");
+ write_tracing_option_file("latency-format", "0");
write_tracing_option_file("irq-info", "0");
}
@@ -421,6 +425,23 @@ static int set_tracing_funcgraph_irqs(struct perf_ftrace *ftrace)
return 0;
}
+static int set_tracing_funcgraph_verbose(struct perf_ftrace *ftrace)
+{
+ if (!ftrace->graph_verbose)
+ return 0;
+
+ if (write_tracing_option_file("funcgraph-proc", "1") < 0)
+ return -1;
+
+ if (write_tracing_option_file("funcgraph-abstime", "1") < 0)
+ return -1;
+
+ if (write_tracing_option_file("latency-format", "1") < 0)
+ return -1;
+
+ return 0;
+}
+
static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
{
char *trace_file;
@@ -515,6 +536,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
goto out_reset;
}
+ if (set_tracing_funcgraph_verbose(ftrace) < 0) {
+ pr_err("failed to set tracing option funcgraph-proc/funcgraph-abstime\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;
@@ -707,6 +733,7 @@ static int parse_graph_tracer_opts(const struct option *opt,
struct sublevel_option graph_tracer_opts[] = {
{ .name = "nosleep-time", .value_ptr = &ftrace->graph_nosleep_time },
{ .name = "noirqs", .value_ptr = &ftrace->graph_noirqs },
+ { .name = "verbose", .value_ptr = &ftrace->graph_verbose },
{ .name = NULL, }
};
@@ -763,7 +790,7 @@ int cmd_ftrace(int argc, const char **argv)
OPT_INTEGER('D', "graph-depth", &ftrace.graph_depth,
"Max depth for function graph tracer"),
OPT_CALLBACK(0, "graph-opts", &ftrace, "options",
- "graph tracer options, available options: nosleep-time,noirqs",
+ "graph tracer options, available options: nosleep-time,noirqs,verbose",
parse_graph_tracer_opts),
OPT_UINTEGER('d', "delay", &ftrace.initial_delay,
"ms to wait before starting tracing after program start"),
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 15/17] perf ftrace: add support for trace option tracing_thresh
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (13 preceding siblings ...)
2020-07-08 16:46 ` [PATCH v3 14/17] perf ftrace: add option 'verbose' to show more info for graph tracer Changbin Du
@ 2020-07-08 16:46 ` Changbin Du
2020-07-08 16:46 ` [PATCH v3 16/17] perf: ftrace: allow set graph depth by '--graph-opts' Changbin Du
` (2 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:46 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This adds an option '--graph-opts thresh' to setup trace duration
threshold for funcgraph tracer.
$ sudo ./perf ftrace -G --graph-opts thresh=100
3) ! 184.060 us | } /* schedule */
3) ! 185.600 us | } /* exit_to_usermode_loop */
2) ! 225.989 us | } /* schedule_idle */
2) # 4140.051 us | } /* do_idle */
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
tools/perf/Documentation/perf-ftrace.txt | 1 +
tools/perf/builtin-ftrace.c | 26 +++++++++++++++++++++++-
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index e88ed3865c8b..bcb1504892ef 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -112,6 +112,7 @@ OPTIONS
nosleep-time - Measure on-CPU time only for function_graph tracer.
noirqs - Ignore functions that happen inside interrupt.
verbose - Show process names, PIDs, timestamps, etc.
+ thresh=<n> - Setup trace duration threshold in microseconds.
SEE ALSO
--------
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 8c537bc6adbb..21d6d6791dc3 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -47,6 +47,7 @@ struct perf_ftrace {
int graph_nosleep_time;
int graph_noirqs;
int graph_verbose;
+ int graph_thresh;
};
struct filter_entry {
@@ -230,6 +231,9 @@ static int reset_tracing_files(struct perf_ftrace *ftrace __maybe_unused)
if (write_tracing_file("max_graph_depth", "0") < 0)
return -1;
+ if (write_tracing_file("tracing_thresh", "0") < 0)
+ return -1;
+
reset_tracing_filters();
reset_tracing_options(ftrace);
return 0;
@@ -442,6 +446,20 @@ static int set_tracing_funcgraph_verbose(struct perf_ftrace *ftrace)
return 0;
}
+static int set_tracing_thresh(struct perf_ftrace *ftrace)
+{
+ int ret;
+
+ if (ftrace->graph_thresh == 0)
+ return 0;
+
+ ret = write_tracing_file_int("tracing_thresh", ftrace->graph_thresh);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
{
char *trace_file;
@@ -541,6 +559,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
goto out_reset;
}
+ if (set_tracing_thresh(ftrace) < 0) {
+ pr_err("failed to set tracing thresh\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;
@@ -734,6 +757,7 @@ static int parse_graph_tracer_opts(const struct option *opt,
{ .name = "nosleep-time", .value_ptr = &ftrace->graph_nosleep_time },
{ .name = "noirqs", .value_ptr = &ftrace->graph_noirqs },
{ .name = "verbose", .value_ptr = &ftrace->graph_verbose },
+ { .name = "thresh", .value_ptr = &ftrace->graph_thresh },
{ .name = NULL, }
};
@@ -790,7 +814,7 @@ int cmd_ftrace(int argc, const char **argv)
OPT_INTEGER('D', "graph-depth", &ftrace.graph_depth,
"Max depth for function graph tracer"),
OPT_CALLBACK(0, "graph-opts", &ftrace, "options",
- "graph tracer options, available options: nosleep-time,noirqs,verbose",
+ "graph tracer options, available options: nosleep-time,noirqs,verbose,thresh=<n>",
parse_graph_tracer_opts),
OPT_UINTEGER('d', "delay", &ftrace.initial_delay,
"ms to wait before starting tracing after program start"),
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 16/17] perf: ftrace: allow set graph depth by '--graph-opts'
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (14 preceding siblings ...)
2020-07-08 16:46 ` [PATCH v3 15/17] perf ftrace: add support for trace option tracing_thresh Changbin Du
@ 2020-07-08 16:46 ` Changbin Du
2020-07-08 16:46 ` [PATCH v3 17/17] perf ftrace: add change log Changbin Du
2020-07-08 17:39 ` [PATCH v3 00/17] perf: ftrace enhancement Arnaldo Carvalho de Melo
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:46 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
This is to have a consistent view of all graph tracer options.
The original option '--graph-depth' is marked as deprecated.
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
tools/perf/Documentation/perf-ftrace.txt | 4 +++-
tools/perf/builtin-ftrace.c | 5 +++--
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
index bcb1504892ef..fa99ec1ef58a 100644
--- a/tools/perf/Documentation/perf-ftrace.txt
+++ b/tools/perf/Documentation/perf-ftrace.txt
@@ -105,7 +105,8 @@ OPTIONS
-D::
--graph-depth=::
- Set max depth for function graph tracer to follow
+ Set max depth for function graph tracer to follow. This option is
+ deprecated, use '--graph-opts depth=<n>' instead.
--graph-opts::
List of options allowed to set:
@@ -113,6 +114,7 @@ OPTIONS
noirqs - Ignore functions that happen inside interrupt.
verbose - Show process names, PIDs, timestamps, etc.
thresh=<n> - Setup trace duration threshold in microseconds.
+ depth=<n> - Set max depth for function graph tracer to follow.
SEE ALSO
--------
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 21d6d6791dc3..a20187b1556a 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -758,6 +758,7 @@ static int parse_graph_tracer_opts(const struct option *opt,
{ .name = "noirqs", .value_ptr = &ftrace->graph_noirqs },
{ .name = "verbose", .value_ptr = &ftrace->graph_verbose },
{ .name = "thresh", .value_ptr = &ftrace->graph_thresh },
+ { .name = "depth", .value_ptr = &ftrace->graph_depth },
{ .name = NULL, }
};
@@ -812,9 +813,9 @@ int cmd_ftrace(int argc, const char **argv)
OPT_CALLBACK('g', "nograph-funcs", &ftrace.nograph_funcs, "func",
"Set nograph filter on given functions", parse_filter_func),
OPT_INTEGER('D', "graph-depth", &ftrace.graph_depth,
- "Max depth for function graph tracer"),
+ "Max depth for function graph tracer (This option is deprecated)"),
OPT_CALLBACK(0, "graph-opts", &ftrace, "options",
- "graph tracer options, available options: nosleep-time,noirqs,verbose,thresh=<n>",
+ "graph tracer options, available options: nosleep-time,noirqs,verbose,thresh=<n>,depth=<n>",
parse_graph_tracer_opts),
OPT_UINTEGER('d', "delay", &ftrace.initial_delay,
"ms to wait before starting tracing after program start"),
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH v3 17/17] perf ftrace: add change log
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (15 preceding siblings ...)
2020-07-08 16:46 ` [PATCH v3 16/17] perf: ftrace: allow set graph depth by '--graph-opts' Changbin Du
@ 2020-07-08 16:46 ` Changbin Du
2020-07-08 17:39 ` [PATCH v3 00/17] perf: ftrace enhancement Arnaldo Carvalho de Melo
17 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-08 16:46 UTC (permalink / raw)
To: Jiri Olsa, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Steven Rostedt,
linux-kernel, Changbin Du
Add a change log after previous enhancements.
Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
tools/perf/builtin-ftrace.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index a20187b1556a..664cdfabc77b 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -3,6 +3,7 @@
* builtin-ftrace.c
*
* Copyright (c) 2013 LG Electronics, Namhyung Kim <namhyung@kernel.org>
+ * Copyright (c) 2020 Changbin Du <changbin.du@gmail.com>, significant enhancement.
*/
#include "builtin.h"
--
2.25.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* Re: [PATCH v3 00/17] perf: ftrace enhancement
2020-07-08 16:45 [PATCH v3 00/17] perf: ftrace enhancement Changbin Du
` (16 preceding siblings ...)
2020-07-08 16:46 ` [PATCH v3 17/17] perf ftrace: add change log Changbin Du
@ 2020-07-08 17:39 ` Arnaldo Carvalho de Melo
2020-07-10 13:35 ` Changbin Du
17 siblings, 1 reply; 22+ messages in thread
From: Arnaldo Carvalho de Melo @ 2020-07-08 17:39 UTC (permalink / raw)
To: Changbin Du
Cc: Jiri Olsa, Peter Zijlstra, Ingo Molnar, Namhyung Kim,
Steven Rostedt, linux-kernel
Em Thu, Jul 09, 2020 at 12:45:48AM +0800, Changbin Du escreveu:
> Here is a glance of all ftrace functions with this serias:
>
> $ sudo perf ftrace -h
> Usage: perf ftrace [<options>] [<command>]
> or: perf ftrace [<options>] -- <command> [<options>]
>
> -a, --all-cpus system-wide collection from all CPUs
> -C, --cpu <cpu> list of cpus to monitor
> -d, --delay <n> ms to wait before starting tracing after program start
> -D, --graph-depth <n>
> Max depth for function graph tracer (This option is deprecated)
> -F, --funcs Show available functions to filter
> -G, --graph-funcs <func>
> trace given functions using function_graph tracer
> -g, --nograph-funcs <func>
> Set nograph filter on given functions
> -m, --buffer-size <size>
> size of per cpu buffer
> -N, --notrace-funcs <func>
> do not trace given functions
> -p, --pid <pid> trace on existing process id
> -t, --tid <tid> trace on existing thread id (exclusive to --pid)
> -T, --trace-funcs <func>
> trace given functions using function tracer
> -t, --tracer <tracer>
> tracer to use: function or function_graph (This option is deprecated)
> -v, --verbose be more verbose
> --func-opts <options>
> function tracer options, available options: call-graph,irq-info
> --graph-opts <options>
> graph tracer options, available options: nosleep-time,noirqs,verbose,thresh=<n>,depth=<n>
> --inherit trace children processes
>
> v3:
> o add --func-opts and --graph-opts to set tracer specific options.
> o support units as a suffix for option '-m/--buffer-size'.
Thanks for working on this! -d/--delay:
[acme@quaco perf]$ perf record -h delay
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-D, --delay <n> ms to wait before starting measurement after program start
[acme@quaco perf]$
[acme@quaco perf]$ perf stat -h --delay
Usage: perf stat [<options>] [<command>]
-D, --delay <n> ms to wait before starting measurement after program start
[acme@quaco perf]$
[acme@quaco perf]$ perf trace -h -D
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-D, --delay <n> ms to wait before starting measurement after program start
Perhaps we can move --graph-depth to --graph-opts and make -D/--delay be
just like with 'perf record', 'perf stat' and 'perf trace'?
Will be super nice if one can go from:
perf stat --delay 100 workload
to see the default set of counters to:
perf ftrace --delay 100 workload
to get the ftrace output for that.
Ditto seeing the syscalls strace-like with:
perf trace --delay 100 workload
Regards,
- Arnaldo
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH v3 00/17] perf: ftrace enhancement
2020-07-08 17:39 ` [PATCH v3 00/17] perf: ftrace enhancement Arnaldo Carvalho de Melo
@ 2020-07-10 13:35 ` Changbin Du
0 siblings, 0 replies; 22+ messages in thread
From: Changbin Du @ 2020-07-10 13:35 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Changbin Du, Jiri Olsa, Peter Zijlstra, Ingo Molnar, Namhyung Kim,
Steven Rostedt, linux-kernel
On Wed, Jul 08, 2020 at 02:39:59PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Thu, Jul 09, 2020 at 12:45:48AM +0800, Changbin Du escreveu:
> > Here is a glance of all ftrace functions with this serias:
> >
> > $ sudo perf ftrace -h
>
> > Usage: perf ftrace [<options>] [<command>]
> > or: perf ftrace [<options>] -- <command> [<options>]
> >
> > -a, --all-cpus system-wide collection from all CPUs
> > -C, --cpu <cpu> list of cpus to monitor
> > -d, --delay <n> ms to wait before starting tracing after program start
> > -D, --graph-depth <n>
> > Max depth for function graph tracer (This option is deprecated)
> > -F, --funcs Show available functions to filter
> > -G, --graph-funcs <func>
> > trace given functions using function_graph tracer
> > -g, --nograph-funcs <func>
> > Set nograph filter on given functions
> > -m, --buffer-size <size>
> > size of per cpu buffer
> > -N, --notrace-funcs <func>
> > do not trace given functions
> > -p, --pid <pid> trace on existing process id
> > -t, --tid <tid> trace on existing thread id (exclusive to --pid)
> > -T, --trace-funcs <func>
> > trace given functions using function tracer
> > -t, --tracer <tracer>
> > tracer to use: function or function_graph (This option is deprecated)
> > -v, --verbose be more verbose
> > --func-opts <options>
> > function tracer options, available options: call-graph,irq-info
> > --graph-opts <options>
> > graph tracer options, available options: nosleep-time,noirqs,verbose,thresh=<n>,depth=<n>
> > --inherit trace children processes
> >
> > v3:
> > o add --func-opts and --graph-opts to set tracer specific options.
> > o support units as a suffix for option '-m/--buffer-size'.
>
> Thanks for working on this! -d/--delay:
>
> [acme@quaco perf]$ perf record -h delay
>
> Usage: perf record [<options>] [<command>]
> or: perf record [<options>] -- <command> [<options>]
>
> -D, --delay <n> ms to wait before starting measurement after program start
>
> [acme@quaco perf]$
>
> [acme@quaco perf]$ perf stat -h --delay
>
> Usage: perf stat [<options>] [<command>]
>
> -D, --delay <n> ms to wait before starting measurement after program start
>
> [acme@quaco perf]$
>
> [acme@quaco perf]$ perf trace -h -D
>
> Usage: perf trace [<options>] [<command>]
> or: perf trace [<options>] -- <command> [<options>]
> or: perf trace record [<options>] [<command>]
> or: perf trace record [<options>] -- <command> [<options>]
>
> -D, --delay <n> ms to wait before starting measurement after program start
>
> Perhaps we can move --graph-depth to --graph-opts and make -D/--delay be
> just like with 'perf record', 'perf stat' and 'perf trace'?
>
> Will be super nice if one can go from:
>
> perf stat --delay 100 workload
>
> to see the default set of counters to:
>
> perf ftrace --delay 100 workload
>
> to get the ftrace output for that.
>
> Ditto seeing the syscalls strace-like with:
>
> perf trace --delay 100 workload
>
No problem. Now -D/--graph-depth is moved to --graph-opts.
> Regards,
>
> - Arnaldo
--
Cheers,
Changbin Du
^ permalink raw reply [flat|nested] 22+ messages in thread