diff options
Diffstat (limited to 'kernel/events/core.c')
-rw-r--r-- | kernel/events/core.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 01d4fe68e57b..cb8744a1b120 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -1761,7 +1761,16 @@ static int __perf_event_enable(void *info) | |||
1761 | struct perf_cpu_context *cpuctx = __get_cpu_context(ctx); | 1761 | struct perf_cpu_context *cpuctx = __get_cpu_context(ctx); |
1762 | int err; | 1762 | int err; |
1763 | 1763 | ||
1764 | if (WARN_ON_ONCE(!ctx->is_active)) | 1764 | /* |
1765 | * There's a time window between 'ctx->is_active' check | ||
1766 | * in perf_event_enable function and this place having: | ||
1767 | * - IRQs on | ||
1768 | * - ctx->lock unlocked | ||
1769 | * | ||
1770 | * where the task could be killed and 'ctx' deactivated | ||
1771 | * by perf_event_exit_task. | ||
1772 | */ | ||
1773 | if (!ctx->is_active) | ||
1765 | return -EINVAL; | 1774 | return -EINVAL; |
1766 | 1775 | ||
1767 | raw_spin_lock(&ctx->lock); | 1776 | raw_spin_lock(&ctx->lock); |