aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/perf_event.h10
-rw-r--r--kernel/events/core.c5
2 files changed, 14 insertions, 1 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index cae4a9481777..9fc9b0d31442 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -272,6 +272,11 @@ struct pmu {
272 */ 272 */
273 size_t task_ctx_size; 273 size_t task_ctx_size;
274 274
275
276 /*
277 * Return the count value for a counter.
278 */
279 u64 (*count) (struct perf_event *event); /*optional*/
275}; 280};
276 281
277/** 282/**
@@ -770,6 +775,11 @@ static inline void perf_event_task_sched_out(struct task_struct *prev,
770 __perf_event_task_sched_out(prev, next); 775 __perf_event_task_sched_out(prev, next);
771} 776}
772 777
778static inline u64 __perf_event_count(struct perf_event *event)
779{
780 return local64_read(&event->count) + atomic64_read(&event->child_count);
781}
782
773extern void perf_event_mmap(struct vm_area_struct *vma); 783extern void perf_event_mmap(struct vm_area_struct *vma);
774extern struct perf_guest_info_callbacks *perf_guest_cbs; 784extern struct perf_guest_info_callbacks *perf_guest_cbs;
775extern int perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks); 785extern int perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks);
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 072de3143244..4e8dc596f101 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3194,7 +3194,10 @@ static void __perf_event_read(void *info)
3194 3194
3195static inline u64 perf_event_count(struct perf_event *event) 3195static inline u64 perf_event_count(struct perf_event *event)
3196{ 3196{
3197 return local64_read(&event->count) + atomic64_read(&event->child_count); 3197 if (event->pmu->count)
3198 return event->pmu->count(event);
3199
3200 return __perf_event_count(event);
3198} 3201}
3199 3202
3200static u64 perf_event_read(struct perf_event *event) 3203static u64 perf_event_read(struct perf_event *event)