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:	Thu, 9 Jul 2009 02:47:17 +0200
From:	Frederic Weisbecker <fweisbec@...il.com>
To:	Jason Baron <jbaron@...hat.com>
Cc:	Peter Zijlstra <a.p.zijlstra@...llo.nl>, mingo@...e.hu,
	linux-kernel@...r.kernel.org, paulus@...ba.org, rostedt@...dmis.org
Subject: Re: [PATCH 3/2] perf_counters: add debugfs dir option

On Wed, Jul 08, 2009 at 04:17:43PM -0400, Jason Baron wrote:
> On Tue, Jul 07, 2009 at 10:29:20AM +0200, Peter Zijlstra wrote:
> > On Mon, 2009-07-06 at 17:12 -0400, Jason Baron wrote:
> > > Add support to 'perf list' and 'perf stat' for kernel tracepoints. The
> > > implementation creates a 'for_each_subsystem' and 'for_each_event' for
> > > easy iteration over the tracepoints. The debugfs filesystem must be mounted
> > > at '/sys/kernel/debug'. We can add an optional search path in the future.
> > 
> > I don't have a single machine that has that mount point.
> > 
> > 
> 
> ok, The patch below adds support for a 'PERF_DIR_DEBUGFS' environment
> variable. It also adds a command line for '--debugfs-dir' and
> '--debugfs-dir='. By default 'perf' continues to look in
> /sys/kernel/debug, which I believe is most common.
> 
> thanks,
> 
> -Jason
> 
> Signed-off-by: Jason Baron <jbaron@...hat.com>



Or why not parsing /etc/mtab ?

Thanks.



