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.c11
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);