Message ID | 20241122173201.tsqK0eeD@linutronix.de (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [v3] tracing: Record task flag NEED_RESCHED_LAZY. | expand |
On Fri, 22 Nov 2024 18:32:01 +0100 Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote: > From: Thomas Gleixner <tglx@linutronix.de> > > The scheduler added NEED_RESCHED_LAZY scheduling. Record this state as > part of trace flags and expose it in the need_resched field. > > Record and expose NEED_RESCHED_LAZY. > > [bigeasy: Commit description, documentation bits.] > > Reviewed-by: Ankur Arora <ankur.a.arora@oracle.com> > Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org> > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> > --- > v2…v3: > - Use 0x02 for TRACE_FLAG_NEED_RESCHED_LAZY which is the freshly > created gap. > > Documentation/trace/ftrace.rst | 4 ++++ > include/linux/trace_events.h | 1 + > kernel/trace/trace.c | 2 ++ > kernel/trace/trace_output.c | 14 +++++++++++++- > 4 files changed, 20 insertions(+), 1 deletion(-) > > diff --git a/Documentation/trace/ftrace.rst b/Documentation/trace/ftrace.rst > index 74d5bd801b1a8..16892b844108c 100644 > --- a/Documentation/trace/ftrace.rst > +++ b/Documentation/trace/ftrace.rst > @@ -1033,9 +1033,13 @@ explains which is which. > irqs-off: 'd' interrupts are disabled. '.' otherwise. > > need-resched: > + - 'B' all, TIF_NEED_RESCHED, PREEMPT_NEED_RESCHED and TIF_RESCHED_LAZY is set, > - 'N' both TIF_NEED_RESCHED and PREEMPT_NEED_RESCHED is set, > - 'n' only TIF_NEED_RESCHED is set, > - 'p' only PREEMPT_NEED_RESCHED is set, > + - 'L' borg PREEMPT_NEED_RESCHED and TIF_RESCHED_LAZY is set, > + - 'b' borg TIF_NEED_RESCHED and TIF_RESCHED_LAZY is set, Is resistance futile? I can switch it over to "both" if that's what you meant. -- Steve > + - 'l' only TIF_RESCHED_LAZY is set > - '.' otherwise. > > hardirq/softirq: > diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h > index 016b29a56c875..2a5df5b62cfc7 100644 > --- a/include/linux/trace_events.h > +++ b/include/linux/trace_events.h > @@ -184,6 +184,7 @@ unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status); > > enum trace_flag_type { > TRACE_FLAG_IRQS_OFF = 0x01, > + TRACE_FLAG_NEED_RESCHED_LAZY = 0x02, > TRACE_FLAG_NEED_RESCHED = 0x04, > TRACE_FLAG_HARDIRQ = 0x08, > TRACE_FLAG_SOFTIRQ = 0x10, > diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c > index 3ef047ed97055..be62f0ea1814d 100644 > --- a/kernel/trace/trace.c > +++ b/kernel/trace/trace.c > @@ -2552,6 +2552,8 @@ unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status) > trace_flags |= TRACE_FLAG_NEED_RESCHED; > if (test_preempt_need_resched()) > trace_flags |= TRACE_FLAG_PREEMPT_RESCHED; > + if (IS_ENABLED(CONFIG_ARCH_HAS_PREEMPT_LAZY) && tif_test_bit(TIF_NEED_RESCHED_LAZY)) > + trace_flags |= TRACE_FLAG_NEED_RESCHED_LAZY; > return (trace_flags << 16) | (min_t(unsigned int, pc & 0xff, 0xf)) | > (min_t(unsigned int, migration_disable_value(), 0xf)) << 4; > } > diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c > index e08aee34ef63d..da748b7cbc4d5 100644 > --- a/kernel/trace/trace_output.c > +++ b/kernel/trace/trace_output.c > @@ -462,17 +462,29 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) > bh_off ? 'b' : > '.'; > > - switch (entry->flags & (TRACE_FLAG_NEED_RESCHED | > + switch (entry->flags & (TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_NEED_RESCHED_LAZY | > TRACE_FLAG_PREEMPT_RESCHED)) { > + case TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_NEED_RESCHED_LAZY | TRACE_FLAG_PREEMPT_RESCHED: > + need_resched = 'B'; > + break; > case TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_PREEMPT_RESCHED: > need_resched = 'N'; > break; > + case TRACE_FLAG_NEED_RESCHED_LAZY | TRACE_FLAG_PREEMPT_RESCHED: > + need_resched = 'L'; > + break; > + case TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_NEED_RESCHED_LAZY: > + need_resched = 'b'; > + break; > case TRACE_FLAG_NEED_RESCHED: > need_resched = 'n'; > break; > case TRACE_FLAG_PREEMPT_RESCHED: > need_resched = 'p'; > break; > + case TRACE_FLAG_NEED_RESCHED_LAZY: > + need_resched = 'l'; > + break; > default: > need_resched = '.'; > break;
On Fri, 22 Nov 2024 14:37:42 -0500 Steven Rostedt <rostedt@goodmis.org> wrote: > On Fri, 22 Nov 2024 18:32:01 +0100 > Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote: > > > From: Thomas Gleixner <tglx@linutronix.de> > > > > The scheduler added NEED_RESCHED_LAZY scheduling. Record this state as > > part of trace flags and expose it in the need_resched field. > > > > Record and expose NEED_RESCHED_LAZY. > > > > [bigeasy: Commit description, documentation bits.] > > > > Reviewed-by: Ankur Arora <ankur.a.arora@oracle.com> > > Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org> > > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> > > --- > > v2…v3: > > - Use 0x02 for TRACE_FLAG_NEED_RESCHED_LAZY which is the freshly > > created gap. > > > > Documentation/trace/ftrace.rst | 4 ++++ > > include/linux/trace_events.h | 1 + > > kernel/trace/trace.c | 2 ++ > > kernel/trace/trace_output.c | 14 +++++++++++++- > > 4 files changed, 20 insertions(+), 1 deletion(-) > > > > diff --git a/Documentation/trace/ftrace.rst b/Documentation/trace/ftrace.rst > > index 74d5bd801b1a8..16892b844108c 100644 > > --- a/Documentation/trace/ftrace.rst > > +++ b/Documentation/trace/ftrace.rst > > @@ -1033,9 +1033,13 @@ explains which is which. > > irqs-off: 'd' interrupts are disabled. '.' otherwise. > > > > need-resched: > > + - 'B' all, TIF_NEED_RESCHED, PREEMPT_NEED_RESCHED and TIF_RESCHED_LAZY is set, > > - 'N' both TIF_NEED_RESCHED and PREEMPT_NEED_RESCHED is set, > > - 'n' only TIF_NEED_RESCHED is set, > > - 'p' only PREEMPT_NEED_RESCHED is set, > > > + - 'L' borg PREEMPT_NEED_RESCHED and TIF_RESCHED_LAZY is set, > > + - 'b' borg TIF_NEED_RESCHED and TIF_RESCHED_LAZY is set, > > Is resistance futile? > > I can switch it over to "both" if that's what you meant. Actually, on Monday, can you send me a v4 with this fix? I just realized that this patch depends on both my branch (which I'm still waiting for Linus to pull) and the code that is already in Linus's tree. Once Linus pulls my branch, I'll apply this on that merge commit. But that will not be until next week. Thanks, -- Steve
On 2024-11-22 14:58:39 [-0500], Steven Rostedt wrote: > Actually, on Monday, can you send me a v4 with this fix? already done. > I just realized that this patch depends on both my branch (which I'm still > waiting for Linus to pull) and the code that is already in Linus's tree. > Once Linus pulls my branch, I'll apply this on that merge commit. But that > will not be until next week. okay. But that one is ready ;) Sebastian
On Fri, 22 Nov 2024 21:29:52 +0100 Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote: > On 2024-11-22 14:58:39 [-0500], Steven Rostedt wrote: > > Actually, on Monday, can you send me a v4 with this fix? > > already done. Thanks. > > > I just realized that this patch depends on both my branch (which I'm still > > waiting for Linus to pull) and the code that is already in Linus's tree. > > Once Linus pulls my branch, I'll apply this on that merge commit. But that > > will not be until next week. > > okay. But that one is ready ;) Yeah, but I can't do anything with it until Linus pulls in my branch. And I did the pull request on Wednesday. Would have been earlier, but some people sent me some bug fixes, so I decided to add them on top. But that required the normal testing and pushing to linux-next, and waiting a few days. -- Steve
diff --git a/Documentation/trace/ftrace.rst b/Documentation/trace/ftrace.rst index 74d5bd801b1a8..16892b844108c 100644 --- a/Documentation/trace/ftrace.rst +++ b/Documentation/trace/ftrace.rst @@ -1033,9 +1033,13 @@ explains which is which. irqs-off: 'd' interrupts are disabled. '.' otherwise. need-resched: + - 'B' all, TIF_NEED_RESCHED, PREEMPT_NEED_RESCHED and TIF_RESCHED_LAZY is set, - 'N' both TIF_NEED_RESCHED and PREEMPT_NEED_RESCHED is set, - 'n' only TIF_NEED_RESCHED is set, - 'p' only PREEMPT_NEED_RESCHED is set, + - 'L' borg PREEMPT_NEED_RESCHED and TIF_RESCHED_LAZY is set, + - 'b' borg TIF_NEED_RESCHED and TIF_RESCHED_LAZY is set, + - 'l' only TIF_RESCHED_LAZY is set - '.' otherwise. hardirq/softirq: diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h index 016b29a56c875..2a5df5b62cfc7 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -184,6 +184,7 @@ unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status); enum trace_flag_type { TRACE_FLAG_IRQS_OFF = 0x01, + TRACE_FLAG_NEED_RESCHED_LAZY = 0x02, TRACE_FLAG_NEED_RESCHED = 0x04, TRACE_FLAG_HARDIRQ = 0x08, TRACE_FLAG_SOFTIRQ = 0x10, diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 3ef047ed97055..be62f0ea1814d 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -2552,6 +2552,8 @@ unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status) trace_flags |= TRACE_FLAG_NEED_RESCHED; if (test_preempt_need_resched()) trace_flags |= TRACE_FLAG_PREEMPT_RESCHED; + if (IS_ENABLED(CONFIG_ARCH_HAS_PREEMPT_LAZY) && tif_test_bit(TIF_NEED_RESCHED_LAZY)) + trace_flags |= TRACE_FLAG_NEED_RESCHED_LAZY; return (trace_flags << 16) | (min_t(unsigned int, pc & 0xff, 0xf)) | (min_t(unsigned int, migration_disable_value(), 0xf)) << 4; } diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index e08aee34ef63d..da748b7cbc4d5 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c @@ -462,17 +462,29 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) bh_off ? 'b' : '.'; - switch (entry->flags & (TRACE_FLAG_NEED_RESCHED | + switch (entry->flags & (TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_NEED_RESCHED_LAZY | TRACE_FLAG_PREEMPT_RESCHED)) { + case TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_NEED_RESCHED_LAZY | TRACE_FLAG_PREEMPT_RESCHED: + need_resched = 'B'; + break; case TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_PREEMPT_RESCHED: need_resched = 'N'; break; + case TRACE_FLAG_NEED_RESCHED_LAZY | TRACE_FLAG_PREEMPT_RESCHED: + need_resched = 'L'; + break; + case TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_NEED_RESCHED_LAZY: + need_resched = 'b'; + break; case TRACE_FLAG_NEED_RESCHED: need_resched = 'n'; break; case TRACE_FLAG_PREEMPT_RESCHED: need_resched = 'p'; break; + case TRACE_FLAG_NEED_RESCHED_LAZY: + need_resched = 'l'; + break; default: need_resched = '.'; break;