From: Peter Zijlstra <peterz@infradead.org> To: Mark Rutland <mark.rutland@arm.com> Cc: mingo@kernel.org, will@kernel.org, boqun.feng@gmail.com, tglx@linutronix.de, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, srivatsa@csail.mit.edu, amakhalov@vmware.com, pv-drivers@vmware.com, rostedt@goodmis.org, mhiramat@kernel.org, wanpengli@tencent.com, vkuznets@redhat.com, boris.ostrovsky@oracle.com, rafael@kernel.org, daniel.lezcano@linaro.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, bsegall@google.com, mgorman@suse.de, bristot@redhat.com, vschneid@redhat.com, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-trace-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: Re: [PATCH 0/6] A few cpuidle vs rcu fixes Date: Wed, 25 Jan 2023 10:35:16 +0100 [thread overview] Message-ID: <Y9D31FHOCaSnO5gS@hirez.programming.kicks-ass.net> (raw) In-Reply-To: <Y9Al0PfSsx/VWL31@FVFF77S0Q05N> On Tue, Jan 24, 2023 at 06:39:12PM +0000, Mark Rutland wrote: > On Tue, Jan 24, 2023 at 05:30:29PM +0000, Mark Rutland wrote: > > On Tue, Jan 24, 2023 at 04:34:23PM +0000, Mark Rutland wrote: > > > Hi Peter, > > > > > > On Mon, Jan 23, 2023 at 09:50:09PM +0100, Peter Zijlstra wrote: > > > > 0-day robot reported graph-tracing made the cpuidle-vs-rcu rework go splat. > > > > > > Do you have a link toe the splat somewhere? > > > > > > I'm assuming that this is partially generic, and I'd like to make sure I test > > > the right thing on arm64. I'll throw my usual lockdep options at the ftrace > > > selftests... > > > > Hmm... with the tip sched/core branch, with or without this series applied atop > > I see a couple of splats which I don't see with v6.2-rc1 (which seems to be > > entirely clean). I'm not seeing any other splats. > > > > I can trigger those reliably with the 'toplevel-enable.tc' ftrace test: > > > > ./ftracetest test.d/event/toplevel-enable.tc > > > > Splats below; I'll dig into this a bit more tomorrow. > > > > [ 65.729252] ------------[ cut here ]------------ > > [ 65.730397] WARNING: CPU: 3 PID: 1162 at include/trace/events/preemptirq.h:55 trace_preempt_on+0x68/0x70 > > The line number here is a bit inscrutible, but a bisect led me down to commit > > 408b961146be4c1a ("tracing: WARN on rcuidle") > > ... and it appears this must be the RCUIDLE_COND() warning that adds, and that > seems to be because trace_preempt_on() calls trace_preempt_enable_rcuidle(): > > | void trace_preempt_on(unsigned long a0, unsigned long a1) > | { > | if (!in_nmi()) > | trace_preempt_enable_rcuidle(a0, a1); > | tracer_preempt_on(a0, a1); > | } > > It looks like that tracing is dependend upon CONFIG_TRACE_PREEMPT_TOGGLE, and I > have that because I enabled CONFIG_PREEMPT_TRACER. I reckon the same should > happen on x86 with CONFIG_PREEMPT_TRACER=y. > > IIUC we'll need to clean up that trace_.*_rcuidle() usage too, but I'm not > entirely sure how to do that. tip/sched/core contains the following patch addressing this: --- commit 9aedeaed6fc6fe8452b9b8225e95cc2b8631ff91 Author: Peter Zijlstra <peterz@infradead.org> Date: Thu Jan 12 20:43:49 2023 +0100 tracing, hardirq: No moar _rcuidle() tracing Robot reported that trace_hardirqs_{on,off}() tickle the forbidden _rcuidle() tracepoint through local_irq_{en,dis}able(). For 'sane' configs, these calls will only happen with RCU enabled and as such can use the regular tracepoint. This also means it's possible to trace them from NMI context again. Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20230112195541.477416709@infradead.org diff --git a/kernel/trace/trace_preemptirq.c b/kernel/trace/trace_preemptirq.c index 629f2854e12b..f992444a0b1f 100644 --- a/kernel/trace/trace_preemptirq.c +++ b/kernel/trace/trace_preemptirq.c @@ -19,6 +19,20 @@ /* Per-cpu variable to prevent redundant calls when IRQs already off */ static DEFINE_PER_CPU(int, tracing_irq_cpu); +/* + * Use regular trace points on architectures that implement noinstr + * tooling: these calls will only happen with RCU enabled, which can + * use a regular tracepoint. + * + * On older architectures, use the rcuidle tracing methods (which + * aren't NMI-safe - so exclude NMI contexts): + */ +#ifdef CONFIG_ARCH_WANTS_NO_INSTR +#define trace(point) trace_##point +#else +#define trace(point) if (!in_nmi()) trace_##point##_rcuidle +#endif + /* * Like trace_hardirqs_on() but without the lockdep invocation. This is * used in the low level entry code where the ordering vs. RCU is important @@ -28,8 +42,7 @@ static DEFINE_PER_CPU(int, tracing_irq_cpu); void trace_hardirqs_on_prepare(void) { if (this_cpu_read(tracing_irq_cpu)) { - if (!in_nmi()) - trace_irq_enable(CALLER_ADDR0, CALLER_ADDR1); + trace(irq_enable)(CALLER_ADDR0, CALLER_ADDR1); tracer_hardirqs_on(CALLER_ADDR0, CALLER_ADDR1); this_cpu_write(tracing_irq_cpu, 0); } @@ -40,8 +53,7 @@ NOKPROBE_SYMBOL(trace_hardirqs_on_prepare); void trace_hardirqs_on(void) { if (this_cpu_read(tracing_irq_cpu)) { - if (!in_nmi()) - trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); + trace(irq_enable)(CALLER_ADDR0, CALLER_ADDR1); tracer_hardirqs_on(CALLER_ADDR0, CALLER_ADDR1); this_cpu_write(tracing_irq_cpu, 0); } @@ -63,8 +75,7 @@ void trace_hardirqs_off_finish(void) if (!this_cpu_read(tracing_irq_cpu)) { this_cpu_write(tracing_irq_cpu, 1); tracer_hardirqs_off(CALLER_ADDR0, CALLER_ADDR1); - if (!in_nmi()) - trace_irq_disable(CALLER_ADDR0, CALLER_ADDR1); + trace(irq_disable)(CALLER_ADDR0, CALLER_ADDR1); } } @@ -78,8 +89,7 @@ void trace_hardirqs_off(void) if (!this_cpu_read(tracing_irq_cpu)) { this_cpu_write(tracing_irq_cpu, 1); tracer_hardirqs_off(CALLER_ADDR0, CALLER_ADDR1); - if (!in_nmi()) - trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); + trace(irq_disable)(CALLER_ADDR0, CALLER_ADDR1); } } EXPORT_SYMBOL(trace_hardirqs_off);
WARNING: multiple messages have this Message-ID (diff)
From: Peter Zijlstra <peterz@infradead.org> To: Mark Rutland <mark.rutland@arm.com> Cc: juri.lelli@redhat.com, daniel.lezcano@linaro.org, wanpengli@tencent.com, kvm@vger.kernel.org, rafael@kernel.org, pv-drivers@vmware.com, dave.hansen@linux.intel.com, virtualization@lists.linux-foundation.org, bsegall@google.com, amakhalov@vmware.com, will@kernel.org, vschneid@redhat.com, hpa@zytor.com, x86@kernel.org, mingo@kernel.org, mgorman@suse.de, linux-trace-kernel@vger.kernel.org, linux-pm@vger.kernel.org, boqun.feng@gmail.com, rostedt@goodmis.org, bp@alien8.de, vincent.guittot@linaro.org, boris.ostrovsky@oracle.com, dietmar.eggemann@arm.com, jgross@suse.com, seanjc@google.com, linux-kernel@vger.kernel.org, tglx@linutronix.de, mhiramat@kernel.org, pbonzini@redhat.com, bristot@redhat.com Subject: Re: [PATCH 0/6] A few cpuidle vs rcu fixes Date: Wed, 25 Jan 2023 10:35:16 +0100 [thread overview] Message-ID: <Y9D31FHOCaSnO5gS@hirez.programming.kicks-ass.net> (raw) In-Reply-To: <Y9Al0PfSsx/VWL31@FVFF77S0Q05N> On Tue, Jan 24, 2023 at 06:39:12PM +0000, Mark Rutland wrote: > On Tue, Jan 24, 2023 at 05:30:29PM +0000, Mark Rutland wrote: > > On Tue, Jan 24, 2023 at 04:34:23PM +0000, Mark Rutland wrote: > > > Hi Peter, > > > > > > On Mon, Jan 23, 2023 at 09:50:09PM +0100, Peter Zijlstra wrote: > > > > 0-day robot reported graph-tracing made the cpuidle-vs-rcu rework go splat. > > > > > > Do you have a link toe the splat somewhere? > > > > > > I'm assuming that this is partially generic, and I'd like to make sure I test > > > the right thing on arm64. I'll throw my usual lockdep options at the ftrace > > > selftests... > > > > Hmm... with the tip sched/core branch, with or without this series applied atop > > I see a couple of splats which I don't see with v6.2-rc1 (which seems to be > > entirely clean). I'm not seeing any other splats. > > > > I can trigger those reliably with the 'toplevel-enable.tc' ftrace test: > > > > ./ftracetest test.d/event/toplevel-enable.tc > > > > Splats below; I'll dig into this a bit more tomorrow. > > > > [ 65.729252] ------------[ cut here ]------------ > > [ 65.730397] WARNING: CPU: 3 PID: 1162 at include/trace/events/preemptirq.h:55 trace_preempt_on+0x68/0x70 > > The line number here is a bit inscrutible, but a bisect led me down to commit > > 408b961146be4c1a ("tracing: WARN on rcuidle") > > ... and it appears this must be the RCUIDLE_COND() warning that adds, and that > seems to be because trace_preempt_on() calls trace_preempt_enable_rcuidle(): > > | void trace_preempt_on(unsigned long a0, unsigned long a1) > | { > | if (!in_nmi()) > | trace_preempt_enable_rcuidle(a0, a1); > | tracer_preempt_on(a0, a1); > | } > > It looks like that tracing is dependend upon CONFIG_TRACE_PREEMPT_TOGGLE, and I > have that because I enabled CONFIG_PREEMPT_TRACER. I reckon the same should > happen on x86 with CONFIG_PREEMPT_TRACER=y. > > IIUC we'll need to clean up that trace_.*_rcuidle() usage too, but I'm not > entirely sure how to do that. tip/sched/core contains the following patch addressing this: --- commit 9aedeaed6fc6fe8452b9b8225e95cc2b8631ff91 Author: Peter Zijlstra <peterz@infradead.org> Date: Thu Jan 12 20:43:49 2023 +0100 tracing, hardirq: No moar _rcuidle() tracing Robot reported that trace_hardirqs_{on,off}() tickle the forbidden _rcuidle() tracepoint through local_irq_{en,dis}able(). For 'sane' configs, these calls will only happen with RCU enabled and as such can use the regular tracepoint. This also means it's possible to trace them from NMI context again. Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20230112195541.477416709@infradead.org diff --git a/kernel/trace/trace_preemptirq.c b/kernel/trace/trace_preemptirq.c index 629f2854e12b..f992444a0b1f 100644 --- a/kernel/trace/trace_preemptirq.c +++ b/kernel/trace/trace_preemptirq.c @@ -19,6 +19,20 @@ /* Per-cpu variable to prevent redundant calls when IRQs already off */ static DEFINE_PER_CPU(int, tracing_irq_cpu); +/* + * Use regular trace points on architectures that implement noinstr + * tooling: these calls will only happen with RCU enabled, which can + * use a regular tracepoint. + * + * On older architectures, use the rcuidle tracing methods (which + * aren't NMI-safe - so exclude NMI contexts): + */ +#ifdef CONFIG_ARCH_WANTS_NO_INSTR +#define trace(point) trace_##point +#else +#define trace(point) if (!in_nmi()) trace_##point##_rcuidle +#endif + /* * Like trace_hardirqs_on() but without the lockdep invocation. This is * used in the low level entry code where the ordering vs. RCU is important @@ -28,8 +42,7 @@ static DEFINE_PER_CPU(int, tracing_irq_cpu); void trace_hardirqs_on_prepare(void) { if (this_cpu_read(tracing_irq_cpu)) { - if (!in_nmi()) - trace_irq_enable(CALLER_ADDR0, CALLER_ADDR1); + trace(irq_enable)(CALLER_ADDR0, CALLER_ADDR1); tracer_hardirqs_on(CALLER_ADDR0, CALLER_ADDR1); this_cpu_write(tracing_irq_cpu, 0); } @@ -40,8 +53,7 @@ NOKPROBE_SYMBOL(trace_hardirqs_on_prepare); void trace_hardirqs_on(void) { if (this_cpu_read(tracing_irq_cpu)) { - if (!in_nmi()) - trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); + trace(irq_enable)(CALLER_ADDR0, CALLER_ADDR1); tracer_hardirqs_on(CALLER_ADDR0, CALLER_ADDR1); this_cpu_write(tracing_irq_cpu, 0); } @@ -63,8 +75,7 @@ void trace_hardirqs_off_finish(void) if (!this_cpu_read(tracing_irq_cpu)) { this_cpu_write(tracing_irq_cpu, 1); tracer_hardirqs_off(CALLER_ADDR0, CALLER_ADDR1); - if (!in_nmi()) - trace_irq_disable(CALLER_ADDR0, CALLER_ADDR1); + trace(irq_disable)(CALLER_ADDR0, CALLER_ADDR1); } } @@ -78,8 +89,7 @@ void trace_hardirqs_off(void) if (!this_cpu_read(tracing_irq_cpu)) { this_cpu_write(tracing_irq_cpu, 1); tracer_hardirqs_off(CALLER_ADDR0, CALLER_ADDR1); - if (!in_nmi()) - trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); + trace(irq_disable)(CALLER_ADDR0, CALLER_ADDR1); } } EXPORT_SYMBOL(trace_hardirqs_off); _______________________________________________ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/virtualization
next prev parent reply other threads:[~2023-01-25 9:36 UTC|newest] Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-01-23 20:50 [PATCH 0/6] A few cpuidle vs rcu fixes Peter Zijlstra 2023-01-23 20:50 ` Peter Zijlstra 2023-01-23 20:50 ` [PATCH 1/6] x86: Always inline arch_atomic64 Peter Zijlstra 2023-01-23 20:50 ` Peter Zijlstra 2023-01-23 20:50 ` [PATCH 2/6] x86/pvclock: improve atomic update of last_value in pvclock_clocksource_read Peter Zijlstra 2023-01-23 20:50 ` Peter Zijlstra 2023-01-23 20:50 ` [PATCH 3/6] ftrace/x86: Warn and ignore graph tracing when RCU is disabled Peter Zijlstra 2023-01-23 20:50 ` Peter Zijlstra 2023-01-23 21:53 ` Steven Rostedt 2023-01-23 21:53 ` Steven Rostedt 2023-01-23 22:07 ` Steven Rostedt 2023-01-23 22:07 ` Steven Rostedt 2023-01-24 14:44 ` Peter Zijlstra 2023-01-24 14:44 ` Peter Zijlstra 2023-01-24 17:12 ` Mark Rutland 2023-01-24 17:12 ` Mark Rutland 2023-01-25 9:37 ` Peter Zijlstra 2023-01-25 9:37 ` Peter Zijlstra 2023-01-25 10:47 ` Peter Zijlstra 2023-01-25 10:47 ` Peter Zijlstra 2023-01-25 11:32 ` Mark Rutland 2023-01-25 11:32 ` Mark Rutland 2023-01-25 18:46 ` Paul E. McKenney 2023-01-26 9:28 ` Peter Zijlstra 2023-01-26 9:28 ` Peter Zijlstra 2023-01-28 19:12 ` Paul E. McKenney 2023-01-23 20:50 ` [PATCH 4/6] x86: Mark sched_clock() noinstr Peter Zijlstra 2023-01-23 20:50 ` Peter Zijlstra 2023-01-23 20:50 ` [PATCH 5/6] sched/clock: Make local_clock() noinstr Peter Zijlstra 2023-01-23 20:50 ` Peter Zijlstra 2023-01-23 20:50 ` [PATCH 6/6] cpuidle: Fix poll_idle() noinstr annotation Peter Zijlstra 2023-01-23 20:50 ` Peter Zijlstra 2023-01-24 14:24 ` Rafael J. Wysocki 2023-01-24 14:24 ` Rafael J. Wysocki 2023-01-24 16:34 ` [PATCH 0/6] A few cpuidle vs rcu fixes Mark Rutland 2023-01-24 16:34 ` Mark Rutland 2023-01-24 17:30 ` Mark Rutland 2023-01-24 17:30 ` Mark Rutland 2023-01-24 18:39 ` Mark Rutland 2023-01-24 18:39 ` Mark Rutland 2023-01-25 9:35 ` Peter Zijlstra [this message] 2023-01-25 9:35 ` Peter Zijlstra 2023-01-25 9:40 ` Peter Zijlstra 2023-01-25 9:40 ` Peter Zijlstra 2023-01-25 10:23 ` Mark Rutland 2023-01-25 10:23 ` Mark Rutland 2023-01-31 14:22 ` [tip: sched/core] cpuidle: tracing, preempt: Squash _rcuidle tracing tip-bot2 for Peter Zijlstra 2023-01-25 9:31 ` [PATCH 0/6] A few cpuidle vs rcu fixes Peter Zijlstra 2023-01-25 9:31 ` Peter Zijlstra 2023-01-25 9:36 ` Mark Rutland 2023-01-25 9:36 ` Mark Rutland 2023-01-25 15:20 ` Mark Rutland 2023-01-25 15:20 ` Mark Rutland
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=Y9D31FHOCaSnO5gS@hirez.programming.kicks-ass.net \ --to=peterz@infradead.org \ --cc=amakhalov@vmware.com \ --cc=boqun.feng@gmail.com \ --cc=boris.ostrovsky@oracle.com \ --cc=bp@alien8.de \ --cc=bristot@redhat.com \ --cc=bsegall@google.com \ --cc=daniel.lezcano@linaro.org \ --cc=dave.hansen@linux.intel.com \ --cc=dietmar.eggemann@arm.com \ --cc=hpa@zytor.com \ --cc=jgross@suse.com \ --cc=juri.lelli@redhat.com \ --cc=kvm@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pm@vger.kernel.org \ --cc=linux-trace-kernel@vger.kernel.org \ --cc=mark.rutland@arm.com \ --cc=mgorman@suse.de \ --cc=mhiramat@kernel.org \ --cc=mingo@kernel.org \ --cc=pbonzini@redhat.com \ --cc=pv-drivers@vmware.com \ --cc=rafael@kernel.org \ --cc=rostedt@goodmis.org \ --cc=seanjc@google.com \ --cc=srivatsa@csail.mit.edu \ --cc=tglx@linutronix.de \ --cc=vincent.guittot@linaro.org \ --cc=virtualization@lists.linux-foundation.org \ --cc=vkuznets@redhat.com \ --cc=vschneid@redhat.com \ --cc=wanpengli@tencent.com \ --cc=will@kernel.org \ --cc=x86@kernel.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: linkBe 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.