perf parse-events: Set default GH modifier properly
authorNamhyung Kim <namhyung@kernel.org>
Fri, 6 Jun 2025 22:54:31 +0000 (15:54 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Fri, 20 Jun 2025 20:33:30 +0000 (13:33 -0700)
Commit 7b100989b4f6bce7 ("perf evlist: Remove __evlist__add_default")
changed to use "cycles:P" as a default event.  But the problem is it
cannot set other default modifiers correctly.

perf kvm needs to set attr.exclude_host by default but it didn't work
because of the logic in the parse_events__modifier_list().  Also the
exclude_GH_default was applied only if ":u" modifier was specified -
which is strange.  Move it out after handling the ":GH" and check
perf_host and perf_guest properly.

Before:
  $ ./perf kvm record -vv true |& grep exclude
  (nothing)

But specifying an event (without a modifier) works:

  $ ./perf kvm record -vv -e cycles true |& grep exclude
    exclude_host                     1

After:
It now works for the both cases:

  $ ./perf kvm record -vv true |& grep exclude
    exclude_host                     1

  $ ./perf kvm record -vv -e cycles true |& grep exclude
    exclude_host                     1

Reviewed-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250606225431.2109754-1-namhyung@kernel.org
Fixes: 35c8d21371e9b342 ("perf tools: Don't set attr.exclude_guest by default")
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/util/parse-events.c

index 7f34e602fc080881e6de94b55c004bbab5b9d5f7..d1965a7b97ed6b97148101fb75ff68f136e9fe0d 100644 (file)
@@ -1830,13 +1830,11 @@ static int parse_events__modifier_list(struct parse_events_state *parse_state,
                int eH = group ? evsel->core.attr.exclude_host : 0;
                int eG = group ? evsel->core.attr.exclude_guest : 0;
                int exclude = eu | ek | eh;
-               int exclude_GH = group ? evsel->exclude_GH : 0;
+               int exclude_GH = eG | eH;
 
                if (mod.user) {
                        if (!exclude)
                                exclude = eu = ek = eh = 1;
-                       if (!exclude_GH && !perf_guest && exclude_GH_default)
-                               eG = 1;
                        eu = 0;
                }
                if (mod.kernel) {
@@ -1859,6 +1857,13 @@ static int parse_events__modifier_list(struct parse_events_state *parse_state,
                                exclude_GH = eG = eH = 1;
                        eH = 0;
                }
+               if (!exclude_GH && exclude_GH_default) {
+                       if (perf_host)
+                               eG = 1;
+                       else if (perf_guest)
+                               eH = 1;
+               }
+
                evsel->core.attr.exclude_user   = eu;
                evsel->core.attr.exclude_kernel = ek;
                evsel->core.attr.exclude_hv     = eh;