On 2015/7/17 19:39, Peter Zijlstra wrote:
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 <xiaka...@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..
What you mean "full perf events"? Even with your code some event still
not work?
Thank you.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/