diff options
Diffstat (limited to 'tools/perf/util/evsel.c')
| -rw-r--r-- | tools/perf/util/evsel.c | 42 | 
1 files changed, 41 insertions, 1 deletions
| diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index cda44b0e821c..6f4882f8d61f 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -11,13 +11,17 @@  #include <errno.h>  #include <inttypes.h>  #include <linux/bitops.h> +#include <api/fs/fs.h>  #include <api/fs/tracing_path.h>  #include <traceevent/event-parse.h>  #include <linux/hw_breakpoint.h>  #include <linux/perf_event.h> +#include <linux/compiler.h>  #include <linux/err.h>  #include <sys/ioctl.h>  #include <sys/resource.h> +#include <sys/types.h> +#include <dirent.h>  #include "asm/bug.h"  #include "callchain.h"  #include "cgroup.h" @@ -1441,7 +1445,7 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,  }  static int __open_attr__fprintf(FILE *fp, const char *name, const char *val, -				void *priv __attribute__((unused))) +				void *priv __maybe_unused)  {  	return fprintf(fp, "  %-32s %s\n", name, val);  } @@ -2471,6 +2475,42 @@ bool perf_evsel__fallback(struct perf_evsel *evsel, int err,  	return false;  } +static bool find_process(const char *name) +{ +	size_t len = strlen(name); +	DIR *dir; +	struct dirent *d; +	int ret = -1; + +	dir = opendir(procfs__mountpoint()); +	if (!dir) +		return false; + +	/* Walk through the directory. */ +	while (ret && (d = readdir(dir)) != NULL) { +		char path[PATH_MAX]; +		char *data; +		size_t size; + +		if ((d->d_type != DT_DIR) || +		     !strcmp(".", d->d_name) || +		     !strcmp("..", d->d_name)) +			continue; + +		scnprintf(path, sizeof(path), "%s/%s/comm", +			  procfs__mountpoint(), d->d_name); + +		if (filename__read_str(path, &data, &size)) +			continue; + +		ret = strncmp(name, data, len); +		free(data); +	} + +	closedir(dir); +	return ret ? false : true; +} +  int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,  			      int err, char *msg, size_t size)  { |