Messages in this thread | | | Date | Fri, 17 Jul 2015 13:39:24 +0200 | From | Peter Zijlstra <> | Subject | Re: [RFC PATCH 5/6] bpf: Implement function bpf_read_pmu() that get the selected hardware PMU conuter |
| |
On Fri, Jul 17, 2015 at 07:29:07PM +0800, Wangnan (F) wrote: > > > On 2015/7/17 19:05, Peter Zijlstra wrote: > >On Fri, Jul 17, 2015 at 06:43:35PM +0800, kaixu xia wrote: > >>The function bpf_read_pmu() can get the specific map key, convert > >>the corresponding map value to the pointer to struct perf_event and > >>return the Hardware PMU counter value. > >Thanks for having me on Cc :/ > > > >>Signed-off-by: kaixu xia <xiakaixu@huawei.com> > >>--- > >>+static u64 bpf_read_pmu(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5) > >>+{ > >>+ void *value = (void *) (unsigned long) r1; > >>+ struct perf_event *event; > >>+ u64 count; > >>+ > >>+ if (!value || !(*(unsigned long *)value)) > >>+ return 0; > >>+ > >>+ event = (struct perf_event *)(*(unsigned long *)value); > >>+ > >>+ if (event->state == PERF_EVENT_STATE_ACTIVE) > >>+ event->pmu->read(event); > >>+ > >>+ count = local64_read(&event->count); > >>+ > >>+ return count; > >>+} > >Hell no, that's way broken. > What about calling perf_event_read_value() then?
Depends on what all you need, if you need full perf events to work then yes perf_event_read_value() is your only option.
But note that that requires scheduling, so you cannot actually use it for tracing purposes etc..
| |