From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: Clark Williams <williams@redhat.com>,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
Arnaldo Carvalho de Melo <acme@redhat.com>,
Adrian Hunter <adrian.hunter@intel.com>,
David Ahern <dsahern@gmail.com>, Jiri Olsa <jolsa@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Wang Nan <wangnan0@huawei.com>
Subject: [PATCH 01/77] perf trace: Pass augmented args to the arg formatters when available
Date: Wed, 5 Sep 2018 19:03:24 -0300 [thread overview]
Message-ID: <20180905220440.20256-2-acme@kernel.org> (raw)
In-Reply-To: <20180905220440.20256-1-acme@kernel.org>
From: Arnaldo Carvalho de Melo <acme@redhat.com>
If the tracepoint payload is bigger than what a syscall expected from
what is in its format file in tracefs, then that will be used as
augmented args, i.e. the expansion of syscall arg pointers, with things
like a filename, structs, etc.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-bsbqx7xi2ot4q9bf570f7tqs@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-trace.c | 28 ++++++++++++++++++++++------
tools/perf/trace/beauty/beauty.h | 29 +++++++++++++++++++++++++++++
2 files changed, 51 insertions(+), 6 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 22ab8e67c760..7deae6c8cb25 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -856,10 +856,12 @@ static struct syscall_fmt *syscall_fmt__find(const char *name)
/*
* is_exit: is this "exit" or "exit_group"?
* is_open: is this "open" or "openat"? To associate the fd returned in sys_exit with the pathname in sys_enter.
+ * args_size: sum of the sizes of the syscall arguments, anything after that is augmented stuff: pathname for openat, etc.
*/
struct syscall {
struct event_format *tp_format;
int nr_args;
+ int args_size;
bool is_exit;
bool is_open;
struct format_field *args;
@@ -1258,10 +1260,12 @@ static int syscall__alloc_arg_fmts(struct syscall *sc, int nr_args)
static int syscall__set_arg_fmts(struct syscall *sc)
{
- struct format_field *field;
+ struct format_field *field, *last_field = NULL;
int idx = 0, len;
for (field = sc->args; field; field = field->next, ++idx) {
+ last_field = field;
+
if (sc->fmt && sc->fmt->arg[idx].scnprintf)
continue;
@@ -1292,6 +1296,9 @@ static int syscall__set_arg_fmts(struct syscall *sc)
}
}
+ if (last_field)
+ sc->args_size = last_field->offset + last_field->size;
+
return 0;
}
@@ -1472,14 +1479,18 @@ static size_t syscall__scnprintf_val(struct syscall *sc, char *bf, size_t size,
}
static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
- unsigned char *args, struct trace *trace,
- struct thread *thread)
+ unsigned char *args, void *augmented_args, int augmented_args_size,
+ struct trace *trace, struct thread *thread)
{
size_t printed = 0;
unsigned long val;
u8 bit = 1;
struct syscall_arg arg = {
.args = args,
+ .augmented = {
+ .size = augmented_args_size,
+ .args = augmented_args,
+ },
.idx = 0,
.mask = 0,
.trace = trace,
@@ -1692,7 +1703,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
printed += scnprintf(msg + printed, trace__entry_str_size - printed, "%s(", sc->name);
printed += syscall__scnprintf_args(sc, msg + printed, trace__entry_str_size - printed,
- args, trace, thread);
+ args, NULL, 0, trace, thread);
if (sc->is_exit) {
if (!(trace->duration_filter || trace->summary_only || trace->failure_only || trace->min_stack)) {
@@ -1723,7 +1734,8 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct perf_evsel *evse
int id = perf_evsel__sc_tp_uint(evsel, id, sample), err = -1;
struct syscall *sc = trace__syscall_info(trace, evsel, id);
char msg[1024];
- void *args;
+ void *args, *augmented_args = NULL;
+ int augmented_args_size;
if (sc == NULL)
return -1;
@@ -1738,7 +1750,11 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct perf_evsel *evse
goto out_put;
args = perf_evsel__sc_tp_ptr(evsel, args, sample);
- syscall__scnprintf_args(sc, msg, sizeof(msg), args, trace, thread);
+ augmented_args_size = sample->raw_size - sc->args_size;
+ if (augmented_args_size > 0)
+ augmented_args = sample->raw_data + sc->args_size;
+
+ syscall__scnprintf_args(sc, msg, sizeof(msg), args, augmented_args, augmented_args_size, trace, thread);
fprintf(trace->output, "%s", msg);
err = 0;
out_put:
diff --git a/tools/perf/trace/beauty/beauty.h b/tools/perf/trace/beauty/beauty.h
index 9615af5d412b..6ca044d3d851 100644
--- a/tools/perf/trace/beauty/beauty.h
+++ b/tools/perf/trace/beauty/beauty.h
@@ -30,9 +30,34 @@ struct thread;
size_t pid__scnprintf_fd(struct trace *trace, pid_t pid, int fd, char *bf, size_t size);
+/**
+ * augmented_arg: extra payload for syscall pointer arguments
+
+ * If perf_sample->raw_size is more than what a syscall sys_enter_FOO puts,
+ * then its the arguments contents, so that we can show more than just a
+ * pointer. This will be done initially with eBPF, the start of that is at the
+ * tools/perf/examples/bpf/augmented_syscalls.c example for the openat, but
+ * will eventually be done automagically caching the running kernel tracefs
+ * events data into an eBPF C script, that then gets compiled and its .o file
+ * cached for subsequent use. For char pointers like the ones for 'open' like
+ * syscalls its easy, for the rest we should use DWARF or better, BTF, much
+ * more compact.
+ *
+ * @size: 8 if all we need is an integer, otherwise all of the augmented arg.
+ * @int_arg: will be used for integer like pointer contents, like 'accept's 'upeer_addrlen'
+ * @value: u64 aligned, for structs, pathnames
+ */
+struct augmented_arg {
+ int size;
+ int int_arg;
+ u64 value[];
+};
+
/**
* @val: value of syscall argument being formatted
* @args: All the args, use syscall_args__val(arg, nth) to access one
+ * @augmented_args: Extra data that can be collected, for instance, with eBPF for expanding the pathname for open, etc
+ * @augmented_args_size: augmented_args total payload size
* @thread: tid state (maps, pid, tid, etc)
* @trace: 'perf trace' internals: all threads, etc
* @parm: private area, may be an strarray, for instance
@@ -43,6 +68,10 @@ size_t pid__scnprintf_fd(struct trace *trace, pid_t pid, int fd, char *bf, size_
struct syscall_arg {
unsigned long val;
unsigned char *args;
+ struct {
+ struct augmented_arg *args;
+ int size;
+ } augmented;
struct thread *thread;
struct trace *trace;
void *parm;
--
2.14.4
next prev parent reply other threads:[~2018-09-05 22:03 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-05 22:03 [GIT PULL 00/77] perf/core improvements and fixes Arnaldo Carvalho de Melo
2018-09-05 22:03 ` Arnaldo Carvalho de Melo [this message]
2018-09-05 22:03 ` [PATCH 02/77] perf trace: Make the augmented_syscalls filter out the tracepoint event Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 03/77] perf trace: Print the syscall name for augmented_syscalls Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 04/77] perf trace: Extract the comm/tid printing for syscall enter Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 05/77] perf trace: Show comm/tid for augmented_syscalls Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 06/77] perf trace: Use the augmented filename, expanding syscall enter pointers Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 07/77] perf trace: Augment the 'open' syscall 'filename' arg Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 08/77] perf trace: Augment inotify_add_watch pathname syscall arg Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 09/77] perf trace: Introduce augmented_filename_syscall_enter() declarator Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 10/77] perf trace: Augment 'newstat' (aka 'stat') filename ptr Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 11/77] perf trace: Add a etcsnoop.c augmented syscalls eBPF utility Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 12/77] perf bpf: Give precedence to bpf header dir Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 13/77] perf bpf: Add linux/socket.h to the headers accessible to bpf proggies Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 14/77] perf trace augmented_syscalls: Augment connect's 'sockaddr' arg Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 15/77] perf trace augmented_syscalls: Add augmented_sockaddr_syscall_enter() Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 16/77] perf trace augmented_syscalls: Augment bind's 'myaddr' sockaddr arg Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 17/77] perf trace augmented_syscalls: Augment sendto's 'addr' arg Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 18/77] perf trace beauty: Reorganize 'struct sockaddr *' beautifier Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 19/77] perf report: Create auxiliary trace data files for s390 Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 20/77] tools lib traceevent, perf tools: Split trace-seq related APIs in a separate header file Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 21/77] perf bpf: Add syscall_exit() helper Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 22/77] perf augmented_syscalls: Update the header comments Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 23/77] perf trace augmented_syscalls: Rename augmented_*_syscall__enter to just *_syscall Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 24/77] perf trace augmented_syscalls: Hook into syscalls:sys_exit_SYSCALL too Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 25/77] perf trace: Show comm and tid for tracepoint events Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 26/77] perf stat: Use evsel->threads in create_perf_stat_counter() Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 27/77] perf stat: Move 'initial_delay' to 'struct perf_stat_config' Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 28/77] perf stat: Move 'no_inherit' " Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 29/77] perf stat: Use local config arg for scale in create_perf_stat_counter() Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 30/77] perf stat: Add 'identifier' flag to 'struct perf_stat_config' Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 31/77] perf tools: Switch 'session' argument to 'evlist' in perf_event__synthesize_attrs() Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 32/77] perf evsel: Introduce perf_evsel__store_ids() Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 33/77] perf stat: Move create_perf_stat_counter() to stat.c Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 34/77] perf stat: Rename 'is_pipe' argument to 'attrs' in perf_stat_synthesize_config() Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 35/77] perf stat: Add 'struct perf_stat_config' argument to perf_stat_synthesize_config() Arnaldo Carvalho de Melo
2018-09-05 22:03 ` [PATCH 36/77] perf stat: Add 'struct perf_tool' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 37/77] perf stat: Add 'struct perf_evlist' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 38/77] perf stat: Add 'perf_event__handler_t' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 39/77] perf stat: Move perf_stat_synthesize_config() to stat.c Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 40/77] perf stat: Introduce perf_evlist__print_counters() Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 41/77] perf stat: Move STAT_RECORD out of perf_evlist__print_counters() Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 42/77] perf stat: Add 'struct perf_stat_config' argument to perf_evlist__print_counters() Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 43/77] perf stat: Pass 'struct perf_stat_config' argument to local print functions Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 44/77] perf stat: Pass a 'struct perf_stat_config' argument to global " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 45/77] perf stat: Move csv_* to 'struct perf_stat_config' Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 46/77] perf stat: Move 'interval_clear' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 47/77] perf stat: Move 'metric_only' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 48/77] perf stat: Move 'unit_width' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 49/77] perf stat: Add 'target' argument to perf_evlist__print_counters() Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 50/77] perf stat: Pass 'evlist' argument to print functions Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 51/77] perf stat: Use 'evsel->evlist' instead of 'evsel_list' in collect_all_aliases() Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 52/77] perf stat: Move 'run_count' to 'struct perf_stat_config' Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 53/77] perf stat: Move 'metric_only_len' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 54/77] perf stat: Pass 'struct perf_stat_config' to first_shadow_cpu() Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 55/77] perf stat: Pass 'evlist' to aggr_update_shadow() Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 56/77] perf stat: Add 'walltime_nsecs_stats' pointer to 'struct perf_stat_config' Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 57/77] perf stat: Move 'null_run' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 58/77] perf stat: Move 'print_free_counters_hint' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 59/77] perf stat: Move 'print_mixed_hw_group_error' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 60/77] perf stat: Move ru_* data " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 61/77] perf stat: Move *_aggr_* " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 62/77] perf stat: Do not use the global 'evsel_list' in print functions Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 63/77] perf stat: Move 'big_num' data to 'struct perf_stat_config' Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 64/77] perf stat: Move 'no_merge' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 65/77] perf stat: Propagate 'struct target' arg to sort_aggr_thread() Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 66/77] perf stat: Move 'walltime_*' data to 'struct perf_stat_config' Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 67/77] perf stat: Move 'metric_events' " Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 68/77] perf stat: Move the display functions to stat-display.c Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 69/77] perf trace beauty: Alias 'umount' to 'umount2' Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 70/77] perf annotate: Handle arm64 move instructions Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 71/77] perf augmented_syscalls: Check probe_read_str() return separately Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 72/77] perf augmented_syscalls: Avoid optimization to pass older BPF validators Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 73/77] perf trace: Introduce syscall__augmented_args() method Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 74/77] perf trace: Setup augmented_args in the raw_syscalls:sys_enter handler Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 75/77] perf trace: Use the raw_syscalls:sys_enter for the augmented syscalls Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 76/77] perf map: Turn some pr_warning() to pr_debug() Arnaldo Carvalho de Melo
2018-09-05 22:04 ` [PATCH 77/77] perf tests: Fix record+probe_libc_inet_pton.sh without ping's debuginfo Arnaldo Carvalho de Melo
2018-09-07 12:09 ` Thomas-Mich Richter
2018-09-10 15:19 ` Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180905220440.20256-2-acme@kernel.org \
--to=acme@kernel.org \
--cc=acme@redhat.com \
--cc=adrian.hunter@intel.com \
--cc=dsahern@gmail.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=wangnan0@huawei.com \
--cc=williams@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).