aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/perf_event.c
diff options
context:
space:
mode:
authorPeter Zijlstra <a.p.zijlstra@chello.nl>2010-06-11 07:35:08 -0400
committerIngo Molnar <mingo@elte.hu>2010-09-09 14:46:28 -0400
commitb0a873ebbf87bf38bf70b5e39a7cadc96099fa13 (patch)
tree63ab672b847aed295f99b9b2a3bbcfd5d3d35bd9 /arch/arm/kernel/perf_event.c
parent51b0fe39549a04858001922919ab355dee9bdfcf (diff)
perf: Register PMU implementations
Simple registration interface for struct pmu, this provides the infrastructure for removing all the weak functions. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: paulus <paulus@samba.org> Cc: stephane eranian <eranian@googlemail.com> Cc: Robert Richter <robert.richter@amd.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Paul Mundt <lethal@linux-sh.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Cyrill Gorcunov <gorcunov@gmail.com> Cc: Lin Ming <ming.m.lin@intel.com> Cc: Yanmin <yanmin_zhang@linux.intel.com> Cc: Deng-Cheng Zhu <dengcheng.zhu@gmail.com> Cc: David Miller <davem@davemloft.net> Cc: Michael Cree <mcree@orcon.net.nz> LKML-Reference: <new-submission> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/arm/kernel/perf_event.c')
-rw-r--r--arch/arm/kernel/perf_event.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c
index 0671e92c5111..f62f9db35db3 100644
--- a/arch/arm/kernel/perf_event.c
+++ b/arch/arm/kernel/perf_event.c
@@ -306,12 +306,7 @@ out:
306 return err; 306 return err;
307} 307}
308 308
309static struct pmu pmu = { 309static struct pmu pmu;
310 .enable = armpmu_enable,
311 .disable = armpmu_disable,
312 .unthrottle = armpmu_unthrottle,
313 .read = armpmu_read,
314};
315 310
316static int 311static int
317validate_event(struct cpu_hw_events *cpuc, 312validate_event(struct cpu_hw_events *cpuc,
@@ -491,20 +486,29 @@ __hw_perf_event_init(struct perf_event *event)
491 return err; 486 return err;
492} 487}
493 488
494struct pmu * 489static int armpmu_event_init(struct perf_event *event)
495hw_perf_event_init(struct perf_event *event)
496{ 490{
497 int err = 0; 491 int err = 0;
498 492
493 switch (event->attr.type) {
494 case PERF_TYPE_RAW:
495 case PERF_TYPE_HARDWARE:
496 case PERF_TYPE_HW_CACHE:
497 break;
498
499 default:
500 return -ENOENT;
501 }
502
499 if (!armpmu) 503 if (!armpmu)
500 return ERR_PTR(-ENODEV); 504 return -ENODEV;
501 505
502 event->destroy = hw_perf_event_destroy; 506 event->destroy = hw_perf_event_destroy;
503 507
504 if (!atomic_inc_not_zero(&active_events)) { 508 if (!atomic_inc_not_zero(&active_events)) {
505 if (atomic_read(&active_events) > perf_max_events) { 509 if (atomic_read(&active_events) > perf_max_events) {
506 atomic_dec(&active_events); 510 atomic_dec(&active_events);
507 return ERR_PTR(-ENOSPC); 511 return -ENOSPC;
508 } 512 }
509 513
510 mutex_lock(&pmu_reserve_mutex); 514 mutex_lock(&pmu_reserve_mutex);
@@ -518,15 +522,23 @@ hw_perf_event_init(struct perf_event *event)
518 } 522 }
519 523
520 if (err) 524 if (err)
521 return ERR_PTR(err); 525 return err;
522 526
523 err = __hw_perf_event_init(event); 527 err = __hw_perf_event_init(event);
524 if (err) 528 if (err)
525 hw_perf_event_destroy(event); 529 hw_perf_event_destroy(event);
526 530
527 return err ? ERR_PTR(err) : &pmu; 531 return err;
528} 532}
529 533
534static struct pmu pmu = {
535 .event_init = armpmu_event_init,
536 .enable = armpmu_enable,
537 .disable = armpmu_disable,
538 .unthrottle = armpmu_unthrottle,
539 .read = armpmu_read,
540};
541
530void 542void
531hw_perf_enable(void) 543hw_perf_enable(void)
532{ 544{
@@ -2994,6 +3006,8 @@ init_hw_perf_events(void)
2994 perf_max_events = -1; 3006 perf_max_events = -1;
2995 } 3007 }
2996 3008
3009 perf_pmu_register(&pmu);
3010
2997 return 0; 3011 return 0;
2998} 3012}
2999arch_initcall(init_hw_perf_events); 3013arch_initcall(init_hw_perf_events);