> 
> 
>  tools/perf/perf.c              |   16 ++++++++
>  tools/perf/util/cache.h        |    1 +
>  tools/perf/util/parse-events.c |   78
> ++++++++++++++++++++++++----------------
>  3 files changed, 62 insertions(+), 33 deletions(-)
> 
> 
> 
> diff --git a/tools/perf/perf.c b/tools/perf/perf.c
> index c565678..29876ee 100644
> --- a/tools/perf/perf.c
> +++ b/tools/perf/perf.c
> @@ -122,6 +122,20 @@ static int handle_options(const char*** argv, int* argc, int* envchanged)
>  			setenv(PERF_WORK_TREE_ENVIRONMENT, cmd + 12, 1);
>  			if (envchanged)
>  				*envchanged = 1;
> +		} else if (!strcmp(cmd, "--debugfs-dir")) {
> +			if (*argc < 2) {
> +				fprintf(stderr, "No directory given for --debugfs-dir.\n");
> +				usage(perf_usage_string);
> +			}
> +			setenv(PERF_DEBUGFS_ENVIRONMENT, (*argv)[1], 1);
> +			if (envchanged)
> +				*envchanged = 1;
> +			(*argv)++;
> +			(*argc)--;
> +		} else if (!prefixcmp(cmd, "--debugfs-dir=")) {
> +			setenv(PERF_DEBUGFS_ENVIRONMENT, cmd + 14, 1);
> +			if (envchanged)
> +				*envchanged = 1;
>  		} else {
>  			fprintf(stderr, "Unknown option: %s\n", cmd);
>  			usage(perf_usage_string);
> @@ -354,7 +368,7 @@ int main(int argc, const char **argv)
>  	cmd = perf_extract_argv0_path(argv[0]);
>  	if (!cmd)
>  		cmd = "perf-help";
> -
> +	setenv(PERF_DEBUGFS_ENVIRONMENT, "/sys/kernel/debug/", 0);
>  	/*
>  	 * "perf-xxxx" is the same as "perf xxxx", but we obviously:
>  	 *
> diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h
> index 161d5f4..4ba4b3e 100644
> --- a/tools/perf/util/cache.h
> +++ b/tools/perf/util/cache.h
> @@ -18,6 +18,7 @@
>  #define PERFATTRIBUTES_FILE ".perfattributes"
>  #define INFOATTRIBUTES_FILE "info/attributes"
>  #define ATTRIBUTE_MACRO_PREFIX "[attr]"
> +#define PERF_DEBUGFS_ENVIRONMENT "PERF_DIR_DEBUGFS"
>  
>  typedef int (*config_fn_t)(const char *, const char *, void *);
>  extern int perf_default_config(const char *, const char *, void *);
> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> index d454eac..54b6c23 100644
> --- a/tools/perf/util/parse-events.c
> +++ b/tools/perf/util/parse-events.c
> @@ -5,6 +5,7 @@
>  #include "parse-events.h"
>  #include "exec_cmd.h"
>  #include "string.h"
> +#include "cache.h"
>  
>  extern char *strcasestr(const char *haystack, const char *needle);
>  
> @@ -12,8 +13,6 @@ int					nr_counters;
>  
>  struct perf_counter_attr		attrs[MAX_COUNTERS];
>  
> -static char default_debugfs_path[] = "/sys/kernel/debug/tracing/events";
> -
>  struct event_symbol {
>  	u8	type;
>  	u64	config;
> @@ -21,6 +20,8 @@ struct event_symbol {
>  	char	*alias;
>  };
>  
> +static char debugfs_path[MAXPATHLEN];
> +
>  #define CHW(x) .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_##x
>  #define CSW(x) .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_##x
>  
> @@ -112,30 +113,38 @@ static unsigned long hw_cache_stat[C(MAX)] = {
>   [C(BPU)]	= (CACHE_READ),
>  };
>  
> -#define for_each_subsystem(sys_dir, sys_dirent, sys_next, file, st)	       \
> -	while (!readdir_r(sys_dir, &sys_dirent, &sys_next) && sys_next)	       \
> -	if (sprintf(file, "%s/%s", default_debugfs_path, sys_dirent.d_name) && \
> -	   (stat(file, &st) == 0) && (S_ISDIR(st.st_mode)) &&		       \
> -	   (strcmp(sys_dirent.d_name, ".") != 0) &&			       \
> +#define for_each_subsystem(sys_dir, sys_dirent, sys_next, file, st)	     \
> +	while (!readdir_r(sys_dir, &sys_dirent, &sys_next) && sys_next)	     \
> +	if (snprintf(file, MAXPATHLEN, "%s/%s/%s",			     \
> +		     getenv(PERF_DEBUGFS_ENVIRONMENT), "tracing/events",     \
> +		     sys_dirent.d_name) &&				     \
> +	   (stat(file, &st) == 0) && (S_ISDIR(st.st_mode)) &&		     \
> +	   (strcmp(sys_dirent.d_name, ".") != 0) &&			     \
>  	   (strcmp(sys_dirent.d_name, "..") != 0))
>  
> -#define for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next, file, st)    \
> -	while (!readdir_r(evt_dir, &evt_dirent, &evt_next) && evt_next)        \
> -	if (sprintf(file, "%s/%s/%s", default_debugfs_path, sys_dirent.d_name, \
> -			evt_dirent.d_name) && 				       \
> -	   (stat(file, &st) == 0) && (S_ISDIR(st.st_mode)) &&		       \
> -	   (strcmp(evt_dirent.d_name, ".") != 0) && 			       \
> +#define for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next, file, st)  \
> +	while (!readdir_r(evt_dir, &evt_dirent, &evt_next) && evt_next)	     \
> +	if (snprintf(file, MAXPATHLEN, "%s/%s/%s/%s",			     \
> +		     getenv(PERF_DEBUGFS_ENVIRONMENT), "tracing/events",     \
> +		     sys_dirent.d_name, evt_dirent.d_name) &&		     \
> +	   (stat(file, &st) == 0) && (S_ISDIR(st.st_mode)) &&		     \
> +	   (strcmp(evt_dirent.d_name, ".") != 0) &&			     \
>  	   (strcmp(evt_dirent.d_name, "..") != 0))
>  
> -#define MAX_PATH_LENGTH (strlen(default_debugfs_path) + 3 + \
> -			(3 * (strlen(sys_dirent.d_name))) + 1)
>  #define MAX_EVENT_LENGTH 30
>  
> -static int valid_debugfs_mount(void)
> +static void set_debugfs_path(void)
> +{
> +	snprintf(debugfs_path, MAXPATHLEN, "%s/%s",
> +		 getenv(PERF_DEBUGFS_ENVIRONMENT),
> +		 "tracing/events");
> +}
> +
> +static int valid_debugfs_mount(const char *mount)
>  {
>  	struct statfs st_fs;
>  
> -	if (statfs(default_debugfs_path, &st_fs) < 0)
> +	if (statfs(mount, &st_fs) < 0)
>  		return -ENOENT;
>  	else if (st_fs.f_type != (long) DEBUGFS_MAGIC)
>  		return -ENOENT;
> @@ -151,12 +160,13 @@ static char *tracepoint_id_to_name(u64 config)
>  	char id_buf[4];
>  	int fd;
>  	long long id;
> -	char evt_path[MAX_PATH_LENGTH];
> +	char evt_path[MAXPATHLEN];
>  
> -	if (valid_debugfs_mount())
> +	set_debugfs_path();
> +	if (valid_debugfs_mount(debugfs_path))
>  		return "unkown";
>  
> -	sys_dir = opendir(default_debugfs_path);
> +	sys_dir = opendir(debugfs_path);
>  	if (!sys_dir)
>  		goto cleanup;
>  	for_each_subsystem(sys_dir, sys_dirent, sys_next, evt_path, st) {
> @@ -165,8 +175,9 @@ static char *tracepoint_id_to_name(u64 config)
>  			goto cleanup;
>  		for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next,
>  								evt_path, st) {
> -			sprintf(evt_path, "%s/%s/%s/id", default_debugfs_path,
> -				sys_dirent.d_name, evt_dirent.d_name);
> +			snprintf(evt_path, MAXPATHLEN, "%s/%s/%s/id",
> +				 debugfs_path, sys_dirent.d_name,
> +				 evt_dirent.d_name);
>  			fd = open(evt_path, O_RDONLY);
>  			if (fd < 0)
>  				continue;
> @@ -362,9 +373,10 @@ static int parse_tracepoint_event(const char **strp,
>  	int fd;
>  	unsigned int sys_length, evt_length;
>  	u64 id;
> -	char evt_path[MAX_PATH_LENGTH];
> +	char evt_path[MAXPATHLEN];
>  
> -	if (valid_debugfs_mount())
> +	set_debugfs_path();
> +	if (valid_debugfs_mount(debugfs_path))
>  		return 0;
>  
>  	evt_name = strchr(*strp, ':');
> @@ -381,7 +393,7 @@ static int parse_tracepoint_event(const char **strp,
>  	} else
>  		return 0;
>  
> -	sys_dir = opendir(default_debugfs_path);
> +	sys_dir = opendir(debugfs_path);
>  	if (!sys_dir)
>  		goto cleanup;
>  	for_each_subsystem(sys_dir, sys_dirent, sys_next, evt_path, st) {
> @@ -392,10 +404,11 @@ static int parse_tracepoint_event(const char **strp,
>  			for_each_event(sys_dirent, evt_dir, evt_dirent,
>  						       evt_next, evt_path, st) {
>  				if (strcmp(evt_dirent.d_name, evt_name) == 0) {
> -					sprintf(evt_path, "%s/%s/%s/id",
> -						default_debugfs_path,
> -						sys_dirent.d_name,
> -						evt_dirent.d_name);
> +					snprintf(evt_path, MAXPATHLEN,
> +						 "%s/%s/%s/id",
> +						 debugfs_path,
> +						 sys_dirent.d_name,
> +						 evt_dirent.d_name);
>  					fd = open(evt_path, O_RDONLY);
>  					if (fd < 0)
>  						continue;
> @@ -589,12 +602,13 @@ static void print_tracepoint_events(void)
>  	DIR *sys_dir, *evt_dir;
>  	struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent;
>  	struct stat st;
> -	char evt_path[MAX_PATH_LENGTH];
> +	char evt_path[MAXPATHLEN];
>  
> -	if (valid_debugfs_mount())
> +	set_debugfs_path();
> +	if (valid_debugfs_mount(debugfs_path))
>  		return;
>  
> -	sys_dir = opendir(default_debugfs_path);
> +	sys_dir = opendir(debugfs_path);
>  	if (!sys_dir)
>  		goto cleanup;
>  	for_each_subsystem(sys_dir, sys_dirent, sys_next, evt_path, st) {
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