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 <[email protected]> > >>--- > >>+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.. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

