On Wed, Feb 24, 2016 at 03:02:39PM +0100, Peter Zijlstra wrote: > FWIW, it would be nice to have a similar test for: > > attr = { > .disabled = true; > } > > sys_perf_event_open(&attr, .pid = self); > > if (attr.disabled) > ioctl(ENABLE); > > /* generate N events */ > > ioctl(DISABLE); > > read(); > > /* print event cnt and scale factors */ > > and one that has .disabled = false.
root@ivb-ep:~/perf# ./main 1000000903 218851613 218851613 root@ivb-ep:~/perf# ./main 1 1000000235 218981231 218981231 Appears to work... --- #define _GNU_SOURCE #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include "perf.h" static struct perf_event_attr perf_attr = { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_INSTRUCTIONS, .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | PERF_FORMAT_TOTAL_TIME_RUNNING, .exclude_kernel = 1, .pinned = 1, }; void die(const char *err, ...) { va_list params; va_start(params, err); vfprintf(stderr, err, params); va_end(params); exit(-1); } int main (int argc, char **argv) { u64 val[3]; int i, fd; perf_attr.disabled = argc > 1; fd = sys_perf_event_open(&perf_attr, 0, -1, -1, 0); if (fd < 0) die("failed to create perf_event"); if (perf_attr.disabled) ioctl(fd, PERF_EVENT_IOC_ENABLE, 0); for (i = 0; i < 100000000; i++) { asm volatile ("nop\n\r" "nop\n\r" "nop\n\r" "nop\n\r" "nop\n\r" "nop\n\r" "nop\n\r"); } ioctl(fd, PERF_EVENT_IOC_DISABLE, 0); read(fd, &val, sizeof(val)); printf("%Lu %Lu %Lu\n", val[0], val[1], val[2]); return 0; }