From: Peter Zijlstra <peterz@infradead.org>
To: mark.rutland@arm.com, mingo@kernel.org, acme@redhat.com,
tglx@linutronix.de, brueckner@linux.ibm.com,
torvalds@linux-foundation.org,
alexander.shishkin@linux.intel.com, heiko.carstens@de.ibm.com,
tmricht@linux.ibm.com, schwidefsky@de.ibm.com,
linux-kernel@vger.kernel.org, keescook@chromium.org,
jolsa@redhat.com, hpa@zytor.com
Cc: linux-tip-commits@vger.kernel.org
Subject: Re: [tip:perf/urgent] perf/core: Fix perf_event_disable_inatomic() race
Date: Thu, 11 Apr 2019 15:04:34 +0200 [thread overview]
Message-ID: <20190411130434.GD11158@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <tip-86071b11317550d994b55ce5e31aa06bcad783b5@git.kernel.org>
On Wed, Apr 10, 2019 at 05:13:54AM -0700, tip-bot for Peter Zijlstra wrote:
> Commit-ID: 86071b11317550d994b55ce5e31aa06bcad783b5
> Gitweb: https://git.kernel.org/tip/86071b11317550d994b55ce5e31aa06bcad783b5
> Author: Peter Zijlstra <peterz@infradead.org>
> AuthorDate: Thu, 4 Apr 2019 15:03:00 +0200
> Committer: Ingo Molnar <mingo@kernel.org>
> CommitDate: Wed, 10 Apr 2019 13:47:09 +0200
>
> perf/core: Fix perf_event_disable_inatomic() race
>
> Thomas-Mich Richter reported he triggered a WARN()ing from event_function_local()
> on his s390. The problem boils down to:
>
> CPU-A CPU-B
>
> perf_event_overflow()
> perf_event_disable_inatomic()
> @pending_disable = 1
> irq_work_queue();
>
> sched-out
> event_sched_out()
> @pending_disable = 0
>
> sched-in
> perf_event_overflow()
> perf_event_disable_inatomic()
> @pending_disable = 1;
> irq_work_queue(); // FAILS
>
> irq_work_run()
> perf_pending_event()
> if (@pending_disable)
> perf_event_disable_local(); // WHOOPS
>
> The problem exists in generic, but s390 is particularly sensitive
> because it doesn't implement arch_irq_work_raise(), nor does it call
> irq_work_run() from it's PMU interrupt handler (nor would that be
> sufficient in this case, because s390 also generates
> perf_event_overflow() from pmu::stop). Add to that the fact that s390
> is a virtual architecture and (virtual) CPU-A can stall long enough
> for the above race to happen, even if it would self-IPI.
>
> Adding a irq_work_sync() to event_sched_in() would work for all hardare
> PMUs that properly use irq_work_run() but fails for software PMUs.
>
> Instead encode the CPU number in @pending_disable, such that we can
> tell which CPU requested the disable. This then allows us to detect
> the above scenario and even redirect the IPI to make up for the failed
> queue.
Ingo, could you please fold in the below delta? It turns out I
overlooked two insteances :-(
--- a/kernel/events/ring_buffer.c
+++ b/kernel/events/ring_buffer.c
@@ -392,7 +392,7 @@ void *perf_aux_output_begin(struct perf_
* store that will be enabled on successful return
*/
if (!handle->size) { /* A, matches D */
- event->pending_disable = 1;
+ event->pending_disable = smp_processor_id();
perf_output_wakeup(handle);
local_set(&rb->aux_nest, 0);
goto err_put;
@@ -480,7 +480,7 @@ void perf_aux_output_end(struct perf_out
if (wakeup) {
if (handle->aux_flags & PERF_AUX_FLAG_TRUNCATED)
- handle->event->pending_disable = 1;
+ handle->event->pending_disable = smp_processor_id();
perf_output_wakeup(handle);
}
next parent reply other threads:[~2019-04-11 13:04 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <tip-86071b11317550d994b55ce5e31aa06bcad783b5@git.kernel.org>
2019-04-11 13:04 ` Peter Zijlstra [this message]
2019-04-12 6:55 ` [tip:perf/urgent] perf/core: Fix perf_event_disable_inatomic() race Ingo Molnar
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=20190411130434.GD11158@hirez.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=acme@redhat.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=brueckner@linux.ibm.com \
--cc=heiko.carstens@de.ibm.com \
--cc=hpa@zytor.com \
--cc=jolsa@redhat.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@kernel.org \
--cc=schwidefsky@de.ibm.com \
--cc=tglx@linutronix.de \
--cc=tmricht@linux.ibm.com \
--cc=torvalds@linux-foundation.org \
/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.