Skip to content

Commit bb6e7cb

Browse files
committed
perf tools: Add fallback for exclude_guest
Commit 7b10098 ("perf evlist: Remove __evlist__add_default") changed to parse "cycles:P" event instead of creating a new cycles event for perf record. But it also changed the way how modifiers are handled so it doesn't set the exclude_guest bit by default. It seems Apple M1 PMU requires exclude_guest set and returns EOPNOTSUPP if not. Let's add a fallback so that it can work with default events. Also update perf stat hybrid tests to handle possible u or H modifiers. Reviewed-by: Ian Rogers <[email protected]> Reviewed-by: James Clark <[email protected]> Reviewed-by: Ravi Bangoria <[email protected]> Acked-by: Kan Liang <[email protected]> Cc: James Clark <[email protected]> Cc: Atish Patra <[email protected]> Cc: Mingwei Zhang <[email protected]> Cc: Kajol Jain <[email protected]> Cc: Thomas Richter <[email protected]> Cc: Palmer Dabbelt <[email protected]> Link: https://lore.kernel.org/r/[email protected] Fixes: 7b10098 ("perf evlist: Remove __evlist__add_default") Signed-off-by: Namhyung Kim <[email protected]>
1 parent 3e2d4df commit bb6e7cb

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

tools/perf/builtin-stat.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -640,8 +640,7 @@ static enum counter_recovery stat_handle_error(struct evsel *counter)
640640
* (behavior changed with commit b0a873e).
641641
*/
642642
if (errno == EINVAL || errno == ENOSYS ||
643-
errno == ENOENT || errno == EOPNOTSUPP ||
644-
errno == ENXIO) {
643+
errno == ENOENT || errno == ENXIO) {
645644
if (verbose > 0)
646645
ui__warning("%s event is not supported by the kernel.\n",
647646
evsel__name(counter));
@@ -659,7 +658,7 @@ static enum counter_recovery stat_handle_error(struct evsel *counter)
659658
if (verbose > 0)
660659
ui__warning("%s\n", msg);
661660
return COUNTER_RETRY;
662-
} else if (target__has_per_thread(&target) &&
661+
} else if (target__has_per_thread(&target) && errno != EOPNOTSUPP &&
663662
evsel_list->core.threads &&
664663
evsel_list->core.threads->err_thread != -1) {
665664
/*
@@ -680,6 +679,19 @@ static enum counter_recovery stat_handle_error(struct evsel *counter)
680679
return COUNTER_SKIP;
681680
}
682681

682+
if (errno == EOPNOTSUPP) {
683+
if (verbose > 0) {
684+
ui__warning("%s event is not supported by the kernel.\n",
685+
evsel__name(counter));
686+
}
687+
counter->supported = false;
688+
counter->errored = true;
689+
690+
if ((evsel__leader(counter) != counter) ||
691+
!(counter->core.leader->nr_members > 1))
692+
return COUNTER_SKIP;
693+
}
694+
683695
evsel__open_strerror(counter, &target, errno, msg, sizeof(msg));
684696
ui__error("%s\n", msg);
685697

tools/perf/tests/shell/stat.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ test_hybrid() {
185185
fi
186186

187187
# Run default Perf stat
188-
cycles_events=$(perf stat -- true 2>&1 | grep -E "/cycles/| cycles " | wc -l)
188+
cycles_events=$(perf stat -- true 2>&1 | grep -E "/cycles/[uH]*| cycles[:uH]* " -c)
189189

190190
if [ "$pmus" -ne "$cycles_events" ]
191191
then

tools/perf/util/evsel.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3156,6 +3156,27 @@ bool evsel__fallback(struct evsel *evsel, struct target *target, int err,
31563156
evsel->core.attr.exclude_kernel = 1;
31573157
evsel->core.attr.exclude_hv = 1;
31583158

3159+
return true;
3160+
} else if (err == EOPNOTSUPP && !evsel->core.attr.exclude_guest &&
3161+
!evsel->exclude_GH) {
3162+
const char *name = evsel__name(evsel);
3163+
char *new_name;
3164+
const char *sep = ":";
3165+
3166+
/* Is there already the separator in the name. */
3167+
if (strchr(name, '/') ||
3168+
(strchr(name, ':') && !evsel->is_libpfm_event))
3169+
sep = "";
3170+
3171+
if (asprintf(&new_name, "%s%sH", name, sep) < 0)
3172+
return false;
3173+
3174+
free(evsel->name);
3175+
evsel->name = new_name;
3176+
/* Apple M1 requires exclude_guest */
3177+
scnprintf(msg, msgsize, "trying to fall back to excluding guest samples");
3178+
evsel->core.attr.exclude_guest = 1;
3179+
31593180
return true;
31603181
}
31613182

0 commit comments

Comments
 (0)