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 for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Fri, 4 Sep 2015 11:36:56 +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>,
	sysp-manager <cti.systems-productivity-manager.ts@...achi.com>
Subject: RE: [PATCH 2/5] perf probe: Attach trace_probe_event with
 perf_probe_event

> From: Namhyung Kim [mailto:namhyung@...nel.org]
> 
> This patch drops struct __event_package structure.  Instead, it adds
> trace_probe_event into 'struct perf_probe_event'.
> 
> trace_probe_event information gives further patches a chance to access
> actual probe points and actual arguments.  Using them, perf probe can
> get whole list of added probes and print them at once.
> 
> Other users like upcoming bpf_loader will be able to attach one bpf
> program to different probing points of an inline functions (which has
> multiple probing points) and glob functions.  Moreover, by reading
> arguments information, bpf code for reading those arguments can be
> generated.

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: Wang Nan <wangnan0@...wei.com>
> [namhyung: extract necessary part from the existing patch]
> Signed-off-by: Namhyung Kim <namhyung@...nel.org>
> ---
>  tools/perf/util/probe-event.c | 57 +++++++++++++------------------------------
>  tools/perf/util/probe-event.h |  5 ++++
>  2 files changed, 22 insertions(+), 40 deletions(-)
> 
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 2c762f41e7a5..0d3a051b9202 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -2759,59 +2759,39 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
>  	return find_probe_trace_events_from_map(pev, tevs);
>  }
> 
> -struct __event_package {
> -	struct perf_probe_event		*pev;
> -	struct probe_trace_event	*tevs;
> -	int				ntevs;
> -};
> -
> -static int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs,
> -				     struct __event_package **ppkgs)
> +int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs)
>  {
>  	int i, ret;
> -	struct __event_package *pkgs;
> -
> -	ret = 0;
> -	pkgs = zalloc(sizeof(struct __event_package) * npevs);
> -
> -	if (pkgs == NULL)
> -		return -ENOMEM;
> 
>  	ret = init_symbol_maps(pevs->uprobes);
> -	if (ret < 0) {
> -		free(pkgs);
> +	if (ret < 0)
>  		return ret;
> -	}
> 
>  	/* Loop 1: convert all events */
>  	for (i = 0; i < npevs; i++) {
> -		pkgs[i].pev = &pevs[i];
>  		/* Init kprobe blacklist if needed */
> -		if (!pkgs[i].pev->uprobes)
> +		if (!pevs[i].uprobes)
>  			kprobe_blacklist__init();
>  		/* Convert with or without debuginfo */
> -		ret  = convert_to_probe_trace_events(pkgs[i].pev,
> -						     &pkgs[i].tevs);
> +		ret  = convert_to_probe_trace_events(&pevs[i], &pevs[i].tevs);
>  		if (ret < 0)
>  			return ret;
> -		pkgs[i].ntevs = ret;
> +		pevs[i].ntevs = ret;
>  	}
>  	/* This just release blacklist only if allocated */
>  	kprobe_blacklist__release();
> 
> -	*ppkgs = pkgs;
> -
>  	return 0;
>  }
> 
> -static int apply_perf_probe_events(struct __event_package *pkgs, int npevs)
> +int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs)
>  {
>  	int i, ret = 0;
> 
>  	/* Loop 2: add all events */
>  	for (i = 0; i < npevs; i++) {
> -		ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs,
> -					       pkgs[i].ntevs,
> +		ret = __add_probe_trace_events(&pevs[i], pevs[i].tevs,
> +					       pevs[i].ntevs,
>  					       probe_conf.force_add);
>  		if (ret < 0)
>  			break;
> @@ -2819,33 +2799,30 @@ static int apply_perf_probe_events(struct __event_package *pkgs, int npevs)
>  	return ret;
>  }
> 
> -static void cleanup_perf_probe_events(struct __event_package *pkgs, int npevs)
> +void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs)
>  {
>  	int i, j;
> 
> -	if (pkgs == NULL)
> -		return;
> -
>  	/* Loop 3: cleanup and free trace events  */
>  	for (i = 0; i < npevs; i++) {
> -		for (j = 0; j < pkgs[i].ntevs; j++)
> -			clear_probe_trace_event(&pkgs[i].tevs[j]);
> -		zfree(&pkgs[i].tevs);
> +		for (j = 0; j < pevs[i].ntevs; j++)
> +			clear_probe_trace_event(&pevs[i].tevs[j]);
> +		zfree(&pevs[i].tevs);
> +		pevs[i].ntevs = 0;
>  	}
> -	free(pkgs);
> +
>  	exit_symbol_maps();
>  }
> 
>  int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
>  {
>  	int ret;
> -	struct __event_package *pkgs = NULL;
> 
> -	ret = convert_perf_probe_events(pevs, npevs, &pkgs);
> +	ret = convert_perf_probe_events(pevs, npevs);
>  	if (ret == 0)
> -		ret = apply_perf_probe_events(pkgs, npevs);
> +		ret = apply_perf_probe_events(pevs, npevs);
> 
> -	cleanup_perf_probe_events(pkgs, npevs);
> +	cleanup_perf_probe_events(pevs, npevs);
> 
>  	return ret;
>  }
> diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
> index 6e7ec68a4aa8..70c327bd61de 100644
> --- a/tools/perf/util/probe-event.h
> +++ b/tools/perf/util/probe-event.h
> @@ -87,6 +87,8 @@ struct perf_probe_event {
>  	bool			uprobes;	/* Uprobe event flag */
>  	char			*target;	/* Target binary */
>  	struct perf_probe_arg	*args;	/* Arguments */
> +	struct probe_trace_event *tevs;
> +	int			ntevs;
>  };
> 
>  /* Line range */
> @@ -138,6 +140,9 @@ extern void line_range__clear(struct line_range *lr);
>  extern int line_range__init(struct line_range *lr);
> 
>  extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
> +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_events(struct strfilter *filter);
>  extern int show_line_range(struct line_range *lr, const char *module,
> --
> 2.5.0

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