diff options
Diffstat (limited to 'kernel/events/core.c')
-rw-r--r-- | kernel/events/core.c | 26 |
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, | |||
4474 | static void perf_event_task_event(struct perf_task_event *task_event) | 4474 | static 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 | } | ||
4497 | next: | 4496 | next: |
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 | } |