diff options
Diffstat (limited to 'tools/perf/lib/evsel.c')
| -rw-r--r-- | tools/perf/lib/evsel.c | 75 | 
1 files changed, 57 insertions, 18 deletions
diff --git a/tools/perf/lib/evsel.c b/tools/perf/lib/evsel.c index a8cb582e2721..4dc06289f4c7 100644 --- a/tools/perf/lib/evsel.c +++ b/tools/perf/lib/evsel.c @@ -114,15 +114,23 @@ int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus,  	return err;  } +static void perf_evsel__close_fd_cpu(struct perf_evsel *evsel, int cpu) +{ +	int thread; + +	for (thread = 0; thread < xyarray__max_y(evsel->fd); ++thread) { +		if (FD(evsel, cpu, thread) >= 0) +			close(FD(evsel, cpu, thread)); +		FD(evsel, cpu, thread) = -1; +	} +} +  void perf_evsel__close_fd(struct perf_evsel *evsel)  { -	int cpu, thread; +	int cpu;  	for (cpu = 0; cpu < xyarray__max_x(evsel->fd); cpu++) -		for (thread = 0; thread < xyarray__max_y(evsel->fd); ++thread) { -			close(FD(evsel, cpu, thread)); -			FD(evsel, cpu, thread) = -1; -		} +		perf_evsel__close_fd_cpu(evsel, cpu);  }  void perf_evsel__free_fd(struct perf_evsel *evsel) @@ -140,6 +148,14 @@ void perf_evsel__close(struct perf_evsel *evsel)  	perf_evsel__free_fd(evsel);  } +void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu) +{ +	if (evsel->fd == NULL) +		return; + +	perf_evsel__close_fd_cpu(evsel, cpu); +} +  int perf_evsel__read_size(struct perf_evsel *evsel)  {  	u64 read_format = evsel->attr.read_format; @@ -182,38 +198,61 @@ int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread,  }  static int perf_evsel__run_ioctl(struct perf_evsel *evsel, -				 int ioc,  void *arg) +				 int ioc,  void *arg, +				 int cpu)  { -	int cpu, thread; +	int thread; -	for (cpu = 0; cpu < xyarray__max_x(evsel->fd); cpu++) { -		for (thread = 0; thread < xyarray__max_y(evsel->fd); thread++) { -			int fd = FD(evsel, cpu, thread), -			    err = ioctl(fd, ioc, arg); +	for (thread = 0; thread < xyarray__max_y(evsel->fd); thread++) { +		int fd = FD(evsel, cpu, thread), +		    err = ioctl(fd, ioc, arg); -			if (err) -				return err; -		} +		if (err) +			return err;  	}  	return 0;  } +int perf_evsel__enable_cpu(struct perf_evsel *evsel, int cpu) +{ +	return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, NULL, cpu); +} +  int perf_evsel__enable(struct perf_evsel *evsel)  { -	return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, 0); +	int i; +	int err = 0; + +	for (i = 0; i < xyarray__max_x(evsel->fd) && !err; i++) +		err = perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, NULL, i); +	return err; +} + +int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu) +{ +	return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, NULL, cpu);  }  int perf_evsel__disable(struct perf_evsel *evsel)  { -	return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, 0); +	int i; +	int err = 0; + +	for (i = 0; i < xyarray__max_x(evsel->fd) && !err; i++) +		err = perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, NULL, i); +	return err;  }  int perf_evsel__apply_filter(struct perf_evsel *evsel, const char *filter)  { -	return perf_evsel__run_ioctl(evsel, +	int err = 0, i; + +	for (i = 0; i < evsel->cpus->nr && !err; i++) +		err = perf_evsel__run_ioctl(evsel,  				     PERF_EVENT_IOC_SET_FILTER, -				     (void *)filter); +				     (void *)filter, i); +	return err;  }  struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel)  |