All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com>
To: Alexey Budankov <alexey.budankov@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@kernel.org>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>, Andi Kleen <ak@linux.intel.com>,
	linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v4] perf record: collect user registers set jointly with dwarf stacks
Date: Wed, 29 May 2019 16:25:06 -0300	[thread overview]
Message-ID: <20190529192506.GB5553@kernel.org> (raw)
In-Reply-To: <01a322ee-c99d-0bb7-b7cf-bc1fa8064d75@linux.intel.com>

Em Wed, May 29, 2019 at 05:30:49PM +0300, Alexey Budankov escreveu:
> 
> When dwarf stacks are collected jointly with user specified register
> set using --user-regs option like below the full register context is
> still captured on a sample:
> 
>   $ perf record -g --call-graph dwarf,1024 --user-regs=IP,SP,BP -- stack_test2.g.O3
> 
>   188143843893585 0x6b48 [0x4f8]: PERF_RECORD_SAMPLE(IP, 0x4002): 23828/23828: 0x401236 period: 1363819 addr: 0x7ffedbdd51ac
>   ... FP chain: nr:0
>   ... user regs: mask 0xff0fff ABI 64-bit
>   .... AX    0x53b
>   .... BX    0x7ffedbdd3cc0
>   .... CX    0xffffffff
>   .... DX    0x33d3a
>   .... SI    0x7f09b74c38d0
>   .... DI    0x0
>   .... BP    0x401260
>   .... SP    0x7ffedbdd3cc0
>   .... IP    0x401236
>   .... FLAGS 0x20a
>   .... CS    0x33
>   .... SS    0x2b
>   .... R8    0x7f09b74c3800
>   .... R9    0x7f09b74c2da0
>   .... R10   0xfffffffffffff3ce
>   .... R11   0x246
>   .... R12   0x401070
>   .... R13   0x7ffedbdd5db0
>   .... R14   0x0
>   .... R15   0x0
>   ... ustack: size 1024, offset 0xe0
>    . data_src: 0x5080021
>    ... thread: stack_test2.g.O:23828
>    ...... dso: /root/abudanko/stacks/stack_test2.g.O3
> 
> After applying the change suggested in the patch the sample data contain
> only user specified register values. IP and SP registers (dwarf_regs)
> are collected anyways regardless of the --user-regs option value provided
> from the command line:
> 
>   -g call-graph dwarf,K                         full_regs
>   -g call-graph dwarf,K --user-regs=user_regs	user_regs + dwarf_regs
>   --user-regs=user_regs                         user_regs
> 
>   $ perf record -g --call-graph dwarf,1024 --user-regs=BP -- ls
>   WARNING: specified --user-regs register set doesn't include registers needed by also specified --call-graph=dwarf, auto adding IP, SP registers.
>   arch   COPYING	Documentation  include	Kbuild	 lbuild    MAINTAINERS	modules.builtin		 Module.symvers  perf.data.old	scripts   System.map  virt
>   block  CREDITS	drivers        init	Kconfig  lib	   Makefile	modules.builtin.modinfo  net		 README		security  tools       vmlinux
>   certs  crypto	fs	       ipc	kernel	 LICENSES  mm		modules.order		 perf.data	 samples	sound	  usr	      vmlinux.o
>   [ perf record: Woken up 1 times to write data ]
>   [ perf record: Captured and wrote 0.030 MB perf.data (10 samples) ]
> 
>   188368474305373 0x5e40 [0x470]: PERF_RECORD_SAMPLE(IP, 0x4002): 23839/23839: 0x401236 period: 1260507 addr: 0x7ffd3d85e96c
>   ... FP chain: nr:0
>   ... user regs: mask 0x1c0 ABI 64-bit
>   .... BP    0x401260
>   .... SP    0x7ffd3d85cc20
>   .... IP    0x401236
>   ... ustack: size 1024, offset 0x58
>    . data_src: 0x5080021
> 
> Signed-off-by: Alexey Budankov <alexey.budankov@linux.intel.com>
> ---
> Changes in v4:
> - added warning message about dwarf registers unconditionally 
>   included into the collected registers set
> 
> Changes in v3:
> - avoid changes in platform specific header files
> 
> Changes in v2:
> - implemented dwarf register set to avoid corrupted trace 
>   when --user-regs option value omits IP,SP
> 
> ---
>  tools/perf/util/evsel.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index a6f572a40deb..426dfefeecda 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -669,6 +669,9 @@ int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size)
>  	return ret;
>  }
>  
> +#define DWARF_REGS_MASK ((1ULL << PERF_REG_IP) | \
> +			 (1ULL << PERF_REG_SP))
> +
>  static void __perf_evsel__config_callchain(struct perf_evsel *evsel,
>  					   struct record_opts *opts,
>  					   struct callchain_param *param)
> @@ -702,7 +705,13 @@ static void __perf_evsel__config_callchain(struct perf_evsel *evsel,
>  		if (!function) {
>  			perf_evsel__set_sample_bit(evsel, REGS_USER);
>  			perf_evsel__set_sample_bit(evsel, STACK_USER);
> -			attr->sample_regs_user |= PERF_REGS_MASK;
> +			if (opts->sample_user_regs) {

Where are you checking that opts->sample_user_regs doesn't have either
IP or SP?

So, __perf_evsel__config_callchain its the routine that sets up the
attr->sample_regs_user when callchains are asked for, and what was it
doing? Asking for _all_ user regs, right?

I.e. what you're saying is that when --callgraph-dwarf is asked for,
then only IP and BP are needed, and we should stop doing that, so that
would be a first patch, if that is the case. I.e. a patch that doesn't
even mention opts->sample_user_regs.

Then, a second patch would fix the opt->sample_user_regs request clash
with --callgraph dwarf, i.e. it would do something like:

	      if ((opts->sample_regs_user & DWARF_REGS_MASK) != DWARF_REGS_MASK) {
	      		char * ip = (opts->sample_regs_user & (1ULL << PERF_REG_IP)) ? NULL : "IP",
	      		     * sp = (opts->sample_regs_user & (1ULL << PERF_REG_SP)) ? NULL : "SP",
			     * all = (!ip && !sp) ?  "s" : "";

			pr_warning("WARNING: specified --user-regs register set doesn't include register%s "
				   "needed by also specified --call-graph=dwarf, auto adding %s%s%s register%s.\n",
				   all, ip, all : ", " : "", sp, all);
		}

This if and only if all the registers that are needed to do DWARF
unwinding are just IP and BP, which doesn't look like its true, since
when no --user_regs is set (i.e. opts->user_regs is not set) then we
continue asking for PERF_REGS_MASK...

Can you check where I'm missing something?

Jiri DWARF unwind uses just IP and SP? Looking at
tools/perf/util/unwind-libunwind-local.c's access_reg() I don't think
so, right?

- Arnaldo

> +				attr->sample_regs_user |= DWARF_REGS_MASK;
> +				pr_warning("WARNING: specified --user-regs register set doesn't include registers "
> +					   "needed by also specified --call-graph=dwarf, auto adding IP, SP registers.\n");
> +			} else {
> +				attr->sample_regs_user |= PERF_REGS_MASK;
> +			}
>  			attr->sample_stack_user = param->dump_size;
>  			attr->exclude_callchain_user = 1;
>  		} else {
> -- 
> 2.20.1

-- 

- Arnaldo

  reply	other threads:[~2019-05-29 19:25 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-29 14:30 [PATCH v4] perf record: collect user registers set jointly with dwarf stacks Alexey Budankov
2019-05-29 19:25 ` Arnaldo Carvalho de Melo [this message]
2019-05-30  8:24   ` Alexey Budankov
2019-05-30 13:13     ` Arnaldo Carvalho de Melo
2019-05-30 16:24       ` Alexey Budankov
2019-05-30 18:04         ` Arnaldo Carvalho de Melo
2019-05-30 18:15           ` Alexey Budankov
  -- strict thread matches above, loose matches on Subject: below --
2019-05-23 11:20 Alexey Budankov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190529192506.GB5553@kernel.org \
    --to=arnaldo.melo@gmail.com \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=alexey.budankov@linux.intel.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.