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 /kernel/hw_breakpoint.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 'kernel/hw_breakpoint.c')
-rw-r--r-- | kernel/hw_breakpoint.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/kernel/hw_breakpoint.c b/kernel/hw_breakpoint.c index d71a987fd2bf..e9c5cfa1fd20 100644 --- a/kernel/hw_breakpoint.c +++ b/kernel/hw_breakpoint.c | |||
@@ -565,6 +565,34 @@ static struct notifier_block hw_breakpoint_exceptions_nb = { | |||
565 | .priority = 0x7fffffff | 565 | .priority = 0x7fffffff |
566 | }; | 566 | }; |
567 | 567 | ||
568 | static void bp_perf_event_destroy(struct perf_event *event) | ||
569 | { | ||
570 | release_bp_slot(event); | ||
571 | } | ||
572 | |||
573 | static int hw_breakpoint_event_init(struct perf_event *bp) | ||
574 | { | ||
575 | int err; | ||
576 | |||
577 | if (bp->attr.type != PERF_TYPE_BREAKPOINT) | ||
578 | return -ENOENT; | ||
579 | |||
580 | err = register_perf_hw_breakpoint(bp); | ||
581 | if (err) | ||
582 | return err; | ||
583 | |||
584 | bp->destroy = bp_perf_event_destroy; | ||
585 | |||
586 | return 0; | ||
587 | } | ||
588 | |||
589 | static struct pmu perf_breakpoint = { | ||
590 | .event_init = hw_breakpoint_event_init, | ||
591 | .enable = arch_install_hw_breakpoint, | ||
592 | .disable = arch_uninstall_hw_breakpoint, | ||
593 | .read = hw_breakpoint_pmu_read, | ||
594 | }; | ||
595 | |||
568 | static int __init init_hw_breakpoint(void) | 596 | static int __init init_hw_breakpoint(void) |
569 | { | 597 | { |
570 | unsigned int **task_bp_pinned; | 598 | unsigned int **task_bp_pinned; |
@@ -586,6 +614,8 @@ static int __init init_hw_breakpoint(void) | |||
586 | 614 | ||
587 | constraints_initialized = 1; | 615 | constraints_initialized = 1; |
588 | 616 | ||
617 | perf_pmu_register(&perf_breakpoint); | ||
618 | |||
589 | return register_die_notifier(&hw_breakpoint_exceptions_nb); | 619 | return register_die_notifier(&hw_breakpoint_exceptions_nb); |
590 | 620 | ||
591 | err_alloc: | 621 | err_alloc: |
@@ -601,8 +631,3 @@ static int __init init_hw_breakpoint(void) | |||
601 | core_initcall(init_hw_breakpoint); | 631 | core_initcall(init_hw_breakpoint); |
602 | 632 | ||
603 | 633 | ||
604 | struct pmu perf_ops_bp = { | ||
605 | .enable = arch_install_hw_breakpoint, | ||
606 | .disable = arch_uninstall_hw_breakpoint, | ||
607 | .read = hw_breakpoint_pmu_read, | ||
608 | }; | ||