linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] perf record: Add support to collect callchains from kernel or user space only.
@ 2019-05-30 13:29 ufo19890607
  2019-06-06  6:05 ` 禹舟键
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: ufo19890607 @ 2019-05-30 13:29 UTC (permalink / raw)
  To: peterz, mingo, alexander.shishkin, jolsa, dsahern, namhyung,
	milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter, wangnan0
  Cc: linux-perf-users, linux-kernel, acme

From: yuzhoujian <yuzhoujian@didichuxing.com>

One can just record callchains in the kernel or user space with
this new options. We can use it together with "--all-kernel" options.
This two options is used just like print_stack(sys) or print_ustack(usr)
for systemtap.

Show below is the usage of this new option combined with "--all-kernel"
options.
	1. Configure all used events to run in kernel space and just
collect kernel callchains.
	$ perf record -a -g --all-kernel --kernel-callchains
	2. Configure all used events to run in kernel space and just
collect user callchains.
	$ perf record -a -g --all-kernel --user-callchains

Signed-off-by: yuzhoujian <yuzhoujian@didichuxing.com>
---
 tools/perf/Documentation/perf-record.txt | 6 ++++++
 tools/perf/builtin-record.c              | 4 ++++
 tools/perf/perf.h                        | 2 ++
 tools/perf/util/evsel.c                  | 4 ++++
 4 files changed, 16 insertions(+)

diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
index de269430720a..b647eb3db0c6 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -490,6 +490,12 @@ Configure all used events to run in kernel space.
 --all-user::
 Configure all used events to run in user space.
 
+--kernel-callchains::
+Collect callchains from kernel space.
+
+--user-callchains::
+Collect callchains from user space.
+
 --timestamp-filename
 Append timestamp to output file name.
 
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index e2c3a585a61e..dca55997934e 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -2191,6 +2191,10 @@ static struct option __record_options[] = {
 	OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user,
 			 "Configure all used events to run in user space.",
 			 PARSE_OPT_EXCLUSIVE),
+	OPT_BOOLEAN(0, "kernel-callchains", &record.opts.kernel_callchains,
+		    "collect kernel callchains"),
+	OPT_BOOLEAN(0, "user-callchains", &record.opts.user_callchains,
+		    "collect user callchains"),
 	OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
 		   "clang binary to use for compiling BPF scriptlets"),
 	OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index d59dee61b64d..711e009381ec 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -61,6 +61,8 @@ struct record_opts {
 	bool	     record_switch_events;
 	bool	     all_kernel;
 	bool	     all_user;
+	bool	     kernel_callchains;
+	bool	     user_callchains;
 	bool	     tail_synthesize;
 	bool	     overwrite;
 	bool	     ignore_missing_thread;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index a6f572a40deb..a606b2833e27 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -680,6 +680,10 @@ static void __perf_evsel__config_callchain(struct perf_evsel *evsel,
 
 	attr->sample_max_stack = param->max_stack;
 
+	if (opts->kernel_callchains)
+		attr->exclude_callchain_user = 1;
+	if (opts->user_callchains)
+		attr->exclude_callchain_kernel = 1;
 	if (param->record_mode == CALLCHAIN_LBR) {
 		if (!opts->branch_stack) {
 			if (attr->exclude_user) {
-- 
2.14.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] perf record: Add support to collect callchains from kernel or user space only.
  2019-05-30 13:29 [PATCH] perf record: Add support to collect callchains from kernel or user space only ufo19890607
@ 2019-06-06  6:05 ` 禹舟键
  2019-06-06  7:25 ` Jiri Olsa
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 9+ messages in thread
From: 禹舟键 @ 2019-06-06  6:05 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Alexander Shishkin, Jiri Olsa,
	David Ahern, Namhyung Kim, Milian Wolff,
	Arnaldo Carvalho de Melo, Wind Yu, Adrian Hunter, Wang Nan
  Cc: linux-perf-users, linux-kernel, acme

PING


ufo19890607 <ufo19890607@gmail.com> 于2019年5月30日周四 下午9:29写道:
>
> From: yuzhoujian <yuzhoujian@didichuxing.com>
>
> One can just record callchains in the kernel or user space with
> this new options. We can use it together with "--all-kernel" options.
> This two options is used just like print_stack(sys) or print_ustack(usr)
> for systemtap.
>
> Show below is the usage of this new option combined with "--all-kernel"
> options.
>         1. Configure all used events to run in kernel space and just
> collect kernel callchains.
>         $ perf record -a -g --all-kernel --kernel-callchains
>         2. Configure all used events to run in kernel space and just
> collect user callchains.
>         $ perf record -a -g --all-kernel --user-callchains
>
> Signed-off-by: yuzhoujian <yuzhoujian@didichuxing.com>
> ---
>  tools/perf/Documentation/perf-record.txt | 6 ++++++
>  tools/perf/builtin-record.c              | 4 ++++
>  tools/perf/perf.h                        | 2 ++
>  tools/perf/util/evsel.c                  | 4 ++++
>  4 files changed, 16 insertions(+)
>
> diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
> index de269430720a..b647eb3db0c6 100644
> --- a/tools/perf/Documentation/perf-record.txt
> +++ b/tools/perf/Documentation/perf-record.txt
> @@ -490,6 +490,12 @@ Configure all used events to run in kernel space.
>  --all-user::
>  Configure all used events to run in user space.
>
> +--kernel-callchains::
> +Collect callchains from kernel space.
> +
> +--user-callchains::
> +Collect callchains from user space.
> +
>  --timestamp-filename
>  Append timestamp to output file name.
>
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index e2c3a585a61e..dca55997934e 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -2191,6 +2191,10 @@ static struct option __record_options[] = {
>         OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user,
>                          "Configure all used events to run in user space.",
>                          PARSE_OPT_EXCLUSIVE),
> +       OPT_BOOLEAN(0, "kernel-callchains", &record.opts.kernel_callchains,
> +                   "collect kernel callchains"),
> +       OPT_BOOLEAN(0, "user-callchains", &record.opts.user_callchains,
> +                   "collect user callchains"),
>         OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
>                    "clang binary to use for compiling BPF scriptlets"),
>         OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
> diff --git a/tools/perf/perf.h b/tools/perf/perf.h
> index d59dee61b64d..711e009381ec 100644
> --- a/tools/perf/perf.h
> +++ b/tools/perf/perf.h
> @@ -61,6 +61,8 @@ struct record_opts {
>         bool         record_switch_events;
>         bool         all_kernel;
>         bool         all_user;
> +       bool         kernel_callchains;
> +       bool         user_callchains;
>         bool         tail_synthesize;
>         bool         overwrite;
>         bool         ignore_missing_thread;
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index a6f572a40deb..a606b2833e27 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -680,6 +680,10 @@ static void __perf_evsel__config_callchain(struct perf_evsel *evsel,
>
>         attr->sample_max_stack = param->max_stack;
>
> +       if (opts->kernel_callchains)
> +               attr->exclude_callchain_user = 1;
> +       if (opts->user_callchains)
> +               attr->exclude_callchain_kernel = 1;
>         if (param->record_mode == CALLCHAIN_LBR) {
>                 if (!opts->branch_stack) {
>                         if (attr->exclude_user) {
> --
> 2.14.1
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] perf record: Add support to collect callchains from kernel or user space only.
  2019-05-30 13:29 [PATCH] perf record: Add support to collect callchains from kernel or user space only ufo19890607
  2019-06-06  6:05 ` 禹舟键
