On Fri, 22 Nov 2024 18:32:01 +0100 Sebastian Andrzej Siewior <[email protected]> wrote:
> From: Thomas Gleixner <[email protected]> > > 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 <[email protected]> > Reviewed-by: Steven Rostedt (Google) <[email protected]> > Signed-off-by: Thomas Gleixner <[email protected]> > Signed-off-by: Sebastian Andrzej Siewior <[email protected]> > --- > 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;
