From: tip-bot for Peter Zijlstra <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: acme@kernel.org, peterz@infradead.org, jolsa@redhat.com,
mingo@kernel.org, torvalds@linux-foundation.org,
eranian@gmail.com, hpa@zytor.com, tglx@linutronix.de,
linux-kernel@vger.kernel.org, vincent.weaver@maine.edu
Subject: [tip:perf/core] perf: Fix put_event() ctx lock
Date: Wed, 4 Feb 2015 06:39:56 -0800 [thread overview]
Message-ID: <tip-a83fe28e2e45392464858a96745db26ac73670c8@git.kernel.org> (raw)
In-Reply-To: <20150129134434.GB26304@twins.programming.kicks-ass.net>
Commit-ID: a83fe28e2e45392464858a96745db26ac73670c8
Gitweb: http://git.kernel.org/tip/a83fe28e2e45392464858a96745db26ac73670c8
Author: Peter Zijlstra <peterz@infradead.org>
AuthorDate: Thu, 29 Jan 2015 14:44:34 +0100
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 4 Feb 2015 08:07:12 +0100
perf: Fix put_event() ctx lock
So what I suspect; but I'm in zombie mode today it seems; is that while
I initially thought that it was impossible for ctx to change when
refcount dropped to 0, I now suspect its possible.
Note that until perf_remove_from_context() the event is still active and
visible on the lists. So a concurrent sys_perf_event_open() from another
task into this task can race.
Reported-by: Vince Weaver <vincent.weaver@maine.edu>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Stephane Eranian <eranian@gmail.com>
Cc: mark.rutland@arm.com
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/20150129134434.GB26304@twins.programming.kicks-ass.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
kernel/events/core.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 142dbabc..f773fa1 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -947,7 +947,8 @@ static void put_ctx(struct perf_event_context *ctx)
* perf_event::mmap_mutex
* mmap_sem
*/
-static struct perf_event_context *perf_event_ctx_lock(struct perf_event *event)
+static struct perf_event_context *
+perf_event_ctx_lock_nested(struct perf_event *event, int nesting)
{
struct perf_event_context *ctx;
@@ -960,7 +961,7 @@ again:
}
rcu_read_unlock();
- mutex_lock(&ctx->mutex);
+ mutex_lock_nested(&ctx->mutex, nesting);
if (event->ctx != ctx) {
mutex_unlock(&ctx->mutex);
put_ctx(ctx);
@@ -970,6 +971,12 @@ again:
return ctx;
}
+static inline struct perf_event_context *
+perf_event_ctx_lock(struct perf_event *event)
+{
+ return perf_event_ctx_lock_nested(event, 0);
+}
+
static void perf_event_ctx_unlock(struct perf_event *event,
struct perf_event_context *ctx)
{
@@ -3572,7 +3579,7 @@ static void perf_remove_from_owner(struct perf_event *event)
*/
static void put_event(struct perf_event *event)
{
- struct perf_event_context *ctx = event->ctx;
+ struct perf_event_context *ctx;
if (!atomic_long_dec_and_test(&event->refcount))
return;
@@ -3580,7 +3587,6 @@ static void put_event(struct perf_event *event)
if (!is_kernel_event(event))
perf_remove_from_owner(event);
- WARN_ON_ONCE(ctx->parent_ctx);
/*
* There are two ways this annotation is useful:
*
@@ -3593,7 +3599,8 @@ static void put_event(struct perf_event *event)
* the last filedesc died, so there is no possibility
* to trigger the AB-BA case.
*/
- mutex_lock_nested(&ctx->mutex, SINGLE_DEPTH_NESTING);
+ ctx = perf_event_ctx_lock_nested(event, SINGLE_DEPTH_NESTING);
+ WARN_ON_ONCE(ctx->parent_ctx);
perf_remove_from_context(event, true);
mutex_unlock(&ctx->mutex);
next prev parent reply other threads:[~2015-02-04 14:40 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-23 12:51 [RFC][PATCH 0/3] perf fixes Peter Zijlstra
2015-01-23 12:52 ` [RFC][PATCH 1/3] perf: Tighten (and fix) the grouping condition Peter Zijlstra
2015-01-23 15:02 ` Mark Rutland
2015-01-23 15:07 ` Peter Zijlstra
2015-01-23 15:22 ` Mark Rutland
2015-02-04 12:59 ` Peter Zijlstra
2015-01-28 14:30 ` [tip:perf/urgent] " tip-bot for Peter Zijlstra
2015-01-23 12:52 ` [RFC][PATCH 2/3] perf: Add a bit of paranoia Peter Zijlstra
2015-01-26 16:26 ` Peter Zijlstra
2015-01-27 21:28 ` Vince Weaver
2015-01-29 2:16 ` Vince Weaver
2015-01-29 7:51 ` Jiri Olsa
2015-01-29 13:44 ` Peter Zijlstra
2015-02-04 14:39 ` tip-bot for Peter Zijlstra [this message]
2015-01-29 14:47 ` Peter Zijlstra
2015-02-02 6:33 ` Vince Weaver
2015-02-02 15:42 ` Peter Zijlstra
2015-02-02 17:32 ` Peter Zijlstra
2015-02-04 14:51 ` Jiri Olsa
2015-02-04 16:33 ` Peter Zijlstra
2015-02-04 16:43 ` Peter Zijlstra
2015-02-04 14:39 ` [tip:perf/core] perf: Fix move_group() order tip-bot for Peter Zijlstra (Intel)
2015-02-04 14:39 ` [tip:perf/core] perf: Add a bit of paranoia tip-bot for Peter Zijlstra
2015-01-23 12:52 ` [RFC][PATCH 3/3] perf: Fix event->ctx locking Peter Zijlstra
2015-02-04 14:39 ` [tip:perf/core] " tip-bot for Peter Zijlstra
2015-01-26 14:30 ` [RFC][PATCH 0/3] perf fixes Vince Weaver
2015-01-26 18:03 ` Vince Weaver
2015-01-26 18:34 ` Jiri Olsa
2015-01-26 18:52 ` Vince Weaver
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=tip-a83fe28e2e45392464858a96745db26ac73670c8@git.kernel.org \
--to=tipbot@zytor.com \
--cc=acme@kernel.org \
--cc=eranian@gmail.com \
--cc=hpa@zytor.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=vincent.weaver@maine.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.