@ 2019-06-06  7:25 ` Jiri Olsa
  2019-06-06 14:26 ` Arnaldo Carvalho de Melo
  2019-06-17 19:18 ` [tip:perf/core] " tip-bot for yuzhoujian
  3 siblings, 0 replies; 9+ messages in thread
From: Jiri Olsa @ 2019-06-06  7:25 UTC (permalink / raw)
  To: ufo19890607
  Cc: peterz, mingo, alexander.shishkin, jolsa, dsahern, namhyung,
	milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter, wangnan0,
	linux-perf-users, linux-kernel, acme

On Thu, May 30, 2019 at 02:29:22PM +0100, ufo19890607 wrote:
> From: yuzhoujian <yuzhoujian@didichuxing.com>
> 
> One can just record callchains in the kernel or user space with
> this new options. We can use it together with "--all-kernel" options.
> This two options is used just like print_stack(sys) or print_ustack(usr)
> for systemtap.
> 
> Show below is the usage of this new option combined with "--all-kernel"
> options.
> 	1. Configure all used events to run in kernel space and just
> collect kernel callchains.
> 	$ perf record -a -g --all-kernel --kernel-callchains
> 	2. Configure all used events to run in kernel space and just
> collect user callchains.
> 	$ perf record -a -g --all-kernel --user-callchains
> 
> Signed-off-by: yuzhoujian <yuzhoujian@didichuxing.com>

Acked-by: Jiri Olsa <jolsa@kernel.org>

thanks,
jirka


> ---
>  tools/perf/Documentation/perf-record.txt | 6 ++++++
>  tools/perf/builtin-record.c              | 4 ++++
>  tools/perf/perf.h                        | 2 ++
>  tools/perf/util/evsel.c                  | 4 ++++
>  4 files changed, 16 insertions(+)
> 
> diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
> index de269430720a..b647eb3db0c6 100644
> --- a/tools/perf/Documentation/perf-record.txt
> +++ b/tools/perf/Documentation/perf-record.txt
> @@ -490,6 +490,12 @@ Configure all used events to run in kernel space.
>  --all-user::
>  Configure all used events to run in user space.
>  
> +--kernel-callchains::
> +Collect callchains from kernel space.
> +
> +--user-callchains::
> +Collect callchains from user space.
> +
>  --timestamp-filename
>  Append timestamp to output file name.
>  
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index e2c3a585a61e..dca55997934e 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -2191,6 +2191,10 @@ static struct option __record_options[] = {
>  	OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user,
>  			 "Configure all used events to run in user space.",
>  			 PARSE_OPT_EXCLUSIVE),
> +	OPT_BOOLEAN(0, "kernel-callchains", &record.opts.kernel_callchains,
> +		    "collect kernel callchains"),
> +	OPT_BOOLEAN(0, "user-callchains", &record.opts.user_callchains,
> +		    "collect user callchains"),
>  	OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
>  		   "clang binary to use for compiling BPF scriptlets"),
>  	OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
> diff --git a/tools/perf/perf.h b/tools/perf/perf.h
> index d59dee61b64d..711e009381ec 100644
> --- a/tools/perf/perf.h
> +++ b/tools/perf/perf.h
> @@ -61,6 +61,8 @@ struct record_opts {
>  	bool	     record_switch_events;
>  	bool	     all_kernel;
>  	bool	     all_user;
> +	bool	     kernel_callchains;
> +	bool	     user_callchains;
>  	bool	     tail_synthesize;
>  	bool	     overwrite;
>  	bool	     ignore_missing_thread;
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index a6f572a40deb..a606b2833e27 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -680,6 +680,10 @@ static void __perf_evsel__config_callchain(struct perf_evsel *evsel,
>  
>  	attr->sample_max_stack = param->max_stack;
>  
> +	if (opts->kernel_callchains)
> +		attr->exclude_callchain_user = 1;
> +	if (opts->user_callchains)
> +		attr->exclude_callchain_kernel = 1;
>  	if (param->record_mode == CALLCHAIN_LBR) {
>  		if (!opts->branch_stack) {
>  			if (attr->exclude_user) {
> -- 
> 2.14.1
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] perf record: Add support to collect callchains from kernel or user space only.
  2019-05-30 13:29 [PATCH] perf record: Add support to collect callchains from kernel or user space only ufo19890607
  2019-06-06  6:05 ` 禹舟键
  2019-06-06  7:25 ` Jiri Olsa
@ 2019-06-06 14:26 ` Arnaldo Carvalho de Melo
  2019-06-06 14:29   ` Arnaldo Carvalho de Melo
  2019-06-06 14:46   ` Jiri Olsa
  2019-06-17 19:18 ` [tip:perf/core] " tip-bot for yuzhoujian
  3 siblings, 2 replies; 9+ messages in thread
From: Arnaldo Carvalho de Melo @ 2019-06-06 14:26 UTC (permalink / raw)
  To: ufo19890607
  Cc: peterz, mingo, alexander.shishkin, jolsa, dsahern, namhyung,
	milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter, wangnan0,
	linux-perf-users, linux-kernel, acme

Em Thu, May 30, 2019 at 02:29:22PM +0100, ufo19890607 escreveu:
> From: yuzhoujian <yuzhoujian@didichuxing.com>
> 
> One can just record callchains in the kernel or user space with
> this new options. We can use it together with "--all-kernel" options.
> This two options is used just like print_stack(sys) or print_ustack(usr)
> for systemtap.
> 
> Show below is the usage of this new option combined with "--all-kernel"
> options.
> 	1. Configure all used events to run in kernel space and just
> collect kernel callchains.
> 	$ perf record -a -g --all-kernel --kernel-callchains
> 	2. Configure all used events to run in kernel space and just
> collect user callchains.
> 	$ perf record -a -g --all-kernel --user-callchains
> 
> Signed-off-by: yuzhoujian <yuzhoujian@didichuxing.com>
> ---
>  tools/perf/Documentation/perf-record.txt | 6 ++++++
>  tools/perf/builtin-record.c              | 4 ++++
>  tools/perf/perf.h                        | 2 ++
>  tools/perf/util/evsel.c                  | 4 ++++
>  4 files changed, 16 insertions(+)
> 
> diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
> index de269430720a..b647eb3db0c6 100644
> --- a/tools/perf/Documentation/perf-record.txt
> +++ b/tools/perf/Documentation/perf-record.txt
> @@ -490,6 +490,12 @@ Configure all used events to run in kernel space.
>  --all-user::
>  Configure all used events to run in user space.
>  
> +--kernel-callchains::
> +Collect callchains from kernel space.

Ok, changing this to:

Collect callchains only from kernel space. I.e. this option sets
perf_event_attr.exclude_callchain_user to 1,
perf_event_attr.exclude_callchain_kernel to 0.

> +
> +--user-callchains::
> +Collect callchains from user space.

And this one to:
Collect callchains only from user space. I.e. this option sets

perf_event_attr.exclude_callchain_kernel to 1,
perf_event_attr.exclude_callchain_user to 0.


So that the user don't try using:

    pref record --user-callchains --kernel-callchains

expecting to get both user and kernel callchains and instead gets
nothing.

Ok?

- Arnaldo

> +
>  --timestamp-filename
>  Append timestamp to output file name.
>  
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index e2c3a585a61e..dca55997934e 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -2191,6 +2191,10 @@ static struct option __record_options[] = {
>  	OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user,
>  			 "Configure all used events to run in user space.",
>  			 PARSE_OPT_EXCLUSIVE),
> +	OPT_BOOLEAN(0, "kernel-callchains", &record.opts.kernel_callchains,
> +		    "collect kernel callchains"),
> +	OPT_BOOLEAN(0, "user-callchains", &record.opts.user_callchains,
> +		    "collect user callchains"),
>  	OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
>  		   "clang binary to use for compiling BPF scriptlets"),
>  	OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
> diff --git a/tools/perf/perf.h b/tools/perf/perf.h
> index d59dee61b64d..711e009381ec 100644
> --- a/tools/perf/perf.h
> +++ b/tools/perf/perf.h
> @@ -61,6 +61,8 @@ struct record_opts {
>  	bool	     record_switch_events;
>  	bool	     all_kernel;
>  	bool	     all_user;
> +	bool	     kernel_callchains;
> +	bool	     user_callchains;
>  	bool	     tail_synthesize;
>  	bool	     overwrite;
>  	bool	     ignore_missing_thread;
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index a6f572a40deb..a606b2833e27 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -680,6 +680,10 @@ static void __perf_evsel__config_callchain(struct perf_evsel *evsel,
>  
>  	attr->sample_max_stack = param->max_stack;
>  
> +	if (opts->kernel_callchains)
> +		attr->exclude_callchain_user = 1;
> +	if (opts->user_callchains)
> +		attr->exclude_callchain_kernel = 1;
>  	if (param->record_mode == CALLCHAIN_LBR) {
>  		if (!opts->branch_stack) {
>  			if (attr->exclude_user) {
> -- 
> 2.14.1

-- 

- Arnaldo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] perf record: Add support to collect callchains from kernel or user space only.
  2019-06-06 14:26 ` Arnaldo Carvalho de Melo
