Back to home page

OSCL-LXR

 
 

    


0001 #include <linux/perf_event.h>
0002 #include <perf/evlist.h>
0003 #include <perf/evsel.h>
0004 #include <perf/cpumap.h>
0005 #include <perf/threadmap.h>
0006 #include <perf/mmap.h>
0007 #include <perf/core.h>
0008 #include <perf/event.h>
0009 #include <stdio.h>
0010 #include <unistd.h>
0011 
0012 static int libperf_print(enum libperf_print_level level,
0013                          const char *fmt, va_list ap)
0014 {
0015     return vfprintf(stderr, fmt, ap);
0016 }
0017 
0018 union u64_swap {
0019     __u64 val64;
0020     __u32 val32[2];
0021 };
0022 
0023 int main(int argc, char **argv)
0024 {
0025     struct perf_evlist *evlist;
0026     struct perf_evsel *evsel;
0027     struct perf_mmap *map;
0028     struct perf_cpu_map *cpus;
0029     struct perf_event_attr attr = {
0030         .type        = PERF_TYPE_HARDWARE,
0031         .config      = PERF_COUNT_HW_CPU_CYCLES,
0032         .disabled    = 1,
0033         .freq        = 1,
0034         .sample_freq = 10,
0035         .sample_type = PERF_SAMPLE_IP|PERF_SAMPLE_TID|PERF_SAMPLE_CPU|PERF_SAMPLE_PERIOD,
0036     };
0037     int err = -1;
0038     union perf_event *event;
0039 
0040     libperf_init(libperf_print);
0041 
0042     cpus = perf_cpu_map__new(NULL);
0043     if (!cpus) {
0044         fprintf(stderr, "failed to create cpus\n");
0045         return -1;
0046     }
0047 
0048     evlist = perf_evlist__new();
0049     if (!evlist) {
0050         fprintf(stderr, "failed to create evlist\n");
0051         goto out_cpus;
0052     }
0053 
0054     evsel = perf_evsel__new(&attr);
0055     if (!evsel) {
0056         fprintf(stderr, "failed to create cycles\n");
0057         goto out_cpus;
0058     }
0059 
0060     perf_evlist__add(evlist, evsel);
0061 
0062     perf_evlist__set_maps(evlist, cpus, NULL);
0063 
0064     err = perf_evlist__open(evlist);
0065     if (err) {
0066         fprintf(stderr, "failed to open evlist\n");
0067         goto out_evlist;
0068     }
0069 
0070     err = perf_evlist__mmap(evlist, 4);
0071     if (err) {
0072         fprintf(stderr, "failed to mmap evlist\n");
0073         goto out_evlist;
0074     }
0075 
0076     perf_evlist__enable(evlist);
0077     sleep(3);
0078     perf_evlist__disable(evlist);
0079 
0080     perf_evlist__for_each_mmap(evlist, map, false) {
0081         if (perf_mmap__read_init(map) < 0)
0082             continue;
0083 
0084         while ((event = perf_mmap__read_event(map)) != NULL) {
0085             int cpu, pid, tid;
0086             __u64 ip, period, *array;
0087             union u64_swap u;
0088 
0089             array = event->sample.array;
0090 
0091             ip = *array;
0092             array++;
0093 
0094             u.val64 = *array;
0095             pid = u.val32[0];
0096             tid = u.val32[1];
0097             array++;
0098 
0099             u.val64 = *array;
0100             cpu = u.val32[0];
0101             array++;
0102 
0103             period = *array;
0104 
0105             fprintf(stdout, "cpu %3d, pid %6d, tid %6d, ip %20llx, period %20llu\n",
0106                 cpu, pid, tid, ip, period);
0107 
0108             perf_mmap__consume(map);
0109         }
0110 
0111         perf_mmap__read_done(map);
0112     }
0113 
0114 out_evlist:
0115     perf_evlist__delete(evlist);
0116 out_cpus:
0117     perf_cpu_map__put(cpus);
0118     return err;
0119 }