lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Fri, 4 Sep 2015 11:48:53 +0000
From:	平松雅巳 / HIRAMATU,MASAMI 
	<masami.hiramatsu.pt@...achi.com>
To:	"'Namhyung Kim'" <namhyung@...nel.org>,
	Arnaldo Carvalho de Melo <acme@...nel.org>
CC:	Ingo Molnar <mingo@...nel.org>,
	Peter Zijlstra <a.p.zijlstra@...llo.nl>,
	Jiri Olsa <jolsa@...hat.com>,
	LKML <linux-kernel@...r.kernel.org>,
	Wang Nan <wangnan0@...wei.com>,
	"pi3orama@....com" <pi3orama@....com>
Subject: RE: [PATCH 3/5] perf probe: Move print logic into cmd_probe()

> From: Namhyung Kim [mailto:namhyung@...nel.org]
> 
> Showing actual trace event when adding perf events is only needed in
> perf probe command.  But the add functionality itself can be used by
> other places.  So move the printing code into the cmd_probe().
> 
> Also it combines the output if more than one event is added.
> 
> Before:
>   $ sudo perf probe -a do_fork -a do_exit
>   Added new event:
>   probe:do_fork        (on do_fork)
> 
>   You can now use it in all perf tools, such as:
> 
>       perf record -e probe:do_fork -aR sleep 1
> 
>   Added new events:
>   probe:do_exit        (on do_exit)
>   probe:do_exit_1      (on do_exit)
> 
>   You can now use it in all perf tools, such as:
> 
>       perf record -e probe:do_exit_1 -aR sleep 1
> 
> After:
>   $ sudo perf probe -a do_fork -a do_exit
>   Added new events:
>   probe:do_fork        (on do_fork)
>   probe:do_exit        (on do_exit)
>   probe:do_exit_1      (on do_exit)
> 
>   You can now use it in all perf tools, such as:
> 
>       perf record -e probe:do_exit_1 -aR sleep 1
> 

Looks good to me :)

Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@...achi.com>

Thanks!

> Cc: Masami Hiramatsu <masami.hiramatsu.pt@...achi.com>
> Signed-off-by: Namhyung Kim <namhyung@...nel.org>
> ---
>  tools/perf/builtin-probe.c    | 48 ++++++++++++++++++++++++++++++++++++++++++-
>  tools/perf/util/probe-event.c | 22 +++-----------------
>  tools/perf/util/probe-event.h |  3 +++
>  3 files changed, 53 insertions(+), 20 deletions(-)
> 
> diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
> index b81cec33b4b2..b8cf6cb7e1bf 100644
> --- a/tools/perf/builtin-probe.c
> +++ b/tools/perf/builtin-probe.c
> @@ -311,6 +311,52 @@ static void pr_err_with_code(const char *msg, int err)
>  	pr_err("\n");
>  }
> 
> +static int perf_add_probe_events(struct perf_probe_event *pevs, int npevs)
> +{
> +	int ret;
> +	int i, k;
> +	const char *event = NULL, *group = NULL;
> +
> +	ret = convert_perf_probe_events(pevs, npevs);
> +	if (ret < 0)
> +		goto out_cleanup;
> +
> +	ret = apply_perf_probe_events(pevs, npevs);
> +	if (ret < 0)
> +		goto out_cleanup;
> +
> +	for (i = k = 0; i < npevs; i++)
> +		k += pevs[i].ntevs;
> +
> +	pr_info("Added new event%s\n", (k > 1) ? "s:" : ":");
> +	for (i = 0; i < npevs; i++) {
> +		struct perf_probe_event *pev = &pevs[i];
> +
> +		for (k = 0; k < pev->ntevs; k++) {
> +			struct probe_trace_event *tev = &pev->tevs[k];
> +
> +			/* We use tev's name for showing new events */
> +			show_perf_probe_event(tev->group, tev->event, pev,
> +					      tev->point.module, false);
> +
> +			/* Save the last valid name */
> +			event = tev->event;
> +			group = tev->group;
> +		}
> +	}
> +
> +	/* Note that it is possible to skip all events because of blacklist */
> +	if (event) {
> +		/* Show how to use the event. */
> +		pr_info("\nYou can now use it in all perf tools, such as:\n\n");
> +		pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
> +	}
> +
> +out_cleanup:
> +	cleanup_perf_probe_events(pevs, npevs);
> +	return ret;
> +}
> +
>  static int
>  __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
>  {
> @@ -496,7 +542,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
>  			usage_with_options(probe_usage, options);
>  		}
> 
> -		ret = add_perf_probe_events(params.events, params.nevents);
> +		ret = perf_add_probe_events(params.events, params.nevents);
>  		if (ret < 0) {
>  			pr_err_with_code("  Error: Failed to add events.", ret);
>  			return ret;
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 0d3a051b9202..01b9a5bd9449 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -2180,9 +2180,9 @@ static int perf_probe_event__sprintf(const char *group, const char *event,
>  }
> 
>  /* Show an event */
> -static int show_perf_probe_event(const char *group, const char *event,
> -				 struct perf_probe_event *pev,
> -				 const char *module, bool use_stdout)
> +int show_perf_probe_event(const char *group, const char *event,
> +			  struct perf_probe_event *pev,
> +			  const char *module, bool use_stdout)
>  {
>  	struct strbuf buf = STRBUF_INIT;
>  	int ret;
> @@ -2399,7 +2399,6 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
>  {
>  	int i, fd, ret;
>  	struct probe_trace_event *tev = NULL;
> -	const char *event = NULL, *group = NULL;
>  	struct strlist *namelist;
> 
>  	fd = probe_file__open(PF_FL_RW | (pev->uprobes ? PF_FL_UPROBE : 0));
> @@ -2415,7 +2414,6 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
>  	}
> 
>  	ret = 0;
> -	pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
>  	for (i = 0; i < ntevs; i++) {
>  		tev = &tevs[i];
>  		/* Skip if the symbol is out of .text or blacklisted */
> @@ -2432,13 +2430,6 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
>  		if (ret < 0)
>  			break;
> 
> -		/* We use tev's name for showing new events */
> -		show_perf_probe_event(tev->group, tev->event, pev,
> -				      tev->point.module, false);
> -		/* Save the last valid name */
> -		event = tev->event;
> -		group = tev->group;
> -
>  		/*
>  		 * Probes after the first probe which comes from same
>  		 * user input are always allowed to add suffix, because
> @@ -2450,13 +2441,6 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
>  	if (ret == -EINVAL && pev->uprobes)
>  		warn_uprobe_event_compat(tev);
> 
> -	/* Note that it is possible to skip all events because of blacklist */
> -	if (ret >= 0 && event) {
> -		/* Show how to use the event. */
> -		pr_info("\nYou can now use it in all perf tools, such as:\n\n");
> -		pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
> -	}
> -
>  	strlist__delete(namelist);
>  close_out:
>  	close(fd);
> diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
> index 70c327bd61de..610f743671e1 100644
> --- a/tools/perf/util/probe-event.h
> +++ b/tools/perf/util/probe-event.h
> @@ -144,6 +144,9 @@ extern int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs);
>  extern int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs);
>  extern void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs);
>  extern int del_perf_probe_events(struct strfilter *filter);
> +extern int show_perf_probe_event(const char *group, const char *event,
> +				 struct perf_probe_event *pev,
> +				 const char *module, bool use_stdout);
>  extern int show_perf_probe_events(struct strfilter *filter);
>  extern int show_line_range(struct line_range *lr, const char *module,
>  			   bool user);
> --
> 2.5.0

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