@ 2019-06-06 14:29   ` Arnaldo Carvalho de Melo
  2019-06-06 14:46   ` Jiri Olsa
  1 sibling, 0 replies; 9+ messages in thread
From: Arnaldo Carvalho de Melo @ 2019-06-06 14:29 UTC (permalink / raw)
  To: ufo19890607
  Cc: peterz, mingo, alexander.shishkin, jolsa, dsahern, namhyung,
	milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter, wangnan0,
	linux-perf-users, linux-kernel, acme

Em Thu, Jun 06, 2019 at 11:26:44AM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Thu, May 30, 2019 at 02:29:22PM +0100, ufo19890607 escreveu:
> > From: yuzhoujian <yuzhoujian@didichuxing.com>
> > 
> > One can just record callchains in the kernel or user space with
> > this new options. We can use it together with "--all-kernel" options.
> > This two options is used just like print_stack(sys) or print_ustack(usr)
> > for systemtap.
> > 
> > Show below is the usage of this new option combined with "--all-kernel"
> > options.
> > 	1. Configure all used events to run in kernel space and just
> > collect kernel callchains.
> > 	$ perf record -a -g --all-kernel --kernel-callchains
> > 	2. Configure all used events to run in kernel space and just
> > collect user callchains.
> > 	$ perf record -a -g --all-kernel --user-callchains
> > 
> > Signed-off-by: yuzhoujian <yuzhoujian@didichuxing.com>
> > ---
> >  tools/perf/Documentation/perf-record.txt | 6 ++++++
> >  tools/perf/builtin-record.c              | 4 ++++
> >  tools/perf/perf.h                        | 2 ++
> >  tools/perf/util/evsel.c                  | 4 ++++
> >  4 files changed, 16 insertions(+)
> > 
> > diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
> > index de269430720a..b647eb3db0c6 100644
> > --- a/tools/perf/Documentation/perf-record.txt
> > +++ b/tools/perf/Documentation/perf-record.txt
> > @@ -490,6 +490,12 @@ Configure all used events to run in kernel space.
> >  --all-user::
> >  Configure all used events to run in user space.
> >  
> > +--kernel-callchains::
> > +Collect callchains from kernel space.
> 
> Ok, changing this to:
> 
> Collect callchains only from kernel space. I.e. this option sets
> perf_event_attr.exclude_callchain_user to 1,
> perf_event_attr.exclude_callchain_kernel to 0.
> 
> > +
> > +--user-callchains::
> > +Collect callchains from user space.
> 
> And this one to:
> Collect callchains only from user space. I.e. this option sets
> 
> perf_event_attr.exclude_callchain_kernel to 1,
> perf_event_attr.exclude_callchain_user to 0.

