|
@@ -7036,12 +7036,23 @@ EXPORT_SYMBOL_GPL(perf_pmu_unregister);
|
|
|
|
|
|
static int perf_try_init_event(struct pmu *pmu, struct perf_event *event)
|
|
|
{
|
|
|
+ struct perf_event_context *ctx = NULL;
|
|
|
int ret;
|
|
|
|
|
|
if (!try_module_get(pmu->module))
|
|
|
return -ENODEV;
|
|
|
+
|
|
|
+ if (event->group_leader != event) {
|
|
|
+ ctx = perf_event_ctx_lock(event->group_leader);
|
|
|
+ BUG_ON(!ctx);
|
|
|
+ }
|
|
|
+
|
|
|
event->pmu = pmu;
|
|
|
ret = pmu->event_init(event);
|
|
|
+
|
|
|
+ if (ctx)
|
|
|
+ perf_event_ctx_unlock(event->group_leader, ctx);
|
|
|
+
|
|
|
if (ret)
|
|
|
module_put(pmu->module);
|
|
|
|