Commit dcbe6e51 authored by Namhyung Kim's avatar Namhyung Kim
Browse files

perf parse-events: Set default GH modifier properly



Commit 7b100989 ("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: default avatarIan Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250606225431.2109754-1-namhyung@kernel.org


Fixes: 35c8d213 ("perf tools: Don't set attr.exclude_guest by default")
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
parent 588d22b4
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -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;