aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/events/core.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index b01dfb602db1..bb1a7c36e794 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -7036,12 +7036,23 @@ EXPORT_SYMBOL_GPL(perf_pmu_unregister);
7036 7036
7037static int perf_try_init_event(struct pmu *pmu, struct perf_event *event) 7037static int perf_try_init_event(struct pmu *pmu, struct perf_event *event)
7038{ 7038{
7039 struct perf_event_context *ctx = NULL;
7039 int ret; 7040 int ret;
7040 7041
7041 if (!try_module_get(pmu->module)) 7042 if (!try_module_get(pmu->module))
7042 return -ENODEV; 7043 return -ENODEV;
7044
7045 if (event->group_leader != event) {
7046 ctx = perf_event_ctx_lock(event->group_leader);
7047 BUG_ON(!ctx);
7048 }
7049
7043 event->pmu = pmu; 7050 event->pmu = pmu;
7044 ret = pmu->event_init(event); 7051 ret = pmu->event_init(event);
7052
7053 if (ctx)
7054 perf_event_ctx_unlock(event->group_leader, ctx);
7055
7045 if (ret) 7056 if (ret)
7046 module_put(pmu->module); 7057 module_put(pmu->module);
7047 7058