Yeah, each of this options just sets the exclude bit for the undesired
callchains, not setting 0 for the desired, so I'm fixing up the doc I
suggested accordingly, my comment below remains valid tho:

> 
> So that the user don't try using:
> 
>     pref record --user-callchains --kernel-callchains
> 
> expecting to get both user and kernel callchains and instead gets
> nothing.
> 
> Ok?
> 
> - Arnaldo
> 
> > +
> >  --timestamp-filename
> >  Append timestamp to output file name.
> >  
> > diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> > index e2c3a585a61e..dca55997934e 100644
> > --- a/tools/perf/builtin-record.c
> > +++ b/tools/perf/builtin-record.c
> > @@ -2191,6 +2191,10 @@ static struct option __record_options[] = {
> >  	OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user,
> >  			 "Configure all used events to run in user space.",
> >  			 PARSE_OPT_EXCLUSIVE),
> > +	OPT_BOOLEAN(0, "kernel-callchains", &record.opts.kernel_callchains,
> > +		    "collect kernel callchains"),
> > +	OPT_BOOLEAN(0, "user-callchains", &record.opts.user_callchains,
> > +		    "collect user callchains"),
> >  	OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
> >  		   "clang binary to use for compiling BPF scriptlets"),
> >  	OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
> > diff --git a/tools/perf/perf.h b/tools/perf/perf.h
> > index d59dee61b64d..711e009381ec 100644
> > --- a/tools/perf/perf.h
> > +++ b/tools/perf/perf.h
> > @@ -61,6 +61,8 @@ struct record_opts {
> >  	bool	     record_switch_events;
> >  	bool	     all_kernel;
> >  	bool	     all_user;
> > +	bool	     kernel_callchains;
> > +	bool	     user_callchains;
> >  	bool	     tail_synthesize;
> >  	bool	     overwrite;
> >  	bool	     ignore_missing_thread;
> > diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> > index a6f572a40deb..a606b2833e27 100644
> > --- a/tools/perf/util/evsel.c
> > +++ b/tools/perf/util/evsel.c
> > @@ -680,6 +680,10 @@ static void __perf_evsel__config_callchain(struct perf_evsel *evsel,
> >  
> >  	attr->sample_max_stack = param->max_stack;
> >  
> > +	if (opts->kernel_callchains)
> > +		attr->exclude_callchain_user = 1;
> > +	if (opts->user_callchains)
> > +		attr->exclude_callchain_kernel = 1;
> >  	if (param->record_mode == CALLCHAIN_LBR) {
> >  		if (!opts->branch_stack) {
> >  			if (attr->exclude_user) {
> > -- 
> > 2.14.1
> 
> -- 
> 
> - Arnaldo

-- 

- Arnaldo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] perf record: Add support to collect callchains from kernel or user space only.
  2019-06-06 14:26 ` Arnaldo Carvalho de Melo
  2019-06-06 14:29   ` Arnaldo Carvalho de Melo
@ 2019-06-06 14:46   ` Jiri Olsa
  2019-06-06 18:15     ` Arnaldo Carvalho de Melo
  1 sibling, 1 reply; 9+ messages in thread
From: Jiri Olsa @ 2019-06-06 14:46 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: ufo19890607, peterz, mingo, alexander.shishkin, jolsa, dsahern,
	namhyung, milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter,
	wangnan0, linux-perf-users, linux-kernel, acme

On Thu, Jun 06, 2019 at 11:26:44AM -0300, Arnaldo Carvalho de Melo wrote:
> Em Thu, May 30, 2019 at 02:29:22PM +0100, ufo19890607 escreveu:
> > From: yuzhoujian <yuzhoujian@didichuxing.com>
> > 
> > One can just record callchains in the kernel or user space with
> > this new options. We can use it together with "--all-kernel" options.
> > This two options is used just like print_stack(sys) or print_ustack(usr)
> > for systemtap.
> > 
> > Show below is the usage of this new option combined with "--all-kernel"
> > options.
> > 	1. Configure all used events to run in kernel space and just
> > collect kernel callchains.
> > 	$ perf record -a -g --all-kernel --kernel-callchains
> > 	2. Configure all used events to run in kernel space and just
> > collect user callchains.
> > 	$ perf record -a -g --all-kernel --user-callchains
> > 
> > Signed-off-by: yuzhoujian <yuzhoujian@didichuxing.com>
> > ---
> >  tools/perf/Documentation/perf-record.txt | 6 ++++++
> >  tools/perf/builtin-record.c              | 4 ++++
> >  tools/perf/perf.h                        | 2 ++
> >  tools/perf/util/evsel.c                  | 4 ++++
> >  4 files changed, 16 insertions(+)
> > 
> > diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
> > index de269430720a..b647eb3db0c6 100644
> > --- a/tools/perf/Documentation/perf-record.txt
> > +++ b/tools/perf/Documentation/perf-record.txt
> > @@ -490,6 +490,12 @@ Configure all used events to run in kernel space.
> >  --all-user::
> >  Configure all used events to run in user space.
> >  
> > +--kernel-callchains::
> > +Collect callchains from kernel space.
> 
> Ok, changing this to:
> 
> Collect callchains only from kernel space. I.e. this option sets
> perf_event_attr.exclude_callchain_user to 1,
> perf_event_attr.exclude_callchain_kernel to 0.
> 
> > +
> > +--user-callchains::
> > +Collect callchains from user space.
> 
> And this one to:
> Collect callchains only from user space. I.e. this option sets
> 
> perf_event_attr.exclude_callchain_kernel to 1,
> perf_event_attr.exclude_callchain_user to 0.
> 
> 
> So that the user don't try using:
> 
>     pref record --user-callchains --kernel-callchains
> 
> expecting to get both user and kernel callchains and instead gets
> nothing.

good catch.. we should add the logic to keep both (default)
in this case.. so do nothing ;-)

jirka

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] perf record: Add support to collect callchains from kernel or user space only.
  2019-06-06 14:46   ` Jiri Olsa
@ 2019-06-06 18:15     ` Arnaldo Carvalho de Melo
  2019-06-10  7:45       ` 禹舟键
  0 siblings, 1 reply; 9+ messages in thread
From: Arnaldo Carvalho de Melo @ 2019-06-06 18:15 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: ufo19890607, peterz, mingo, alexander.shishkin, jolsa, dsahern,
	namhyung, milian.wolff, arnaldo.melo, yuzhoujian, adrian.hunter,
	wangnan0, linux-perf-users, linux-kernel, acme

Em Thu, Jun 06, 2019 at 04:46:14PM +0200, Jiri Olsa escreveu:
> On Thu, Jun 06, 2019 at 11:26:44AM -0300, Arnaldo Carvalho de Melo wrote:
> > So that the user don't try using:

> >     pref record --user-callchains --kernel-callchains

> > expecting to get both user and kernel callchains and instead gets
> > nothing.
 
> good catch.. we should add the logic to keep both (default)
> in this case.. so do nothing ;-)

Yeah, not using both or using both should amount to the same behaviour.

Can be done with a patch on top of what I have in my tree now.

- Arnaldo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] perf record: Add support to collect callchains from kernel or user space only.
  2019-06-06 18:15     ` Arnaldo Carvalho de Melo
@ 2019-06-10  7:45       ` 禹舟键
  0 siblings, 0 replies; 9+ messages in thread
From: 禹舟键 @ 2019-06-10  7:45 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Jiri Olsa, Peter Zijlstra, Ingo Molnar, Alexander Shishkin,
	Jiri Olsa, David Ahern, Namhyung Kim, Milian Wolff, Wind Yu,
	Adrian Hunter, Wang Nan, linux-perf-users, linux-kernel, acme

Hi Arnaldo,  Jirka

> perf_event_attr.exclude_callchain_kernel to 0

I don't think we should set 0 for the desired callchins,  because we
will set exclude_callchain_user to 1 if perf_evsel is function event.

void perf_evsel__config(struct perf_evsel *evsel, struct record_opts
*opts, struct callchain_param *callchain)
{
        ...
        if (perf_evsel__is_function_event(evsel))
                evsel->attr.exclude_callchain_user = 1;

        if (callchain && callchain->enabled && !evsel->no_aux_samples)
                perf_evsel__config_callchain(evsel, opts, callchain);
}

If we set exclude_callchain_user to 0 , it will catch user callchain
for function_event.  So, it will be best to just set the
exclude_callchain_xxx to 1.

> So that the user don't try using:

    > perf record --user-callchains --kernel-callchains

> expecting to get both user and kernel callchains and instead gets
> nothing.

I will add a note in the doc.


Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com> 于2019年6月7日周五 上午2:15写道:
>
> Em Thu, Jun 06, 2019 at 04:46:14PM +0200, Jiri Olsa escreveu:
> > On Thu, Jun 06, 2019 at 11:26:44AM -0300, Arnaldo Carvalho de Melo wrote:
> > > So that the user don't try using:
>
> > >     pref record --user-callchains --kernel-callchains
>
> > > expecting to get both user and kernel callchains and instead gets
> > > nothing.
>
> > good catch.. we should add the logic to keep both (default)
> > in this case.. so do nothing ;-)
>
> Yeah, not using both or using both should amount to the same behaviour.
>
> Can be done with a patch on top of what I have in my tree now.
>
> - Arnaldo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [tip:perf/core] perf record: Add support to collect callchains from kernel or user space only
  2019-05-30 13:29 [PATCH] perf record: Add support to collect callchains from kernel or user space only ufo19890607
                   ` (2 preceding siblings ...)
  2019-06-06 14:26 ` Arnaldo Carvalho de Melo
@ 2019-06-17 19:18 ` tip-bot for yuzhoujian
  3 siblings, 0 replies; 9+ messages in thread
From: tip-bot for yuzhoujian @ 2019-06-17 19:18 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: peterz, tglx, yuzhoujian, adrian.hunter, dsahern, linux-kernel,
	alexander.shishkin, namhyung, milian.wolff, jolsa, acme, mingo,
	hpa, wangnan0

Commit-ID:  53651b28cfb637ef604abc189d877948d1af39bb
Gitweb:     https://git.kernel.org/tip/53651b28cfb637ef604abc189d877948d1af39bb
Author:     yuzhoujian <yuzhoujian@didichuxing.com>
AuthorDate: Thu, 30 May 2019 14:29:22 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 10 Jun 2019 15:50:01 -0300

perf record: Add support to collect callchains from kernel or user space only

One can just record callchains in the kernel or user space with this new
options.

We can use it together with "--all-kernel" options.

This two options is used just like print_stack(sys) or print_ustack(usr)
for systemtap.

Shown below is the usage of this new option combined with "--all-kernel"
options:

1. Configure all used events to run in kernel space and just collect
   kernel callchains.

  $ perf record -a -g --all-kernel --kernel-callchains

2. Configure all used events to run in kernel space and just collect
   user callchains.

  $ perf record -a -g --all-kernel --user-callchains

Committer notes:

Improved documentation to state that asking for kernel callchains really
is asking for excluding user callchains, and vice versa.

Further mentioned that using both won't get both, but nothing, as both
will be excluded.

Signed-off-by: yuzhoujian <yuzhoujian@didichuxing.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Milian Wolff <milian.wolff@kdab.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1559222962-22891-1-git-send-email-ufo19890607@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/Documentation/perf-record.txt | 11 +++++++++++
 tools/perf/builtin-record.c              |  4 ++++
 tools/perf/perf.h                        |  2 ++
 tools/perf/util/evsel.c                  |  4 ++++
 4 files changed, 21 insertions(+)

diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
index de269430720a..15e0fa87241b 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -490,6 +490,17 @@ Configure all used events to run in kernel space.
 --all-user::
 Configure all used events to run in user space.
 
+--kernel-callchains::
+Collect callchains only from kernel space. I.e. this option sets
+perf_event_attr.exclude_callchain_user to 1.
+
+--user-callchains::
+Collect callchains only from user space. I.e. this option sets
+perf_event_attr.exclude_callchain_kernel to 1.
+
+Don't use both --kernel-callchains and --user-callchains at the same time or no
+callchains will be collected.
+
 --timestamp-filename
 Append timestamp to output file name.
 
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index e2c3a585a61e..dca55997934e 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -2191,6 +2191,10 @@ static struct option __record_options[] = {
 	OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user,
 			 "Configure all used events to run in user space.",
 			 PARSE_OPT_EXCLUSIVE),
+	OPT_BOOLEAN(0, "kernel-callchains", &record.opts.kernel_callchains,
+		    "collect kernel callchains"),
+	OPT_BOOLEAN(0, "user-callchains", &record.opts.user_callchains,
+		    "collect user callchains"),
 	OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
 		   "clang binary to use for compiling BPF scriptlets"),
 	OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index d59dee61b64d..711e009381ec 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -61,6 +61,8 @@ struct record_opts {
 	bool	     record_switch_events;
 	bool	     all_kernel;
 	bool	     all_user;
+	bool	     kernel_callchains;
+	bool	     user_callchains;
 	bool	     tail_synthesize;
 	bool	     overwrite;
 	bool	     ignore_missing_thread;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index cc6e7a0dda92..9f3b58071863 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -680,6 +680,10 @@ static void __perf_evsel__config_callchain(struct perf_evsel *evsel,
 
 	attr->sample_max_stack = param->max_stack;
 
+	if (opts->kernel_callchains)
+		attr->exclude_callchain_user = 1;
+	if (opts->user_callchains)
+		attr->exclude_callchain_kernel = 1;
 	if (param->record_mode == CALLCHAIN_LBR) {
 		if (!opts->branch_stack) {
 			if (attr->exclude_user) {

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2019-06-17 19:20 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-30 13:29 [PATCH] perf record: Add support to collect callchains from kernel or user space only ufo19890607
2019-06-06  6:05 ` 禹舟键
2019-06-06  7:25 ` Jiri Olsa
2019-06-06 14:26 ` Arnaldo Carvalho de Melo
2019-06-06 14:29   ` Arnaldo Carvalho de Melo
2019-06-06 14:46   ` Jiri Olsa
2019-06-06 18:15     ` Arnaldo Carvalho de Melo
2019-06-10  7:45       ` 禹舟键
2019-06-17 19:18 ` [tip:perf/core] " tip-bot for yuzhoujian

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).