Sebastian Andrzej Siewior <[email protected]> writes:
> 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. > > Signed-off-by: Sebastian Andrzej Siewior <[email protected]> > --- > include/linux/trace_events.h | 1 + > kernel/trace/trace.c | 2 ++ > kernel/trace/trace_output.c | 14 +++++++++++++- > 3 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h > index d5c0fcf20f024..4cae6f2581379 100644 > --- a/include/linux/trace_events.h > +++ b/include/linux/trace_events.h > @@ -185,6 +185,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 = 0x02, > + TRACE_FLAG_NEED_RESCHED_LAZY = 0x04, > TRACE_FLAG_HARDIRQ = 0x08, > TRACE_FLAG_SOFTIRQ = 0x10, > TRACE_FLAG_PREEMPT_RESCHED = 0x20, > diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c > index 1c69ca1f10886..29d7703751aa9 100644 > --- a/kernel/trace/trace.c > +++ b/kernel/trace/trace.c > @@ -2544,6 +2544,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 (tif_test_bit(TIF_NEED_RESCHED_LAZY)) TIF_NEED_RESCHED_LAZY falls back to TIF_NEED_RESCHED without CONFIG_ARCH_HAS_PREEMPT_LAZY. So, you might need to add an explicit check for that as well. With that, Reviewed-by: Ankur Arora <[email protected]> Ankur > + 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 829daa0764dd9..23ca2155306b1 100644 > --- a/kernel/trace/trace_output.c > +++ b/kernel/trace/trace_output.c > @@ -463,17 +463,29 @@ int trace_print_lat_fmt(struct trace_seq *s, struct > trace_entry *entry) > !IS_ENABLED(CONFIG_TRACE_IRQFLAGS_SUPPORT) ? 'X' : > '.'; > > - 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; -- ankur
