From: Namhyung Kim <namhyung@kernel.org>
To: Ian Rogers <irogers@google.com>
Cc: acme@kernel.org, howardchu95@gmail.com, adrian.hunter@intel.com,
james.clark@linaro.org, jolsa@kernel.org,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
mingo@redhat.com, peterz@infradead.org
Subject: Re: [PATCH v5 07/23] perf trace: Skip internal tracepoint fields in formatting and beauty map
Date: Wed, 23 Sep 2026 23:44:42 -0700 [thread overview]
Message-ID: <arTG2hd1H2ZH4Nl0@z2> (raw)
In-Reply-To: <4315f435177b66e0b25ca9b74a89cc2f51d3801d.1790145937.git.irogers@google.com>
On Wed, Sep 23, 2026 at 12:13:47AM -0700, Ian Rogers wrote:
> Linux 6.19+ added __data_loc char[] internal fields for string
> arguments in syscalls:sys_enter_<name> tracepoints (e.g.,
> __data_loc_oldname in sys_enter_renameat2). While is_internal_field()
> was added to detect them, several places did not properly account for
> them:
>
> 1. In syscall_arg_fmt__init_array(), when an internal field was
> skipped, the arg pointer was still incremented, causing the
> subsequent argument formatters to be mismatched. Leaving the slot out
> is only right for syscall tracepoints, where syscall__scnprintf_args()
> indexes the array the same packed way and sc->nr_args is counted to
> match. Every other tracepoint reaches the array through
> trace__fprintf_tp_fields(), which advances the field list and the
> array in lockstep, and for those a __data_loc char[] is an ordinary
> dynamic string to be shown rather than something the kernel appended
> to a syscall behind perf's back. Add a skip_internal argument so that
> each caller gets the layout it indexes.
> 2. In syscall__scnprintf_args(), internal fields were not skipped,
> causing spurious trailing arguments like ", 0, 16" to be formatted
> and printed.
> 3. In trace__bpf_sys_enter_beauty_map(), internal fields were not
> skipped, offsetting beauty array argument indices and breaking string
> and buffer augmentation.
> 4. In trace__find_usable_bpf_prog_entry(), candidate pointer checks
> matched on internal pointer fields, breaking signature compatibility
> matching between syscalls for augmenter sharing. Introduce
> next_user_arg() and advance both cursors with it, so that the two
> argument lists are always compared at a real argument and the walk
> ends when one syscall runs out of arguments rather than when one
> happens to have trailing internal fields.
> 5. syscall__augmented_args() computed the augmented payload as
> sample->raw_size - sc->args_size for any sys_enter style sample.
> sc->args_size deliberately stops at the last non-internal field, so
> on 6.19+ a native syscalls:sys_enter_<name> record leaves the
> __data_loc words and their string payloads in the remainder. Those
> bytes are not a struct augmented_arg, so
> syscall_arg__scnprintf_augmented_string() read a bogus length and
> walked arg->augmented.args out of bounds. This is reachable from
> trace__event_handler(), which calls trace__fprintf_sys_enter() for
> any evsel whose tracepoint name starts with "sys_enter_".
> 6. In syscall__read_info(), syscall__alloc_arg_fmts() was called before
> checking and dropping the leading __syscall_nr (or nr) field, using
> nr_fields - 1 unconditionally. If a tracepoint format lacks that
> leading field, the allocated arg_fmt array is one entry too small and
> syscall_arg_fmt__init_array() writes one entry past the end of the
> heap buffer. Drop __syscall_nr/nr first and size the allocation from
> the remaining fields.
>
> Update these functions to check and skip is_internal_field() so that
> arguments are correctly formatted and beauty map entries match the
> expected syscall signatures, restrict syscall__augmented_args() to the
> __augmented_syscalls__ bpf-output evsel, and size arg_fmt after dropping
> the syscall number field.
>
> Publish sc->args only once that allocation has succeeded. sc->name is
> set earlier in syscall__read_info(), and a later call takes a syscall
> with a name to have been read already and returns it as it stands, so
> a syscall left with arguments and no arg_fmt to describe them would be
> printed by walking the arguments and indexing an array that was never
> allocated.
>
> Assisted-by: Antigravity:gemini-3.1-pro
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
> tools/perf/builtin-trace.c | 194 ++++++++++++++++++++++++++++---------
> 1 file changed, 148 insertions(+), 46 deletions(-)
>
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index f90c6bb4d8b4..6ffd4a0718ca 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -2276,22 +2276,40 @@ static bool field_is_ptr_sized(const struct tep_format_field *field)
> return field->size == ptr_size || field->size == sizeof(u64);
> }
>
> +/*
> + * @skip_internal: whether an internal field is left out of the array rather
> + * than given a slot of its own.
> + *
> + * Syscall tracepoints want it left out, as syscall__scnprintf_args() walks the
> + * array with an index that skips internal fields too and sc->nr_args is counted
> + * the same way.
> + *
> + * Other tracepoints do not: trace__fprintf_tp_fields() advances the field list
> + * and this array in lockstep, so every field needs a slot or the fields after
> + * an internal one are formatted with the wrong entry. For them a
> + * __data_loc char[] is also an ordinary dynamic string to be shown, rather than
> + * something the kernel appended to a syscall tracepoint behind perf's back.
> + */
Isn't it only called for syscall tracepoints?
> static struct tep_format_field *
> syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field *field,
> - bool *use_btf)
> + bool *use_btf, bool skip_internal)
> {
> struct tep_format_field *last_field = NULL;
> int len;
>
> - for (; field; field = field->next, ++arg) {
> - /* assume it's the last argument */
> - if (is_internal_field(field))
> + for (; field; field = field->next) {
> + if (is_internal_field(field)) {
> + if (!skip_internal)
> + ++arg;
> continue;
If so, it'd be much simpler if we do s/continue/break/ instead. :)
> + }
>
> last_field = field;
>
> - if (arg->scnprintf)
> + if (arg->scnprintf) {
> + ++arg;
> continue;
> + }
>
> len = strlen(field->name);
>
> @@ -2348,6 +2366,7 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field
> }
> }
> }
> + ++arg;
> }
>
> return last_field;
> @@ -2356,7 +2375,8 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field
> static int syscall__set_arg_fmts(struct syscall *sc)
> {
> struct tep_format_field *last_field = syscall_arg_fmt__init_array(sc->arg_fmt, sc->args,
> - &sc->use_btf);
> + &sc->use_btf,
> + /*skip_internal=*/true);
>
> if (last_field)
> sc->args_size = last_field->offset + last_field->size;
> @@ -2368,7 +2388,8 @@ static int syscall__read_info(struct syscall *sc, struct trace *trace)
> {
> char tp_name[128];
> const char *name;
> - struct tep_format_field *field;
> + struct tep_format_field *args, *field;
> + int nr_args;
> int err;
>
> if (sc->nonexistent)
> @@ -2407,24 +2428,35 @@ static int syscall__read_info(struct syscall *sc, struct trace *trace)
> return err;
> }
>
> - /*
> - * The tracepoint format contains __syscall_nr field, so it's one more
> - * than the actual number of syscall arguments.
> - */
> - if (syscall__alloc_arg_fmts(sc, sc->tp_format->format.nr_fields - 1))
> - return -ENOMEM;
> -
> - sc->args = sc->tp_format->format.fields;
> + args = sc->tp_format->format.fields;
> + nr_args = sc->tp_format->format.nr_fields;
> /*
> * We need to check and discard the first variable '__syscall_nr'
> * or 'nr' that mean the syscall number. It is needless here.
> * So drop '__syscall_nr' or 'nr' field but does not exist on older kernels.
> + *
> + * Do this before allocating, and size the array from what is left, so
> + * that a format without the field does not leave
> + * syscall_arg_fmt__init_array() walking one entry past the end.
> */
> - if (sc->args && (!strcmp(sc->args->name, "__syscall_nr") || !strcmp(sc->args->name, "nr"))) {
> - sc->args = sc->args->next;
> - --sc->nr_args;
> + if (args && (!strcmp(args->name, "__syscall_nr") || !strcmp(args->name, "nr"))) {
> + args = args->next;
> + --nr_args;
> }
>
> + if (syscall__alloc_arg_fmts(sc, nr_args))
> + return -ENOMEM;
> +
> + /*
> + * Only now that there is an arg_fmt for each of them are the arguments
> + * published. sc->name was set above, so a later syscall__read_info()
> + * takes this syscall to be read already and returns it as it stands;
> + * were sc->args set with sc->arg_fmt still NULL, the printing of that
> + * syscall would walk the arguments and index an array that does not
> + * exist.
> + */
> + sc->args = args;
> +
I think it's better to split this change. It looks independent to the
skip-internal-fields.
> field = sc->args;
> while (field) {
> if (is_internal_field(field))
> @@ -2452,7 +2484,8 @@ static int evsel__init_tp_arg_scnprintf(struct evsel *evsel, bool *use_btf)
> const struct tep_event *tp_format = evsel__tp_format(evsel);
>
> if (tp_format) {
> - syscall_arg_fmt__init_array(fmt, tp_format->format.fields, use_btf);
> + syscall_arg_fmt__init_array(fmt, tp_format->format.fields, use_btf,
> + /*skip_internal=*/false);
> return 0;
> }
> }
> @@ -2642,10 +2675,16 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
> if (sc->args != NULL) {
> struct tep_format_field *field;
>
> - for (field = sc->args; field;
> - field = field->next, ++arg.idx, bit <<= 1) {
> - if (arg.mask & bit)
> + for (field = sc->args; field; field = field->next) {
> + /* Skip internal fields so they are not printed as spurious arguments */
> + if (is_internal_field(field))
> + continue;
Similarly, it can stop when it's an internal field or arg.idx equals to
sc->nr_args.
> +
> + if (arg.mask & bit) {
> + ++arg.idx;
> + bit <<= 1;
> continue;
> + }
>
> arg.fmt = &sc->arg_fmt[arg.idx];
> val = syscall_arg__val(&arg, arg.idx);
> @@ -2664,8 +2703,11 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
> */
> if (val == 0 && !trace->show_zeros &&
> !(sc->arg_fmt && sc->arg_fmt[arg.idx].show_zero) &&
> - !(sc->arg_fmt && sc->arg_fmt[arg.idx].strtoul == STUL_BTF_TYPE))
> + !(sc->arg_fmt && sc->arg_fmt[arg.idx].strtoul == STUL_BTF_TYPE)) {
> + ++arg.idx;
> + bit <<= 1;
> continue;
> + }
>
> printed += scnprintf(bf + printed, size - printed, "%s", printed ? ", " : "");
>
> @@ -2680,12 +2722,16 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
> size - printed, val, field->type);
> if (btf_printed) {
> printed += btf_printed;
> + ++arg.idx;
> + bit <<= 1;
> continue;
> }
> }
>
> printed += syscall_arg_fmt__scnprintf_val(&sc->arg_fmt[arg.idx],
> bf + printed, size - printed, &arg, val);
> + ++arg.idx;
> + bit <<= 1;
> }
> } else if (IS_ERR(sc->tp_format)) {
> /*
> @@ -2946,7 +2992,9 @@ static int trace__fprintf_sample(struct trace *trace, struct perf_sample *sample
> return printed;
> }
>
> -static void *syscall__augmented_args(struct syscall *sc, struct perf_sample *sample, int *augmented_args_size, int raw_augmented_args_size)
> +static void *syscall__augmented_args(struct trace *trace, struct syscall *sc,
> + struct perf_sample *sample,
> + int *augmented_args_size, int raw_augmented_args_size)
> {
> /*
> * For now with BPF raw_augmented we hook into raw_syscalls:sys_enter
> @@ -2964,6 +3012,24 @@ static void *syscall__augmented_args(struct syscall *sc, struct perf_sample *sam
> */
> int args_size = raw_augmented_args_size ?: sc->args_size;
>
> + /*
> + * Augmented arguments are a perf trace specific payload, they are only
> + * ever appended to samples emitted by the BPF __augmented_syscalls__
> + * bpf-output event.
> + *
> + * Native syscalls:sys_enter_NAME tracepoints may also carry trailing
> + * data of their own: since Linux 6.19 they append __data_loc char[]
> + * fields plus the string payloads they point at. Those bytes are not a
> + * struct augmented_arg, so treating them as one would make
> + * syscall_arg__scnprintf_augmented_string() read a bogus length and
> + * walk arg->augmented.args far out of bounds.
> + *
> + * So only look for augmented arguments on the event that can actually
> + * produce them.
> + */
> + if (sample->evsel != trace->syscalls.events.bpf_output)
> + return NULL;
> +
> *augmented_args_size = sample->raw_size - args_size;
> if (*augmented_args_size > 0) {
> static uintptr_t argbuf[1024]; /* assuming single-threaded */
> @@ -3022,17 +3088,13 @@ static int trace__sys_enter(struct trace *trace,
> if (!(trace->duration_filter || trace->summary_only || trace->min_stack))
> trace__printf_interrupted_entry(trace);
> /*
> - * If this is raw_syscalls.sys_enter, then it always comes with the 6 possible
> - * arguments, even if the syscall being handled, say "openat", uses only 4 arguments
> - * this breaks syscall__augmented_args() check for augmented args, as we calculate
> - * syscall->args_size using each syscalls:sys_enter_NAME tracefs format file,
> - * so when handling, say the openat syscall, we end up getting 6 args for the
> - * raw_syscalls:sys_enter event, when we expected just 4, we end up mistakenly
> - * thinking that the extra 2 u64 args are the augmented filename, so just check
> - * here and avoid using augmented syscalls when the evsel is the raw_syscalls one.
> + * syscall__augmented_args() only returns a payload for the BPF
> + * __augmented_syscalls__ event, so raw_syscalls:sys_enter (which always
> + * carries all 6 possible arguments rather than sc->args_size worth) and
> + * the native syscalls:sys_enter_NAME tracepoints are both handled there.
> */
> - if (evsel != trace->syscalls.events.sys_enter)
> - augmented_args = syscall__augmented_args(sc, sample, &augmented_args_size, trace->raw_augmented_syscalls_args_size);
Looks like an independent fix too.
> + augmented_args = syscall__augmented_args(trace, sc, sample, &augmented_args_size,
> + trace->raw_augmented_syscalls_args_size);
> ttrace->entry_time = sample->time;
> ttrace->entry_cpu = sample->cpu;
> msg = ttrace->entry_str;
> @@ -3077,7 +3139,7 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct perf_sample *sam
> struct syscall *sc;
> char msg[1024];
> void *args, *augmented_args = NULL;
> - int augmented_args_size, e_machine;
> + int augmented_args_size = 0, e_machine;
> size_t printed = 0;
>
>
> @@ -3095,7 +3157,8 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct perf_sample *sam
> goto out_put;
>
> args = perf_evsel__sc_tp_ptr(args, sample);
> - augmented_args = syscall__augmented_args(sc, sample, &augmented_args_size, trace->raw_augmented_syscalls_args_size);
> + augmented_args = syscall__augmented_args(trace, sc, sample, &augmented_args_size,
> + trace->raw_augmented_syscalls_args_size);
> printed += syscall__scnprintf_args(sc, msg, sizeof(msg), args, augmented_args, augmented_args_size, trace, thread);
> fprintf(trace->output, "%.*s", (int)printed, msg);
> err = 0;
> @@ -4127,10 +4190,16 @@ static int trace__bpf_sys_enter_beauty_map(struct trace *trace, int e_machine, i
> if (trace->btf == NULL)
> return -1;
>
> - for (i = 0, field = sc->args; field; ++i, field = field->next) {
> + for (i = 0, field = sc->args; field; field = field->next) {
> + /* Skip internal fields to keep beauty array index aligned with syscall arguments */
> + if (is_internal_field(field))
> + continue;
Ditto. Please just break.
> +
> // XXX We're only collecting pointer payloads _from_ user space
> - if (!sc->arg_fmt[i].from_user)
> + if (!sc->arg_fmt[i].from_user) {
> + ++i;
> continue;
> + }
>
> struct_offset = strstr(field->type, "struct ");
> if (struct_offset == NULL)
> @@ -4149,8 +4218,10 @@ static int trace__bpf_sys_enter_beauty_map(struct trace *trace, int e_machine, i
> 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))
> + if (syscall_arg_fmt__cache_btf_struct(&sc->arg_fmt[i], trace->btf, name)) {
> + ++i;
> continue;
> + }
>
> bt = sc->arg_fmt[i].type;
> beauty_array[i] = bt->size;
> @@ -4176,7 +4247,9 @@ static int trace__bpf_sys_enter_beauty_map(struct trace *trace, int e_machine, i
> 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) {
> + for (j = 0, field_tmp = sc->args; field_tmp; field_tmp = field_tmp->next) {
> + if (is_internal_field(field_tmp))
> + continue;
> if (!(field_tmp->flags & TEP_FIELD_IS_POINTER) && /* only integers */
> (strstr(field_tmp->name, "count") ||
> strstr(field_tmp->name, "siz") || /* size, bufsiz */
> @@ -4186,8 +4259,10 @@ static int trace__bpf_sys_enter_beauty_map(struct trace *trace, int e_machine, i
> can_augment = true;
> break;
> }
> + ++j;
> }
> }
> + ++i;
> }
>
> if (can_augment)
> @@ -4196,6 +4271,19 @@ static int trace__bpf_sys_enter_beauty_map(struct trace *trace, int e_machine, i
> return -1;
> }
>
> +/*
> + * Advance to the first field that is a real syscall argument, so that callers
> + * walking two argument lists in step never have to reason about internal
> + * fields appearing in one list but not the other.
> + */
> +static struct tep_format_field *next_user_arg(struct tep_format_field *field)
> +{
> + while (field && is_internal_field(field))
> + field = field->next;
> +
> + return field;
> +}
I don't think it's necessary. The internal arguments come at the end.
Just stopping at an internal field or counting number of args would be
simpler.
Thanks,
Namhyung
> +
> static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace,
> struct syscall *sc)
> {
> @@ -4203,7 +4291,7 @@ static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace
> /*
> * We're only interested in syscalls that have a pointer:
> */
> - for (field = sc->args; field; field = field->next) {
> + for (field = next_user_arg(sc->args); field; field = next_user_arg(field->next)) {
> if (field->flags & TEP_FIELD_IS_POINTER)
> goto try_to_find_pair;
> }
> @@ -4221,21 +4309,31 @@ static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace
> pair->bpf_prog.sys_enter == unaugmented_prog)
> continue;
>
> - for (field = sc->args, candidate_field = pair->args;
> - field && candidate_field; field = field->next, candidate_field = candidate_field->next) {
> + /*
> + * Both cursors only ever point at real arguments, so the loop
> + * ends when one of the two syscalls runs out of them, rather
> + * than when one happens to have trailing internal fields.
> + */
> + field = next_user_arg(sc->args);
> + candidate_field = next_user_arg(pair->args);
> + while (field && candidate_field) {
> bool is_pointer = field->flags & TEP_FIELD_IS_POINTER,
> candidate_is_pointer = candidate_field->flags & TEP_FIELD_IS_POINTER;
>
> if (is_pointer) {
> - if (!candidate_is_pointer) {
> + if (!candidate_is_pointer) {
> // The candidate just doesn't copies our pointer arg, might copy other pointers we want.
> + field = next_user_arg(field->next);
> + candidate_field = next_user_arg(candidate_field->next);
> continue;
> - }
> + }
> } else {
> if (candidate_is_pointer) {
> // The candidate might copy a pointer we don't have, skip it.
> goto next_candidate;
> }
> + field = next_user_arg(field->next);
> + candidate_field = next_user_arg(candidate_field->next);
> continue;
> }
>
> @@ -4256,6 +4354,8 @@ static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace
> goto next_candidate;
>
> is_candidate = true;
> + field = next_user_arg(field->next);
> + candidate_field = next_user_arg(candidate_field->next);
> }
>
> if (!is_candidate)
> @@ -4267,7 +4367,9 @@ static struct bpf_program *trace__find_usable_bpf_prog_entry(struct trace *trace
> * more than what is common to the two syscalls.
> */
> if (candidate_field) {
> - for (candidate_field = candidate_field->next; candidate_field; candidate_field = candidate_field->next)
> + candidate_field = next_user_arg(candidate_field->next);
> + for (; candidate_field;
> + candidate_field = next_user_arg(candidate_field->next))
> if (candidate_field->flags & TEP_FIELD_IS_POINTER)
> goto next_candidate;
> }
> --
> 2.56.0.rc1.315.gc6ed9934b7-goog
>
next prev parent reply other threads:[~2026-09-24 6:44 UTC|newest]
Thread overview: 96+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-17 6:42 [PATCH v1 00/13] perf trace: Fix BPF filtering and make tracing tests non-exclusive Ian Rogers
2026-09-17 6:42 ` [PATCH v1 01/13] perf trace: Start BPF summary before starting workload Ian Rogers
2026-09-17 6:42 ` [PATCH v1 02/13] perf trace: Skip internal tracepoint fields in formatting and beauty map Ian Rogers
2026-09-17 6:42 ` [PATCH v1 03/13] perf trace: Do not set unaugmented BPF program on sys_exit map Ian Rogers
2026-09-17 6:42 ` [PATCH v1 04/13] perf trace: Filter events in BPF and avoid tracepoint vetoes Ian Rogers
2026-09-17 6:42 ` [PATCH v1 05/13] perf trace: Handle fork and exit directly in BPF filter maps Ian Rogers
2026-09-17 6:42 ` [PATCH v1 06/13] perf test test_task_analyzer: Isolate in temporary directory and make non-exclusive Ian Rogers
2026-09-17 6:42 ` [PATCH v1 07/13] perf test common: Do not globally disable tracing events in clear_all_probes Ian Rogers
2026-09-17 6:42 ` [PATCH v1 08/13] perf test probe_vfs_getname: Scope probe name to PID and make non-exclusive Ian Rogers
2026-09-17 6:42 ` [PATCH v1 09/13] perf test record+probe_libc_inet_pton: Scope event to PID, add retries, " Ian Rogers
2026-09-17 6:42 ` [PATCH v1 10/13] perf test trace_summary: Improve error diagnostics Ian Rogers
2026-09-17 6:42 ` [PATCH v1 11/13] perf test trace_btf_general: Drop --max-events=1 and make non-exclusive Ian Rogers
2026-09-17 6:42 ` [PATCH v1 12/13] perf test trace_summary: Make non-exclusive Ian Rogers
2026-09-17 6:42 ` [PATCH v1 13/13] perf test uprobe_from_different_cu: Scope probe name to PID Ian Rogers
2026-09-17 16:38 ` [PATCH v2 00/14] perf trace: Fix BPF filtering and make tracing tests non-exclusive Ian Rogers
2026-09-17 16:38 ` [PATCH v2 01/14] perf trace: Include the headers declaring pid_t and strcmp Ian Rogers
2026-09-17 16:38 ` [PATCH v2 02/14] perf trace: Start BPF summary before starting workload Ian Rogers
2026-09-17 16:38 ` [PATCH v2 03/14] perf trace: Skip internal tracepoint fields in formatting and beauty map Ian Rogers
2026-09-17 16:38 ` [PATCH v2 04/14] perf trace: Do not set unaugmented BPF program on sys_exit map Ian Rogers
2026-09-17 16:38 ` [PATCH v2 05/14] perf trace: Filter events in BPF and avoid tracepoint vetoes Ian Rogers
2026-09-17 16:38 ` [PATCH v2 06/14] perf trace: Handle fork and exit directly in BPF filter maps Ian Rogers
2026-09-17 16:38 ` [PATCH v2 07/14] perf test test_task_analyzer: Isolate in temporary directory and make non-exclusive Ian Rogers
2026-09-17 16:38 ` [PATCH v2 08/14] perf test common: Do not globally disable tracing events in clear_all_probes Ian Rogers
2026-09-17 16:38 ` [PATCH v2 09/14] perf test probe_vfs_getname: Scope probe name to PID and make non-exclusive Ian Rogers
2026-09-17 16:38 ` [PATCH v2 10/14] perf test record+probe_libc_inet_pton: Scope event to PID, add retries, " Ian Rogers
2026-09-17 16:38 ` [PATCH v2 11/14] perf test trace_summary: Improve error diagnostics Ian Rogers
2026-09-17 16:39 ` [PATCH v2 12/14] perf test trace_btf_general: Drop --max-events=1 and make non-exclusive Ian Rogers
2026-09-17 16:39 ` [PATCH v2 13/14] perf test trace_summary: Make non-exclusive Ian Rogers
2026-09-17 16:39 ` [PATCH v2 14/14] perf test uprobe_from_different_cu: Scope probe name to PID Ian Rogers
2026-09-18 14:06 ` [PATCH v3 00/16] perf trace: Fix BPF filtering and make tracing tests non-exclusive Ian Rogers
2026-09-18 14:06 ` [PATCH v3 01/16] perf trace: Include the headers declaring pid_t, strcmp and assert Ian Rogers
2026-09-18 14:06 ` [PATCH v3 02/16] perf trace: Free the whole evsel_trace in evsel__put_and_free_priv Ian Rogers
2026-09-18 14:06 ` [PATCH v3 03/16] perf trace: Start BPF summary before starting workload Ian Rogers
2026-09-18 14:06 ` [PATCH v3 04/16] perf trace: Skip internal tracepoint fields in formatting and beauty map Ian Rogers
2026-09-18 14:06 ` [PATCH v3 05/16] perf trace: Do not set unaugmented BPF program on sys_exit map Ian Rogers
2026-09-18 14:06 ` [PATCH v3 06/16] perf trace: Filter events in BPF and avoid tracepoint vetoes Ian Rogers
2026-09-18 14:06 ` [PATCH v3 07/16] perf trace: Handle fork and exit directly in BPF filter maps Ian Rogers
2026-09-18 14:06 ` [PATCH v3 08/16] perf trace: Enumerate the target again once BPF is attached Ian Rogers
2026-09-18 14:06 ` [PATCH v3 09/16] perf test test_task_analyzer: Isolate in temporary directory and make non-exclusive Ian Rogers
2026-09-18 14:06 ` [PATCH v3 10/16] perf test common: Only disable probes in clear_all_probes Ian Rogers
2026-09-18 14:06 ` [PATCH v3 11/16] perf test probe_vfs_getname: Scope probe name to PID and make non-exclusive Ian Rogers
2026-09-18 14:06 ` [PATCH v3 12/16] perf test record+probe_libc_inet_pton: Scope event to PID, add retries, " Ian Rogers
2026-09-18 14:06 ` [PATCH v3 13/16] perf test trace_summary: Improve error diagnostics Ian Rogers
2026-09-18 14:06 ` [PATCH v3 14/16] perf test trace_btf_general: Drop --max-events=1 and make non-exclusive Ian Rogers
2026-09-18 14:06 ` [PATCH v3 15/16] perf test trace_summary: Make non-exclusive Ian Rogers
2026-09-18 14:06 ` [PATCH v3 16/16] perf test uprobe_from_different_cu: Scope probe name to PID Ian Rogers
2026-09-18 21:19 ` [PATCH v4 00/18] perf trace: Fix BPF filtering and make tracing tests non-exclusive Ian Rogers
2026-09-18 21:19 ` [PATCH v4 01/18] perf trace: Include the headers declaring pid_t, strcmp and assert Ian Rogers
2026-09-18 21:19 ` [PATCH v4 02/18] perf trace: Free the whole evsel_trace in evsel__put_and_free_priv Ian Rogers
2026-09-18 21:19 ` [PATCH v4 03/18] perf evsel: Report an allocation failure as ENOMEM when setting filters Ian Rogers
2026-09-18 21:19 ` [PATCH v4 04/18] perf trace: Start BPF summary before starting workload Ian Rogers
2026-09-18 21:19 ` [PATCH v4 05/18] perf trace: Skip internal tracepoint fields in formatting and beauty map Ian Rogers
2026-09-18 21:19 ` [PATCH v4 06/18] perf trace: Do not set unaugmented BPF program on sys_exit map Ian Rogers
2026-09-18 21:19 ` [PATCH v4 07/18] perf trace: Filter events in BPF and avoid tracepoint vetoes Ian Rogers
2026-09-18 21:19 ` [PATCH v4 08/18] perf trace: Handle fork and exit directly in BPF filter maps Ian Rogers
2026-09-18 21:19 ` [PATCH v4 09/18] perf trace: Enumerate the target again once BPF is attached Ian Rogers
2026-09-18 21:19 ` [PATCH v4 10/18] perf trace: Drop targets that died before they were filtered Ian Rogers
2026-09-18 21:19 ` [PATCH v4 11/18] perf test test_task_analyzer: Isolate in temporary directory and make non-exclusive Ian Rogers
2026-09-18 21:19 ` [PATCH v4 12/18] perf test common: Only disable probes in clear_all_probes Ian Rogers
2026-09-18 21:19 ` [PATCH v4 13/18] perf test probe_vfs_getname: Scope probe name to PID and make non-exclusive Ian Rogers
2026-09-18 21:19 ` [PATCH v4 14/18] perf test record+probe_libc_inet_pton: Scope event to PID, add retries, " Ian Rogers
2026-09-18 21:19 ` [PATCH v4 15/18] perf test trace_summary: Improve error diagnostics Ian Rogers
2026-09-18 21:19 ` [PATCH v4 16/18] perf test trace_btf_general: Drop --max-events=1 and make non-exclusive Ian Rogers
2026-09-18 21:19 ` [PATCH v4 17/18] perf test trace_summary: Make non-exclusive Ian Rogers
2026-09-18 21:19 ` [PATCH v4 18/18] perf test uprobe_from_different_cu: Scope probe name to PID Ian Rogers
2026-09-22 13:11 ` [PATCH v4 00/18] perf trace: Fix BPF filtering and make tracing tests non-exclusive Arnaldo Carvalho de Melo
2026-09-22 22:43 ` Ian Rogers
2026-09-23 7:13 ` [PATCH v5 00/23] " Ian Rogers
2026-09-23 7:13 ` [PATCH v5 01/23] perf trace: Set the augmented arg header in the augmenters that omit it Ian Rogers
2026-09-24 5:39 ` Namhyung Kim
2026-09-23 7:13 ` [PATCH v5 02/23] perf trace: Include the augmented arg header in nanosleep's payload length Ian Rogers
2026-09-23 7:13 ` [PATCH v5 03/23] perf trace: Include the headers declaring pid_t, strcmp and assert Ian Rogers
2026-09-24 5:44 ` Namhyung Kim
2026-09-23 7:13 ` [PATCH v5 04/23] perf trace: Free the whole evsel_trace in evsel__put_and_free_priv Ian Rogers
2026-09-23 7:13 ` [PATCH v5 05/23] perf evsel: Report an allocation failure as ENOMEM when setting filters Ian Rogers
2026-09-23 7:13 ` [PATCH v5 06/23] perf trace: Start BPF summary before starting workload Ian Rogers
2026-09-23 7:13 ` [PATCH v5 07/23] perf trace: Skip internal tracepoint fields in formatting and beauty map Ian Rogers
2026-09-24 6:44 ` Namhyung Kim [this message]
2026-09-23 7:13 ` [PATCH v5 08/23] perf trace: Bounds check augmented arguments before reading them Ian Rogers
2026-09-24 6:58 ` Namhyung Kim
2026-09-23 7:13 ` [PATCH v5 09/23] perf trace: Bound the fixed size augmented argument beautifiers Ian Rogers
2026-09-23 7:13 ` [PATCH v5 10/23] perf trace: Do not read sample padding as an augmented argument Ian Rogers
2026-09-23 7:13 ` [PATCH v5 11/23] perf trace: Do not set unaugmented BPF program on sys_exit map Ian Rogers
2026-09-23 7:13 ` [PATCH v5 12/23] perf trace: Filter events in BPF and avoid tracepoint vetoes Ian Rogers
2026-09-23 7:13 ` [PATCH v5 13/23] perf trace: Handle fork and exit directly in BPF filter maps Ian Rogers
2026-09-23 7:13 ` [PATCH v5 14/23] perf trace: Enumerate the target again once BPF is attached Ian Rogers
2026-09-23 7:13 ` [PATCH v5 15/23] perf trace: Drop targets that died before they were filtered Ian Rogers
2026-09-23 7:13 ` [PATCH v5 16/23] perf test test_task_analyzer: Isolate in temporary directory and make non-exclusive Ian Rogers
2026-09-23 7:13 ` [PATCH v5 17/23] perf test common: Only disable probes in clear_all_probes Ian Rogers
2026-09-23 7:13 ` [PATCH v5 18/23] perf test probe_vfs_getname: Scope probe name to PID and make non-exclusive Ian Rogers
2026-09-23 7:13 ` [PATCH v5 19/23] perf test record+probe_libc_inet_pton: Scope event to PID, add retries, " Ian Rogers
2026-09-23 7:14 ` [PATCH v5 20/23] perf test trace_summary: Improve error diagnostics Ian Rogers
2026-09-23 7:14 ` [PATCH v5 21/23] perf test trace_btf_general: Drop --max-events=1 and make non-exclusive Ian Rogers
2026-09-23 7:14 ` [PATCH v5 22/23] perf test trace_summary: Make non-exclusive Ian Rogers
2026-09-23 7:14 ` [PATCH v5 23/23] perf test uprobe_from_different_cu: Scope probe name to PID Ian Rogers
2026-09-24 7:05 ` [PATCH v5 00/23] perf trace: Fix BPF filtering and make tracing tests non-exclusive Namhyung Kim
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=arTG2hd1H2ZH4Nl0@z2 \
--to=namhyung@kernel.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=howardchu95@gmail.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®