Re: [PATCH v3] perf parse-events: Set exclude_guest=1 for user-space counting

From: Arnaldo Carvalho de Melo
Date: Fri Aug 14 2020 - 08:47:28 EST


Em Fri, Aug 14, 2020 at 09:21:20AM +0800, Jin Yao escreveu:
> Currently if we run 'perf record -e cycles:u', exclude_guest=0.
>
> But it doesn't make sense in most cases that we request for
> user-space counting but we also get the guest report.
>
> Of course, we also need to consider perf kvm usage case that
> authorized perf users on the host may only want to count guest
> user space events. For example,
>
> perf kvm --guest record -e cycles:u

Ok, probably this works, but what if I want to record guest user samples
without using 'perf kvm'?

Can we have a 'U' modifier, perhaps, for that?

I.e.

perf record -e cycles:uU would not set exclude_host not exclude_guest,
cycles:u excludes guest user, cycles:U excludes host user, would that be
possible?

Anyway, I think that with what we have, your patch makes sense, having a
way to, without using 'perf kvm' still be able to sample the guest can
be done on top. of this.

Xu, can we get your Reviewed-by if this addresses your concerns?

- Arnaldo

> When we have 'exclude_guest=1' for perf kvm usage, we may get
> nothing from guest events.
>
> To keep perf semantics consistent and clear, this patch sets
> exclude_guest=1 for user-space counting but except for perf
> kvm usage.
>
> Before:
> perf record -e cycles:u ./div
> perf evlist -v
> cycles:u: ..., exclude_kernel: 1, exclude_hv: 1, ...
>
> After:
> perf record -e cycles:u ./div
> perf evlist -v
> cycles:u: ..., exclude_kernel: 1, exclude_hv: 1, exclude_guest: 1, ...
>
> Before:
> perf kvm --guest record -e cycles:u -vvv
>
> perf_event_attr:
> size 120
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|ID|CPU|PERIOD
> read_format ID
> disabled 1
> inherit 1
> exclude_kernel 1
> exclude_hv 1
> freq 1
> sample_id_all 1
>
> After:
> perf kvm --guest record -e cycles:u -vvv
>
> perf_event_attr:
> size 120
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|ID|CPU|PERIOD
> read_format ID
> disabled 1
> inherit 1
> exclude_kernel 1
> exclude_hv 1
> freq 1
> sample_id_all 1
>
> For Before/After, exclude_guest are both 0 for perf kvm usage.
>
> perf test 6
> 6: Parse event definition strings : Ok
>
> Signed-off-by: Jin Yao <yao.jin@xxxxxxxxxxxxxxx>
> ---
> v3:
> ---
> For perf kvm, if we have 'exclude_guest=1', we can't get guest
> events. So we don't set 'exclude_guest=1' for perf kvm.
>
> v2:
> ---
> Fix the 'perf test 6' failure.
>
> tools/perf/tests/parse-events.c | 4 ++--
> tools/perf/util/parse-events.c | 3 +++
> 2 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
> index 7f9f87a470c3..aae0fd9045c1 100644
> --- a/tools/perf/tests/parse-events.c
> +++ b/tools/perf/tests/parse-events.c
> @@ -719,7 +719,7 @@ static int test__group2(struct evlist *evlist)
> TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
> TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
> TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
> - TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
> + TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
> TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
> TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
> @@ -842,7 +842,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
> TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
> TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
> TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
> - TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
> + TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
> TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
> TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> index 9f7260e69113..ff4c23d2a0f3 100644
> --- a/tools/perf/util/parse-events.c
> +++ b/tools/perf/util/parse-events.c
> @@ -37,6 +37,7 @@
> #include "util/evsel_config.h"
> #include "util/event.h"
> #include "util/pfm.h"
> +#include "perf.h"
>
> #define MAX_NAME_LEN 100
>
> @@ -1794,6 +1795,8 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
> if (*str == 'u') {
> if (!exclude)
> exclude = eu = ek = eh = 1;
> + if (!exclude_GH && !perf_guest)
> + eG = 1;
> eu = 0;
> } else if (*str == 'k') {
> if (!exclude)
> --
> 2.17.1
>

--

- Arnaldo