aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Rutland <mark.rutland@arm.com>2011-08-11 07:31:20 -0400
committerIngo Molnar <mingo@elte.hu>2011-08-14 05:53:05 -0400
commit7e5b2a01d2ca2eae4ef913b59f84341f9a70e206 (patch)
treee5578bace8c56afd14246208a9e21ed45e4328b7
parent144060fee07e9c22e179d00819c83c86fbcbf82c (diff)
perf: provide PMU when initing events
Currently, an event's 'pmu' field is set after pmu::event_init() is called. This means that pmu::event_init() must figure out which struct pmu the event was initialised from. This makes it difficult to consolidate common event initialisation code for similar PMUs, and very difficult to implement drivers for PMUs which can have multiple instances (e.g. a USB controller PMU, a GPU PMU, etc). This patch sets the 'pmu' field before initialising the event, allowing event init code to identify the struct pmu instance easily. In the event of failure to initialise an event, the event is destroyed via kfree() without calling perf_event::destroy(), so this shouldn't result in bad behaviour even if the destroy field was set before failure to initialise was noted. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Reviewed-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1313062280-19123-1-git-send-email-mark.rutland@arm.com Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--kernel/events/core.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index d4c85425e3a0..adc3ef37b7e8 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -5716,6 +5716,7 @@ struct pmu *perf_init_event(struct perf_event *event)
5716 pmu = idr_find(&pmu_idr, event->attr.type); 5716 pmu = idr_find(&pmu_idr, event->attr.type);
5717 rcu_read_unlock(); 5717 rcu_read_unlock();
5718 if (pmu) { 5718 if (pmu) {
5719 event->pmu = pmu;
5719 ret = pmu->event_init(event); 5720 ret = pmu->event_init(event);
5720 if (ret) 5721 if (ret)
5721 pmu = ERR_PTR(ret); 5722 pmu = ERR_PTR(ret);
@@ -5723,6 +5724,7 @@ struct pmu *perf_init_event(struct perf_event *event)
5723 } 5724 }
5724 5725
5725 list_for_each_entry_rcu(pmu, &pmus, entry) { 5726 list_for_each_entry_rcu(pmu, &pmus, entry) {
5727 event->pmu = pmu;
5726 ret = pmu->event_init(event); 5728 ret = pmu->event_init(event);
5727 if (!ret) 5729 if (!ret)
5728 goto unlock; 5730 goto unlock;
@@ -5849,8 +5851,6 @@ done:
5849 return ERR_PTR(err); 5851 return ERR_PTR(err);
5850 } 5852 }
5851 5853
5852 event->pmu = pmu;
5853
5854 if (!event->parent) { 5854 if (!event->parent) {
5855 if (event->attach_state & PERF_ATTACH_TASK) 5855 if (event->attach_state & PERF_ATTACH_TASK)
5856 jump_label_inc(&perf_sched_events); 5856 jump_label_inc(&perf_sched_events);