diff options
author | Peter Zijlstra <peterz@infradead.org> | 2016-02-24 18:45:40 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-02-25 08:42:32 +0100 |
commit | 84c4e620d35f49f486a900af214ad12276afb386 (patch) | |
tree | 3cc7f2e5f4c470e9b51efb7e0fe42312e2c83404 /scripts/kernel-doc | |
parent | 6dc390ad61ac8dfca5fa9b0823981fb6f7ec17a0 (diff) | |
download | blackbird-op-linux-84c4e620d35f49f486a900af214ad12276afb386.tar.gz blackbird-op-linux-84c4e620d35f49f486a900af214ad12276afb386.zip |
perf: Close install vs. exit race
Consider the following scenario:
CPU0 CPU1
ctx = find_get_ctx();
perf_event_exit_task_context()
mutex_lock(&ctx->mutex);
perf_install_in_context(ctx, ...);
/* NO-OP */
mutex_unlock(&ctx->mutex);
...
perf_release()
WARN_ON_ONCE(event->state != STATE_EXIT);
Since the event doesn't pass through perf_remove_from_context()
because perf_install_in_context() NO-OPs because the ctx is dead, and
perf_event_exit_task_context() will not observe the event because its
not attached yet, the event->state will not be set.
Solve this by revalidating ctx->task after we acquire ctx->mutex and
failing the event creation as a whole.
Tested-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: dvyukov@google.com
Cc: eranian@google.com
Cc: oleg@redhat.com
Cc: panand@redhat.com
Cc: sasha.levin@oracle.com
Cc: vince@deater.net
Link: http://lkml.kernel.org/r/20160224174947.626853419@infradead.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'scripts/kernel-doc')
0 files changed, 0 insertions, 0 deletions