From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Blake Jones <blakejones@google.com>
Cc: Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>,
Martin KaFai Lau <martin.lau@linux.dev>,
Eduard Zingerman <eddyz87@gmail.com>, Song Liu <song@kernel.org>,
Yonghong Song <yonghong.song@linux.dev>,
John Fastabend <john.fastabend@gmail.com>,
KP Singh <kpsingh@kernel.org>,
Stanislav Fomichev <sdf@fomichev.me>, Hao Luo <haoluo@google.com>,
Jiri Olsa <jolsa@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Namhyung Kim <namhyung@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
Kan Liang <kan.liang@linux.intel.com>,
Chun-Tse Shao <ctshao@google.com>,
Zhongqiu Han <quic_zhonhan@quicinc.com>,
James Clark <james.clark@linaro.org>,
Charlie Jenkins <charlie@rivosinc.com>,
Andi Kleen <ak@linux.intel.com>,
Dmitry Vyukov <dvyukov@google.com>, Leo Yan <leo.yan@arm.com>,
Yujie Liu <yujie.liu@intel.com>,
Graham Woodward <graham.woodward@arm.com>,
Yicong Yang <yangyicong@hisilicon.com>,
Ben Gainey <ben.gainey@arm.com>,
linux-kernel@vger.kernel.org, bpf@vger.kernel.org,
linux-perf-users@vger.kernel.org
Subject: Re: [PATCH 1/3] perf: add support for printing BTF character arrays as strings
Date: Thu, 22 May 2025 14:42:47 -0300 [thread overview]
Message-ID: <aC9iF4_eASPkPxXd@x1> (raw)
In-Reply-To: <20250521222725.3895192-2-blakejones@google.com>
On Wed, May 21, 2025 at 03:27:23PM -0700, Blake Jones wrote:
> The BTF dumper code currently displays arrays of characters as just that -
> arrays, with each character formatted individually. Sometimes this is what
> makes sense, but it's nice to be able to treat that array as a string.
>
> This change adds a special case to the btf_dump functionality to allow
> arrays of single-byte integer values to be printed as character strings.
> Characters for which isprint() returns false are printed as hex-escaped
> values. This is enabled when the new ".print_strings" is set to 1 in the
> btf_dump_type_data_opts structure.
>
> As an example, here's what it looks like to dump the string "hello" using
> a few different field values for btf_dump_type_data_opts (.compact = 1):
>
> - .print_strings = 0, .skip_names = 0: (char[6])['h','e','l','l','o',]
> - .print_strings = 0, .skip_names = 1: ['h','e','l','l','o',]
> - .print_strings = 1, .skip_names = 0: (char[6])"hello"
> - .print_strings = 1, .skip_names = 1: "hello"
>
> Here's the string "h\xff", dumped with .compact = 1 and .skip_names = 1:
>
> - .print_strings = 0: ['h',-1,]
> - .print_strings = 1: "h\xff"
I'll test this but unsure if this part should go thru the perf tool
tree, perhaps should go, together with some test case, via the libbpf
tree?
- Arnaldo
> Signed-off-by: Blake Jones <blakejones@google.com>
> ---
> tools/lib/bpf/btf.h | 3 ++-
> tools/lib/bpf/btf_dump.c | 51 +++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 52 insertions(+), 2 deletions(-)
>
> diff --git a/tools/lib/bpf/btf.h b/tools/lib/bpf/btf.h
> index 4392451d634b..be8e8e26d245 100644
> --- a/tools/lib/bpf/btf.h
> +++ b/tools/lib/bpf/btf.h
> @@ -326,9 +326,10 @@ struct btf_dump_type_data_opts {
> bool compact; /* no newlines/indentation */
> bool skip_names; /* skip member/type names */
> bool emit_zeroes; /* show 0-valued fields */
> + bool print_strings; /* print char arrays as strings */
> size_t :0;
> };
> -#define btf_dump_type_data_opts__last_field emit_zeroes
> +#define btf_dump_type_data_opts__last_field print_strings
>
> LIBBPF_API int
> btf_dump__dump_type_data(struct btf_dump *d, __u32 id,
> diff --git a/tools/lib/bpf/btf_dump.c b/tools/lib/bpf/btf_dump.c
> index 460c3e57fadb..a07dd5accdd8 100644
> --- a/tools/lib/bpf/btf_dump.c
> +++ b/tools/lib/bpf/btf_dump.c
> @@ -75,6 +75,7 @@ struct btf_dump_data {
> bool is_array_member;
> bool is_array_terminated;
> bool is_array_char;
> + bool print_strings;
> };
>
> struct btf_dump {
> @@ -2028,6 +2029,50 @@ static int btf_dump_var_data(struct btf_dump *d,
> return btf_dump_dump_type_data(d, NULL, t, type_id, data, 0, 0);
> }
>
> +static int btf_dump_string_data(struct btf_dump *d,
> + const struct btf_type *t,
> + __u32 id,
> + const void *data)
> +{
> + const struct btf_array *array = btf_array(t);
> + __u32 i;
> +
> + if (!btf_is_int(skip_mods_and_typedefs(d->btf, array->type, NULL)) ||
> + btf__resolve_size(d->btf, array->type) != 1 ||
> + !d->typed_dump->print_strings) {
> + pr_warn("unexpected %s() call for array type %u\n",
> + __func__, array->type);
> + return -EINVAL;
> + }
> +
> + btf_dump_data_pfx(d);
> + btf_dump_printf(d, "\"");
> +
> + for (i = 0; i < array->nelems; i++, data++) {
> + char c;
> +
> + if (data >= d->typed_dump->data_end)
> + return -E2BIG;
> +
> + c = *(char *)data;
> + if (c == '\0') {
> + /* When printing character arrays as strings, NUL bytes
> + * are always treated as string terminators; they are
> + * never printed.
> + */
> + break;
> + }
> + if (isprint(c))
> + btf_dump_printf(d, "%c", c);
> + else
> + btf_dump_printf(d, "\\x%02x", *(__u8 *)data);
> + }
> +
> + btf_dump_printf(d, "\"");
> +
> + return 0;
> +}
> +
> static int btf_dump_array_data(struct btf_dump *d,
> const struct btf_type *t,
> __u32 id,
> @@ -2055,8 +2100,11 @@ static int btf_dump_array_data(struct btf_dump *d,
> * char arrays, so if size is 1 and element is
> * printable as a char, we'll do that.
> */
> - if (elem_size == 1)
> + if (elem_size == 1) {
> + if (d->typed_dump->print_strings)
> + return btf_dump_string_data(d, t, id, data);
> d->typed_dump->is_array_char = true;
> + }
> }
>
> /* note that we increment depth before calling btf_dump_print() below;
> @@ -2544,6 +2592,7 @@ int btf_dump__dump_type_data(struct btf_dump *d, __u32 id,
> d->typed_dump->compact = OPTS_GET(opts, compact, false);
> d->typed_dump->skip_names = OPTS_GET(opts, skip_names, false);
> d->typed_dump->emit_zeroes = OPTS_GET(opts, emit_zeroes, false);
> + d->typed_dump->print_strings = OPTS_GET(opts, print_strings, false);
>
> ret = btf_dump_dump_type_data(d, NULL, t, id, data, 0, 0);
>
> --
> 2.49.0.1143.g0be31eac6b-goog
next prev parent reply other threads:[~2025-05-22 17:42 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-21 22:27 [PATCH 0/3] perf: generate events for BPF metadata Blake Jones
2025-05-21 22:27 ` [PATCH 1/3] perf: add support for printing BTF character arrays as strings Blake Jones
2025-05-22 17:42 ` Arnaldo Carvalho de Melo [this message]
2025-05-22 18:19 ` Blake Jones
2025-05-29 0:58 ` Blake Jones
2025-05-30 17:40 ` Namhyung Kim
2025-05-31 7:26 ` Blake Jones
2025-06-03 18:23 ` Blake Jones
2025-06-03 18:43 ` Alexei Starovoitov
2025-06-03 19:47 ` Namhyung Kim
2025-05-21 22:27 ` [PATCH 2/3] perf: collect BPF metadata from existing BPF programs Blake Jones
2025-05-29 17:47 ` Ian Rogers
2025-05-29 23:21 ` Blake Jones
2025-05-29 23:23 ` Ian Rogers
2025-06-03 20:15 ` Namhyung Kim
2025-06-03 21:27 ` Blake Jones
2025-06-03 21:44 ` Namhyung Kim
2025-06-03 21:54 ` Blake Jones
2025-06-03 22:09 ` Namhyung Kim
2025-06-03 22:29 ` Blake Jones
2025-06-04 21:40 ` Namhyung Kim
2025-06-04 22:12 ` Arnaldo Carvalho de Melo
2025-06-04 23:04 ` Blake Jones
2025-05-21 22:27 ` [PATCH 3/3] perf: collect BPF metadata from new programs, and display the new event Blake Jones
2025-05-29 18:12 ` Ian Rogers
2025-05-29 23:09 ` Blake Jones
2025-05-29 23:27 ` Ian Rogers
2025-05-29 23:49 ` Blake Jones
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=aC9iF4_eASPkPxXd@x1 \
--to=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=ben.gainey@arm.com \
--cc=blakejones@google.com \
--cc=bpf@vger.kernel.org \
--cc=charlie@rivosinc.com \
--cc=ctshao@google.com \
--cc=daniel@iogearbox.net \
--cc=dvyukov@google.com \
--cc=eddyz87@gmail.com \
--cc=graham.woodward@arm.com \
--cc=haoluo@google.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=kpsingh@kernel.org \
--cc=leo.yan@arm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=martin.lau@linux.dev \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=quic_zhonhan@quicinc.com \
--cc=sdf@fomichev.me \
--cc=song@kernel.org \
--cc=yangyicong@hisilicon.com \
--cc=yonghong.song@linux.dev \
--cc=yujie.liu@intel.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 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.