diff options
author | Jakub Kicinski <kuba@kernel.org> | 2024-06-13 13:13:38 -0700 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2024-06-13 13:13:46 -0700 |
commit | 4c7d3d79c736186bb2585f2d0a8231e1fac839da (patch) | |
tree | 5abd973d57d360e24c9df2f17e942176ab2faaa5 /kernel | |
parent | 3ec8d7572a69d142d49f52b28ce8d84e5fef9131 (diff) | |
parent | d20f6b3d747c36889b7ce75ee369182af3decb6b (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Cross-merge networking fixes after downstream PR.
No conflicts, no adjacent changes.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/events/core.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index f0128c5ff278..8f908f077935 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -5384,6 +5384,7 @@ int perf_event_release_kernel(struct perf_event *event) again: mutex_lock(&event->child_mutex); list_for_each_entry(child, &event->child_list, child_list) { + void *var = NULL; /* * Cannot change, child events are not migrated, see the @@ -5424,11 +5425,23 @@ again: * this can't be the last reference. */ put_event(event); + } else { + var = &ctx->refcount; } mutex_unlock(&event->child_mutex); mutex_unlock(&ctx->mutex); put_ctx(ctx); + + if (var) { + /* + * If perf_event_free_task() has deleted all events from the + * ctx while the child_mutex got released above, make sure to + * notify about the preceding put_ctx(). + */ + smp_mb(); /* pairs with wait_var_event() */ + wake_up_var(var); + } goto again; } mutex_unlock(&event->child_mutex); |