aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/events/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/events/core.c')
-rw-r--r--kernel/events/core.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 6b41c1899a8b..38b68a05c3c6 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -4474,7 +4474,7 @@ static void perf_event_task_ctx(struct perf_event_context *ctx,
4474static void perf_event_task_event(struct perf_task_event *task_event) 4474static void perf_event_task_event(struct perf_task_event *task_event)
4475{ 4475{
4476 struct perf_cpu_context *cpuctx; 4476 struct perf_cpu_context *cpuctx;
4477 struct perf_event_context *ctx; 4477 struct perf_event_context *ctx, *task_ctx = task_event->task_ctx;
4478 struct pmu *pmu; 4478 struct pmu *pmu;
4479 int ctxn; 4479 int ctxn;
4480 4480
@@ -4485,20 +4485,22 @@ static void perf_event_task_event(struct perf_task_event *task_event)
4485 goto next; 4485 goto next;
4486 perf_event_task_ctx(&cpuctx->ctx, task_event); 4486 perf_event_task_ctx(&cpuctx->ctx, task_event);
4487 4487
4488 ctx = task_event->task_ctx; 4488 if (task_ctx)
4489 if (!ctx) { 4489 goto next;
4490 ctxn = pmu->task_ctx_nr; 4490 ctxn = pmu->task_ctx_nr;
4491 if (ctxn < 0) 4491 if (ctxn < 0)
4492 goto next; 4492 goto next;
4493 ctx = rcu_dereference(current->perf_event_ctxp[ctxn]); 4493 ctx = rcu_dereference(current->perf_event_ctxp[ctxn]);
4494 if (ctx) 4494 if (ctx)
4495 perf_event_task_ctx(ctx, task_event); 4495 perf_event_task_ctx(ctx, task_event);
4496 }
4497next: 4496next:
4498 put_cpu_ptr(pmu->pmu_cpu_context); 4497 put_cpu_ptr(pmu->pmu_cpu_context);
4499 } 4498 }
4500 if (task_event->task_ctx) 4499 if (task_ctx) {
4501 perf_event_task_ctx(task_event->task_ctx, task_event); 4500 preempt_disable();
4501 perf_event_task_ctx(task_ctx, task_event);
4502 preempt_enable();
4503 }
4502 4504
4503 rcu_read_unlock(); 4505 rcu_read_unlock();
4504} 4506}