diff options
-rw-r--r-- | kernel/events/core.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index b4a696c4dc76..b358cb38e4a5 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -1275,6 +1275,8 @@ static void perf_group_attach(struct perf_event *event) | |||
1275 | if (group_leader == event) | 1275 | if (group_leader == event) |
1276 | return; | 1276 | return; |
1277 | 1277 | ||
1278 | WARN_ON_ONCE(group_leader->ctx != event->ctx); | ||
1279 | |||
1278 | if (group_leader->group_flags & PERF_GROUP_SOFTWARE && | 1280 | if (group_leader->group_flags & PERF_GROUP_SOFTWARE && |
1279 | !is_software_event(event)) | 1281 | !is_software_event(event)) |
1280 | group_leader->group_flags &= ~PERF_GROUP_SOFTWARE; | 1282 | group_leader->group_flags &= ~PERF_GROUP_SOFTWARE; |
@@ -1296,6 +1298,10 @@ static void | |||
1296 | list_del_event(struct perf_event *event, struct perf_event_context *ctx) | 1298 | list_del_event(struct perf_event *event, struct perf_event_context *ctx) |
1297 | { | 1299 | { |
1298 | struct perf_cpu_context *cpuctx; | 1300 | struct perf_cpu_context *cpuctx; |
1301 | |||
1302 | WARN_ON_ONCE(event->ctx != ctx); | ||
1303 | lockdep_assert_held(&ctx->lock); | ||
1304 | |||
1299 | /* | 1305 | /* |
1300 | * We can have double detach due to exit/hot-unplug + close. | 1306 | * We can have double detach due to exit/hot-unplug + close. |
1301 | */ | 1307 | */ |
@@ -1380,6 +1386,8 @@ static void perf_group_detach(struct perf_event *event) | |||
1380 | 1386 | ||
1381 | /* Inherit group flags from the previous leader */ | 1387 | /* Inherit group flags from the previous leader */ |
1382 | sibling->group_flags = event->group_flags; | 1388 | sibling->group_flags = event->group_flags; |
1389 | |||
1390 | WARN_ON_ONCE(sibling->ctx != event->ctx); | ||
1383 | } | 1391 | } |
1384 | 1392 | ||
1385 | out: | 1393 | out: |
@@ -1442,6 +1450,10 @@ event_sched_out(struct perf_event *event, | |||
1442 | { | 1450 | { |
1443 | u64 tstamp = perf_event_time(event); | 1451 | u64 tstamp = perf_event_time(event); |
1444 | u64 delta; | 1452 | u64 delta; |
1453 | |||
1454 | WARN_ON_ONCE(event->ctx != ctx); | ||
1455 | lockdep_assert_held(&ctx->lock); | ||
1456 | |||
1445 | /* | 1457 | /* |
1446 | * An event which could not be activated because of | 1458 | * An event which could not be activated because of |
1447 | * filter mismatch still needs to have its timings | 1459 | * filter mismatch still needs to have its timings |
@@ -7822,14 +7834,19 @@ static void perf_free_event(struct perf_event *event, | |||
7822 | 7834 | ||
7823 | put_event(parent); | 7835 | put_event(parent); |
7824 | 7836 | ||
7837 | raw_spin_lock_irq(&ctx->lock); | ||
7825 | perf_group_detach(event); | 7838 | perf_group_detach(event); |
7826 | list_del_event(event, ctx); | 7839 | list_del_event(event, ctx); |
7840 | raw_spin_unlock_irq(&ctx->lock); | ||
7827 | free_event(event); | 7841 | free_event(event); |
7828 | } | 7842 | } |
7829 | 7843 | ||
7830 | /* | 7844 | /* |
7831 | * free an unexposed, unused context as created by inheritance by | 7845 | * Free an unexposed, unused context as created by inheritance by |
7832 | * perf_event_init_task below, used by fork() in case of fail. | 7846 | * perf_event_init_task below, used by fork() in case of fail. |
7847 | * | ||
7848 | * Not all locks are strictly required, but take them anyway to be nice and | ||
7849 | * help out with the lockdep assertions. | ||
7833 | */ | 7850 | */ |
7834 | void perf_event_free_task(struct task_struct *task) | 7851 | void perf_event_free_task(struct task_struct *task) |
7835 | { | 7852 | { |