diff options
Diffstat (limited to 'tools/lib/perf')
| -rw-r--r-- | tools/lib/perf/Documentation/examples/counting.c | 83 | ||||
| -rw-r--r-- | tools/lib/perf/include/perf/event.h | 7 | 
2 files changed, 90 insertions, 0 deletions
| diff --git a/tools/lib/perf/Documentation/examples/counting.c b/tools/lib/perf/Documentation/examples/counting.c new file mode 100644 index 000000000000..6085693571ef --- /dev/null +++ b/tools/lib/perf/Documentation/examples/counting.c @@ -0,0 +1,83 @@ +#include <linux/perf_event.h> +#include <perf/evlist.h> +#include <perf/evsel.h> +#include <perf/cpumap.h> +#include <perf/threadmap.h> +#include <perf/mmap.h> +#include <perf/core.h> +#include <perf/event.h> +#include <stdio.h> +#include <unistd.h> + +static int libperf_print(enum libperf_print_level level, +                         const char *fmt, va_list ap) +{ +	return vfprintf(stderr, fmt, ap); +} + +int main(int argc, char **argv) +{ +	int count = 100000, err = 0; +	struct perf_evlist *evlist; +	struct perf_evsel *evsel; +	struct perf_thread_map *threads; +	struct perf_counts_values counts; + +	struct perf_event_attr attr1 = { +		.type        = PERF_TYPE_SOFTWARE, +		.config      = PERF_COUNT_SW_CPU_CLOCK, +		.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING, +		.disabled    = 1, +	}; +	struct perf_event_attr attr2 = { +		.type        = PERF_TYPE_SOFTWARE, +		.config      = PERF_COUNT_SW_TASK_CLOCK, +		.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING, +		.disabled    = 1, +	}; + +	libperf_init(libperf_print); +	threads = perf_thread_map__new_dummy(); +	if (!threads) { +		fprintf(stderr, "failed to create threads\n"); +		return -1; +	} +	perf_thread_map__set_pid(threads, 0, 0); +	evlist = perf_evlist__new(); +	if (!evlist) { +		fprintf(stderr, "failed to create evlist\n"); +		goto out_threads; +	} +	evsel = perf_evsel__new(&attr1); +	if (!evsel) { +		fprintf(stderr, "failed to create evsel1\n"); +		goto out_evlist; +	} +	perf_evlist__add(evlist, evsel); +	evsel = perf_evsel__new(&attr2); +	if (!evsel) { +		fprintf(stderr, "failed to create evsel2\n"); +		goto out_evlist; +	} +	perf_evlist__add(evlist, evsel); +	perf_evlist__set_maps(evlist, NULL, threads); +	err = perf_evlist__open(evlist); +	if (err) { +		fprintf(stderr, "failed to open evsel\n"); +		goto out_evlist; +	} +	perf_evlist__enable(evlist); +	while (count--); +	perf_evlist__disable(evlist); +	perf_evlist__for_each_evsel(evlist, evsel) { +		perf_evsel__read(evsel, 0, 0, &counts); +		fprintf(stdout, "count %llu, enabled %llu, run %llu\n", +				counts.val, counts.ena, counts.run); +	} +	perf_evlist__close(evlist); +out_evlist: +	perf_evlist__delete(evlist); +out_threads: +	perf_thread_map__put(threads); +	return err; +} diff --git a/tools/lib/perf/include/perf/event.h b/tools/lib/perf/include/perf/event.h index 18106899cb4e..69b44d2cc0f5 100644 --- a/tools/lib/perf/include/perf/event.h +++ b/tools/lib/perf/include/perf/event.h @@ -105,6 +105,12 @@ struct perf_record_bpf_event {  	__u8			 tag[BPF_TAG_SIZE];  // prog tag  }; +struct perf_record_cgroup { +	struct perf_event_header header; +	__u64			 id; +	char			 path[PATH_MAX]; +}; +  struct perf_record_sample {  	struct perf_event_header header;  	__u64			 array[]; @@ -352,6 +358,7 @@ union perf_event {  	struct perf_record_mmap2		mmap2;  	struct perf_record_comm			comm;  	struct perf_record_namespaces		namespaces; +	struct perf_record_cgroup		cgroup;  	struct perf_record_fork			fork;  	struct perf_record_lost			lost;  	struct perf_record_lost_samples		lost_samples; |