diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2010-06-11 07:35:08 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-09-09 14:46:28 -0400 |
commit | b0a873ebbf87bf38bf70b5e39a7cadc96099fa13 (patch) | |
tree | 63ab672b847aed295f99b9b2a3bbcfd5d3d35bd9 /arch/arm/kernel/perf_event.c | |
parent | 51b0fe39549a04858001922919ab355dee9bdfcf (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.c | 38 |
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 | ||
309 | static struct pmu pmu = { | 309 | static struct pmu pmu; |
310 | .enable = armpmu_enable, | ||
311 | .disable = armpmu_disable, | ||
312 | .unthrottle = armpmu_unthrottle, | ||
313 | .read = armpmu_read, | ||
314 | }; | ||
315 | 310 | ||
316 | static int | 311 | static int |
317 | validate_event(struct cpu_hw_events *cpuc, | 312 | validate_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 | ||
494 | struct pmu * | 489 | static int armpmu_event_init(struct perf_event *event) |
495 | hw_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 | ||
534 | static 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 | |||
530 | void | 542 | void |
531 | hw_perf_enable(void) | 543 | hw_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 | } |
2999 | arch_initcall(init_hw_perf_events); | 3013 | arch_initcall(init_hw_perf_events); |