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

From: Jin, Yao
Date: Wed Aug 12 2020 - 23:11:54 EST


Hi Like,

On 8/12/2020 9:02 PM, Like Xu wrote:
On 2020/8/12 20:15, Arnaldo Carvalho de Melo wrote:
Em Wed, Aug 12, 2020 at 02:59:53PM +0800, Jin Yao escreveu:
Currently if we run 'perf record -e cycles:u', exclude_guest is 0.

But it doesn't make sense that we request for user-space counting
but we also get the guest report.


Please hold the horse and allow this possibility.

Some authorized perf users on the host may
only want to count (KVM) guest user space events.

Thanks,
Like Xu


Without this patch, if we don't set the ":u" modifier, exclude_guest = 1.

perf record -e cycles ./div
perf evlist -v
cycles: size: 120, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|PERIOD, read_format: ID, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1, ksymbol: 1, bpf_event: 1

So this patch doesn't change perf's original behavior.

Thanks
Jin Yao

To keep perf semantics consistent and clear, this patch sets
exclude_guest for user-space counting.

Applied, and also added this, that you should consider doing in the
future (modulo the "Committer testing:" header :) ):

Committer testing:

Before:

   # perf record -e cycles:u
   ^C[ perf record: Woken up 1 times to write data ]
   [ perf record: Captured and wrote 1.231 MB perf.data (91 samples) ]
   #
   # perf evlist -v
   cycles:u: 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
   <SNIP>
   #

After:

   # perf record -e cycles:u
   ^C[ perf record: Woken up 1 times to write data ]
   [ perf record: Captured and wrote 1.263 MB perf.data (403 samples) ]
   #
   # perf evlist -v
   cycles:u: 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, exclude_guest: 1
   #

----

I.e. show actual command output before and after that demonstrates the
problem and then the solution.

Signed-off-by: Jin Yao <yao.jin@xxxxxxxxxxxxxxx>
---
  tools/perf/util/parse-events.c | 2 ++
  1 file changed, 2 insertions(+)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 9f7260e69113..4d809f1fe269 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1794,6 +1794,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)
+                eG = 1;
              eu = 0;
          } else if (*str == 'k') {
              if (!exclude)
--
2.17.1