From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Howard Chu <howardchu95@gmail.com>
Cc: adrian.hunter@intel.com, irogers@google.com, jolsa@kernel.org,
kan.liang@linux.intel.com, namhyung@kernel.org,
linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 03/10] perf trace: Add trace__bpf_sys_enter_beauty_map() to prepare for fetching data in BPF
Date: Thu, 22 Aug 2024 14:49:38 -0300 [thread overview]
Message-ID: <Zsd6MgrCs0ybQ9EW@x1> (raw)
In-Reply-To: <20240815013626.935097-4-howardchu95@gmail.com>
On Thu, Aug 15, 2024 at 09:36:19AM +0800, Howard Chu wrote:
> Set up beauty_map, load it to BPF, in such format: if argument No.3 is a
> struct of size 32 bytes (of syscall number 114) beauty_map[114][2] = 32;
>
> if argument No.3 is a string (of syscall number 114) beauty_map[114][2] =
> 1;
>
> if argument No.3 is a buffer, its size is indicated by argument No.4 (of
> syscall number 114) beauty_map[114][2] = -4; /* -1 ~ -6, we'll read this
> buffer size in BPF */
>
> Signed-off-by: Howard Chu <howardchu95@gmail.com>
> ---
> tools/perf/builtin-trace.c | 106 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 106 insertions(+)
>
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index 97076b962688..e7e8c89d9538 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -113,6 +113,7 @@ struct syscall_arg_fmt {
> bool show_zero;
> #ifdef HAVE_LIBBPF_SUPPORT
> const struct btf_type *type;
> + int type_id; /* used in btf_dump */
> #endif
> };
>
> @@ -926,6 +927,23 @@ static void syscall_arg_fmt__cache_btf_enum(struct syscall_arg_fmt *arg_fmt, str
> arg_fmt->type = btf__type_by_id(btf, id);
> }
>
> +static int syscall_arg_fmt__cache_btf_struct(struct syscall_arg_fmt *arg_fmt, struct btf *btf, char *type)
> +{
> + int id;
> +
> + if (arg_fmt->type != NULL)
> + return -1;
> +
> + id = btf__find_by_name(btf, type);
> + if (id < 0)
> + return -1;
> +
> + arg_fmt->type = btf__type_by_id(btf, id);
> + arg_fmt->type_id = id;
> +
> + return 0;
> +}
> +
> static bool syscall_arg__strtoul_btf_enum(char *bf, size_t size, struct syscall_arg *arg, u64 *val)
> {
> const struct btf_type *bt = arg->fmt->type;
> @@ -3520,6 +3538,83 @@ static int trace__bpf_prog_sys_exit_fd(struct trace *trace, int id)
> return sc ? bpf_program__fd(sc->bpf_prog.sys_exit) : bpf_program__fd(trace->skel->progs.syscall_unaugmented);
> }
>
> +static int trace__bpf_sys_enter_beauty_map(struct trace *trace, int key, unsigned int *beauty_array)
> +{
> + struct tep_format_field *field;
> + struct syscall *sc = trace__syscall_info(trace, NULL, key);
> + const struct btf_type *bt;
> + char *struct_offset, *tmp, name[32];
> + bool can_augment = false;
> + int i, cnt;
> +
> + if (sc == NULL)
> + return -1;
> +
> + trace__load_vmlinux_btf(trace);
> + if (trace->btf == NULL)
> + return -1;
> +
> + for (i = 0, field = sc->args; field; ++i, field = field->next) {
> + struct_offset = strstr(field->type, "struct ");
> +
> + if (field->flags & TEP_FIELD_IS_POINTER && struct_offset) { /* struct */
> + struct_offset += 7;
> +
> + /* for 'struct foo *', we only want 'foo' */
> + for (tmp = struct_offset, cnt = 0; *tmp != ' ' && *tmp != '\0'; ++tmp, ++cnt) {
> + }
> +
> + strncpy(name, struct_offset, cnt);
> + name[cnt] = '\0';
> +
> + /* cache struct's btf_type and type_id */
> + if (syscall_arg_fmt__cache_btf_struct(&sc->arg_fmt[i], trace->btf, name))
> + continue;
> +
> + bt = sc->arg_fmt[i].type;
> + beauty_array[i] = bt->size;
> + can_augment = true;
> + } else if (field->flags & TEP_FIELD_IS_POINTER && /* string */
> + strcmp(field->type, "const char *") == 0 &&
> + (strstr(field->name, "name") ||
> + strstr(field->name, "path") ||
> + strstr(field->name, "file") ||
> + strstr(field->name, "root") ||
> + strstr(field->name, "key") ||
> + strstr(field->name, "special") ||
> + strstr(field->name, "type") ||
> + strstr(field->name, "description"))) {
> + beauty_array[i] = 1;
> + can_augment = true;
> + } else if (field->flags & TEP_FIELD_IS_POINTER && /* buffer */
> + strstr(field->type, "char *") &&
> + (strstr(field->name, "buf") ||
> + strstr(field->name, "val") ||
> + strstr(field->name, "msg"))) {
> + int j;
> + struct tep_format_field *field_tmp;
> +
> + /* find the size of the buffer that appears in pairs with buf */
> + for (j = 0, field_tmp = sc->args; field_tmp; ++j, field_tmp = field_tmp->next) {
> + if (!(field_tmp->flags & TEP_FIELD_IS_POINTER) && /* only integers */
> + (strstr(field_tmp->name, "count") ||
> + strstr(field_tmp->name, "siz") || /* size, bufsiz */
> + (strstr(field_tmp->name, "len") && strcmp(field_tmp->name, "filename")))) {
> + /* filename's got 'len' in it, we don't want that */
> + beauty_array[i] = -(j + 1);
> + can_augment = true;
> + break;
> + }
> + }
> + }
> + }
> +
> + if (can_augment)
> + return 0;
> +
> + return -1;
> +}
> +
> static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace, struct syscall *sc)
> {
> struct tep_format_field *field, *candidate_field;
> @@ -3624,7 +3719,9 @@ static int trace__init_syscalls_bpf_prog_array_maps(struct trace *trace)
> {
> int map_enter_fd = bpf_map__fd(trace->skel->maps.syscalls_sys_enter);
> int map_exit_fd = bpf_map__fd(trace->skel->maps.syscalls_sys_exit);
> + int beauty_map_fd = bpf_map__fd(trace->skel->maps.beauty_map_enter);
At this point we still don't have that, right? I.e. building with this
patch, without the ones following it in your series, I get:
builtin-trace.c: In function ‘trace__init_syscalls_bpf_prog_array_maps’:
builtin-trace.c:3723:58: error: ‘struct <anonymous>’ has no member named ‘beauty_map_enter’
3723 | int beauty_map_fd = bpf_map__fd(trace->skel->maps.beauty_map_enter);
| ^
CC /tmp/build/perf-tools-next/tests/code-reading.o
CC /tmp/build/perf-tools-next/trace/beauty/clone.o
make[3]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:105: /tmp/build/perf-tools-next/builtin-trace.o] Error 1
make[3]: *** Waiting for unfinished jobs....
So we need to squash the patch that introduces beauty_map_enter in the
augmented_raw_syscalls.bpf.c file to this one, so that we keep things
bisectable, I'll try to do that.
- Arnaldo
next prev parent reply other threads:[~2024-08-22 17:49 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-15 1:36 [PATCH v2 00/10] perf trace: Enhanced augmentation for pointer arguments Howard Chu
2024-08-15 1:36 ` [PATCH v2 01/10] perf trace: Fix perf trace -p <PID> Howard Chu
2024-08-15 18:28 ` Ian Rogers
2024-08-16 14:52 ` Arnaldo Carvalho de Melo
2024-08-16 17:25 ` Howard Chu
2024-08-15 1:36 ` [PATCH v2 02/10] perf trace: Change some comments Howard Chu
2024-08-16 14:58 ` Arnaldo Carvalho de Melo
2024-08-15 1:36 ` [PATCH v2 03/10] perf trace: Add trace__bpf_sys_enter_beauty_map() to prepare for fetching data in BPF Howard Chu
2024-08-22 17:49 ` Arnaldo Carvalho de Melo [this message]
2024-08-22 17:53 ` Arnaldo Carvalho de Melo
2024-08-22 21:09 ` Arnaldo Carvalho de Melo
2024-08-23 4:09 ` Howard Chu
2024-08-15 1:36 ` [PATCH v2 04/10] perf trace: Add some string arguments' name in syscall_arg_fmt__init_array() Howard Chu
2024-08-22 22:14 ` Arnaldo Carvalho de Melo
2024-08-23 4:37 ` Howard Chu
2024-08-23 13:17 ` Arnaldo Carvalho de Melo
2024-08-15 1:36 ` [PATCH v2 05/10] perf trace: Add a new argument to trace__btf_scnprintf() Howard Chu
2024-08-22 18:00 ` Arnaldo Carvalho de Melo
2024-08-22 18:13 ` Arnaldo Carvalho de Melo
2024-08-23 4:05 ` Howard Chu
2024-08-15 1:36 ` [PATCH v2 06/10] perf trace: Pretty print struct data Howard Chu
2024-08-23 12:41 ` Arnaldo Carvalho de Melo
2024-08-23 13:15 ` Arnaldo Carvalho de Melo
2024-08-15 1:36 ` [PATCH v2 07/10] perf trace: Pretty print buffer data Howard Chu
2024-08-23 14:17 ` Arnaldo Carvalho de Melo
2024-08-15 1:36 ` [PATCH v2 08/10] perf trace: Add pids_allowed and rename pids_filtered Howard Chu
2024-08-15 1:36 ` [PATCH v2 09/10] perf trace: Collect augmented data using BPF Howard Chu
2024-08-23 13:24 ` Arnaldo Carvalho de Melo
2024-08-23 13:38 ` Arnaldo Carvalho de Melo
2024-08-23 13:42 ` Arnaldo Carvalho de Melo
2024-08-23 14:23 ` Arnaldo Carvalho de Melo
2024-08-15 1:36 ` [PATCH v2 10/10] perf trace: Add general tests for augmented syscalls Howard Chu
2024-08-16 3:15 ` Ian Rogers
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=Zsd6MgrCs0ybQ9EW@x1 \
--to=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=howardchu95@gmail.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=namhyung@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.