Dear RT folks!
I'm pleased to announce the v6.12-rc4-rt6 patch set.
Changes since v6.12-rc4-rt5:
- Updated the lazy preempt series
- Added a bit of documentation for the new flags in tracing and
corrected the IS_ENABLED checks. Reported by Shrikanth Hegde.
- Added a check to not record the LAZY bit in tracing if the LAZY
model is not supported by the architecture. Reported by Ankur
Arora.
- Keeping the TRACE_FLAG_NEED_RESCHED where it was as this is ABI
and might confuse userland. Reported by Steven Rostedt.
- Updated the ktimersd patch based on upstream's review.
Known issues
None.
The delta patch against v6.12-rc4-rt5 is appended below and can be found here:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.12/incr/patch-6.12-rc4-rt5-rt6.patch.xz
You can get this release via the git tree at:
https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git v6.12-rc4-rt6
The RT patch against v6.12-rc4 can be found here:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.12/older/patch-6.12-rc4-rt6.patch.xz
The split quilt queue is available at:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.12/older/patches-6.12-rc4-rt6.tar.xz
Sebastian
diff --git a/Documentation/trace/ftrace.rst b/Documentation/trace/ftrace.rst
index 4073ca48af4ad..16892b844108c 100644
--- a/Documentation/trace/ftrace.rst
+++ b/Documentation/trace/ftrace.rst
@@ -1031,14 +1031,15 @@ explains which is which.
CPU#: The CPU which the process was running on.
irqs-off: 'd' interrupts are disabled. '.' otherwise.
- .. caution:: If the architecture does not support a way to
- read the irq flags variable, an 'X' will always
- be printed here.
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/interrupt.h b/include/linux/interrupt.h
index 4a4f367cd6864..9637af78087f3 100644
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -616,14 +616,27 @@ extern void __raise_softirq_irqoff(unsigned int nr);
extern void raise_softirq_irqoff(unsigned int nr);
extern void raise_softirq(unsigned int nr);
+/*
+ * Handle timers in a dedicated thread at a low SCHED_FIFO priority instead in
+ * ksoftirqd as to be prefred over SCHED_NORMAL tasks.
+ */
#ifdef CONFIG_PREEMPT_RT
DECLARE_PER_CPU(struct task_struct *, timersd);
DECLARE_PER_CPU(unsigned long, pending_timer_softirq);
-extern void raise_timer_softirq(void);
-extern void raise_hrtimer_softirq(void);
+void raise_ktimers_thread(unsigned int nr);
-static inline unsigned int local_pending_timers(void)
+static inline void raise_timer_softirq(void)
+{
+ raise_ktimers_thread(TIMER_SOFTIRQ);
+}
+
+static inline void raise_hrtimer_softirq(void)
+{
+ raise_ktimers_thread(HRTIMER_SOFTIRQ);
+}
+
+static inline unsigned int local_timers_pending(void)
{
return __this_cpu_read(pending_timer_softirq);
}
@@ -631,15 +644,17 @@ static inline unsigned int local_pending_timers(void)
#else
static inline void raise_timer_softirq(void)
{
- raise_softirq(TIMER_SOFTIRQ);
+ lockdep_assert_in_irq();
+ __raise_softirq_irqoff(TIMER_SOFTIRQ);
}
static inline void raise_hrtimer_softirq(void)
{
- raise_softirq_irqoff(HRTIMER_SOFTIRQ);
+ lockdep_assert_in_irq();
+ __raise_softirq_irqoff(HRTIMER_SOFTIRQ);
}
-static inline unsigned int local_pending_timers(void)
+static inline unsigned int local_timers_pending(void)
{
return local_softirq_pending();
}
diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
index 4cae6f2581379..0b9144b08e1f7 100644
--- a/include/linux/trace_events.h
+++ b/include/linux/trace_events.h
@@ -184,8 +184,8 @@ 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_NEED_RESCHED_LAZY = 0x02,
+ TRACE_FLAG_NEED_RESCHED = 0x04,
TRACE_FLAG_HARDIRQ = 0x08,
TRACE_FLAG_SOFTIRQ = 0x10,
TRACE_FLAG_PREEMPT_RESCHED = 0x20,
@@ -193,7 +193,6 @@ enum trace_flag_type {
TRACE_FLAG_BH_OFF = 0x80,
};
-#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
static inline unsigned int tracing_gen_ctx_flags(unsigned long irqflags)
{
unsigned int irq_status = irqs_disabled_flags(irqflags) ?
@@ -207,17 +206,6 @@ static inline unsigned int tracing_gen_ctx(void)
local_save_flags(irqflags);
return tracing_gen_ctx_flags(irqflags);
}
-#else
-
-static inline unsigned int tracing_gen_ctx_flags(unsigned long irqflags)
-{
- return tracing_gen_ctx_irq_test(0);
-}
-static inline unsigned int tracing_gen_ctx(void)
-{
- return tracing_gen_ctx_irq_test(0);
-}
-#endif
static inline unsigned int tracing_gen_ctx_dec(void)
{
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 46972fe661f81..e66d883ed0b9b 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1125,11 +1125,11 @@ static __always_inline bool dynamic_preempt_promote(void)
#else
static __always_inline bool dynamic_preempt_lazy(void)
{
- return IS_ENABLED(PREEMPT_LAZY) | IS_ENABLED(PREEMPT_LAZIEST);
+ return IS_ENABLED(CONFIG_PREEMPT_LAZY) | IS_ENABLED(CONFIG_PREEMPT_LAZIEST);
}
static __always_inline bool dynamic_preempt_promote(void)
{
- return IS_ENABLED(PREEMPT_LAZY);
+ return IS_ENABLED(CONFIG_PREEMPT_LAZY);
}
#endif
diff --git a/kernel/softirq.c b/kernel/softirq.c
index 2d847405e5a7f..b452206cf93b2 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -654,7 +654,7 @@ static inline void __irq_exit_rcu(void)
if (!in_interrupt() && local_softirq_pending())
invoke_softirq();
- if (IS_ENABLED(CONFIG_PREEMPT_RT) && local_pending_timers() &&
+ if (IS_ENABLED(CONFIG_PREEMPT_RT) && local_timers_pending() &&
!(in_nmi() | in_hardirq()))
wake_timersd();
@@ -996,12 +996,20 @@ static struct smp_hotplug_thread softirq_threads = {
#ifdef CONFIG_PREEMPT_RT
static void timersd_setup(unsigned int cpu)
{
+ /* Above SCHED_NORMAL to handle timers before regular tasks. */
sched_set_fifo_low(current);
}
static int timersd_should_run(unsigned int cpu)
{
- return local_pending_timers();
+ return local_timers_pending();
+}
+
+void raise_ktimers_thread(unsigned int nr)
+{
+ lockdep_assert_in_irq();
+ trace_softirq_raise(nr);
+ __this_cpu_or(pending_timer_softirq, 1 << nr);
}
static void run_timersd(unsigned int cpu)
@@ -1010,7 +1018,7 @@ static void run_timersd(unsigned int cpu)
ksoftirqd_run_begin();
- timer_si = local_pending_timers();
+ timer_si = local_timers_pending();
__this_cpu_write(pending_timer_softirq, 0);
or_softirq_pending(timer_si);
@@ -1019,27 +1027,6 @@ static void run_timersd(unsigned int cpu)
ksoftirqd_run_end();
}
-static void raise_ktimers_thread(unsigned int nr)
-{
- trace_softirq_raise(nr);
- __this_cpu_or(pending_timer_softirq, 1 << nr);
-}
-
-void raise_hrtimer_softirq(void)
-{
- raise_ktimers_thread(HRTIMER_SOFTIRQ);
-}
-
-void raise_timer_softirq(void)
-{
- unsigned long flags;
-
- local_irq_save(flags);
- raise_ktimers_thread(TIMER_SOFTIRQ);
- wake_timersd();
- local_irq_restore(flags);
-}
-
static struct smp_hotplug_thread timer_threads = {
.store = &timersd,
.setup = timersd_setup,
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index a7c0b2156de3f..e0c47259e91a7 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -865,7 +865,7 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
static inline bool local_timer_softirq_pending(void)
{
- return local_pending_timers() & BIT(TIMER_SOFTIRQ);
+ return local_timers_pending() & BIT(TIMER_SOFTIRQ);
}
/*
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c
index 23ca2155306b1..77b7f9d244240 100644
--- a/kernel/trace/trace_output.c
+++ b/kernel/trace/trace_output.c
@@ -460,7 +460,6 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry)
(entry->flags & TRACE_FLAG_IRQS_OFF && bh_off) ? 'D' :
(entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
bh_off ? 'b' :
- !IS_ENABLED(CONFIG_TRACE_IRQFLAGS_SUPPORT) ? 'X' :
'.';
switch (entry->flags & (TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_NEED_RESCHED_LAZY |
diff --git a/localversion-rt b/localversion-rt
index 0efe7ba1930e1..8fc605d806670 100644
--- a/localversion-rt
+++ b/localversion-rt
@@ -1 +1 @@
--rt5
+-rt6
© 2016 - 2024 Red Hat, Inc.