Re: [PATCH v1 4/6] perf auxtrace: Iterate all AUX events when finish reading

From: Adrian Hunter
Date: Mon Jul 22 2024 - 07:14:05 EST


On 21/07/24 23:21, Leo Yan wrote:
> When finished to read AUX trace data from mmaped buffer, based on the
> AUX buffer index the core layer needs to search the corresponding PMU
> event and re-enable it to continue tracing.
>
> However, current code only searches the first AUX event. It misses to
> search other enabled AUX events, thus, it returns failure if the buffer
> index does not belong to the first AUX event.
>
> This patch extends the auxtrace_record__read_finish() function to
> search for every enabled AUX events, so all the mmaped buffer indexes
> can be covered.
>
> Signed-off-by: Leo Yan <leo.yan@xxxxxxx>
> ---
> tools/perf/util/auxtrace.c | 15 +++++++++++----
> 1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
> index e2f317063eec..95be330d7e10 100644
> --- a/tools/perf/util/auxtrace.c
> +++ b/tools/perf/util/auxtrace.c
> @@ -670,18 +670,25 @@ static int evlist__enable_event_idx(struct evlist *evlist, struct evsel *evsel,
> int auxtrace_record__read_finish(struct auxtrace_record *itr, int idx)
> {
> struct evsel *evsel;
> + int ret = -EINVAL;
>
> if (!itr->evlist || !itr->pmu)
> return -EINVAL;
>
> evlist__for_each_entry(itr->evlist, evsel) {
> - if (evsel->core.attr.type == itr->pmu->type) {
> + if (evsel__is_aux_event(evsel)) {

If the type is the same, then there is no need to
change the logic here?

Otherwise, maybe that should be a separate patch

> if (evsel->disabled)
> - return 0;
> - return evlist__enable_event_idx(itr->evlist, evsel, idx);
> + continue;
> + ret = evlist__enable_event_idx(itr->evlist, evsel, idx);
> + if (ret >= 0)

Should this be:

if (ret < 0)

> + return ret;

And will need a common error path for the pr_err() below.

> }
> }
> - return -EINVAL;
> +
> + if (ret < 0)
> + pr_err("Failed to event enable event (idx=%d): %d\n", idx, ret);
> +
> + return ret;
> }
>
> /*