-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Current libperf man pages mention file counting.c "coming with libperf package", however, the file is missing. Add the file then. Fixes: 81de3bf ("libperf: Add man pages") Signed-off-by: Michael Petlan <mpetlan@redhat.com> Acked-by: Jiri Olsa <jolsa@redhat.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> LPU-Reference: 20200227194424.28210-1-mpetlan@redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
- Loading branch information
Michael Petlan
authored and
Arnaldo Carvalho de Melo
committed
Mar 4, 2020
1 parent
dabce16
commit 76ce026
Showing
1 changed file
with
83 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} |