Re: ~90s reboot delay with v6.19 and PREEMPT_RT

From: Bert Karwatzki

Date: Thu Feb 26 2026 - 08:30:57 EST


I think I've found the reason for the stall. I was looking at commit 9311e6c29b34
("cgroup: Fix sleeping from invalid context warning on PREEMPT_RT"),
and noticed this:

+static void __init cgroup_rt_init(void)
+{
+ int cpu;
+
+ for_each_possible_cpu(cpu) {
+ init_llist_head(per_cpu_ptr(&cgrp_dead_tasks, cpu));
+ per_cpu(cgrp_dead_tasks_iwork, cpu) =
+ IRQ_WORK_INIT_LAZY(cgrp_dead_tasks_iwork_fn);
+ }

IRQ_WORK_INIT_LAZY() expands to __IRQ_WORK_INIT(_func, IRQ_WORK_LAZY):
(in include/linux/irq_work.h)
IRQ_WORK_LAZY is declare in include/linux/smp-types.h:
IRQ_WORK_LAZY = 0x04, /* No IPI, wait for tick */

The "wait for tick" gave me an idea as I'm also using
CONFIG_NO_HZ_FULL=y

so I tried

commit b7453da1c7de288235234eb9265c3a2d661c1a2d (HEAD -> reboot_delay_debug_0)
Author: Bert Karwatzki <spasswolf@xxxxxx>
Date: Thu Feb 26 14:01:41 2026 +0100

cgroup: use IRQ_WORK_INIT in cgroup_rt_init()

Signed-off-by: Bert Karwatzki <spasswolf@xxxxxx>

diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index b750aa284b89..ed22842eb5d3 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -7047,7 +7047,7 @@ static void __init cgroup_rt_init(void)
for_each_possible_cpu(cpu) {
init_llist_head(per_cpu_ptr(&cgrp_dead_tasks, cpu));
per_cpu(cgrp_dead_tasks_iwork, cpu) =
- IRQ_WORK_INIT_LAZY(cgrp_dead_tasks_iwork_fn);
+ IRQ_WORK_INIT(cgrp_dead_tasks_iwork_fn);
}
}


and this seems to have fixes the issue for me. (Five successful reboots
in a row, needs more testing).

Bert Karwatzki