static int bts_event_init(struct perf_event *event) { int ret; if (event->attr.type != bts_pmu.type) return -ENOENT; if (x86_add_exclusive(x86_lbr_exclusive_bts)) return -EBUSY; /* * BTS leaks kernel addresses even when CPL0 tracing is * disabled, so disallow intel_bts driver for unprivileged * users on paranoid systems since it provides trace data * to the user in a zero-copy fashion. * * Note that the default paranoia setting permits unprivileged * users to profile the kernel. */ if (event->attr.exclude_kernel && perf_paranoid_kernel() && !capable(CAP_SYS_ADMIN)) return -EACCES; ret = x86_reserve_hardware(); if (ret) { x86_del_exclusive(x86_lbr_exclusive_bts); return ret; } event->destroy = bts_event_destroy; return 0; }
static int bts_event_init(struct perf_event *event) { int ret; if (event->attr.type != bts_pmu.type) return -ENOENT; if (x86_add_exclusive(x86_lbr_exclusive_bts)) return -EBUSY; ret = x86_reserve_hardware(); if (ret) { x86_del_exclusive(x86_lbr_exclusive_bts); return ret; } event->destroy = bts_event_destroy; return 0; }
static void bts_event_destroy(struct perf_event *event) { x86_del_exclusive(x86_lbr_exclusive_bts); }
static void bts_event_destroy(struct perf_event *event) { x86_release_hardware(); x86_del_exclusive(x86_lbr_exclusive_bts); }