b41642c877: BUG:kernel_hang_in_boot_stage
kernel test robot
build botHello,
kernel test robot noticed "BUG:kernel_hang_in_boot_stage" on:
commit: b41642c87716bbd09797b1e4ea7d904f06c39b7b ("rcu: Fix rcu_read_unlock() deadloop due to IRQ work")
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git master
[test failed on linus/master 7e161a991ea71e6ec526abc8f40c6852ebe3d946]
[test failed on linux-next/master 5c5a10f0be967a8950a2309ea965bae54251b50e]
in testcase: boot
config: i386-randconfig-2006-20250804
compiler: clang-20
test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 16G
(please refer to attached dmesg/kmsg for entire log/backtrace)
+-------------------------------+------------+------------+ | | d827673d8a | b41642c877 | +-------------------------------+------------+------------+ | boot_successes | 15 | 0 | | boot_failures | 0 | 15 | | BUG:kernel_hang_in_boot_stage | 0 | 15 | +-------------------------------+------------+------------+
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-lkp/[email protected]
[ 8.004044][ T1] Run /init as init process [ 8.004883][ T1] with arguments: [ 8.005620][ T1] /init [ 8.006332][ T1] with environment: [ 8.007080][ T1] HOME=/ [ 8.007722][ T1] TERM=linux [ 8.008407][ T1] RESULT_ROOT=/result/boot/1/vm-snb/quantal-i386-core-20190426.cgz/i386-randconfig-2006-20250804/clang-20/b41642c87716bbd09797b1e4ea7d904f06c39b7b/0 [ 8.010989][ T1] BOOT_IMAGE=/pkg/linux/i386-randconfig-2006-20250804/clang-20/b41642c87716bbd09797b1e4ea7d904f06c39b7b/vmlinuz-6.16.0-rc3-00005-gb41642c87716 [ 8.013525][ T1] branch=gustavoars/testing/wfamnae-next20250804 [ 8.014578][ T1] job=/lkp/jobs/scheduled/vm-meta-10/boot-1-quantal-i386-core-20190426.cgz-i386-randconfig-2006-20250804-b41642c87716-20250805-101381-u20lqt-1.yaml [ 8.016412][ T1] user=lkp [ 8.016884][ T1] ARCH=i386 [ 8.017372][ T1] kconfig=i386-randconfig-2006-20250804 [ 8.018109][ T1] commit=b41642c87716bbd09797b1e4ea7d904f06c39b7b [ 8.018928][ T1] intremap=posted_msi [ 8.019543][ T1] max_uptime=600 [ 8.020064][ T1] LKP_SERVER=internal-lkp-server [ 8.020735][ T1] selinux=0 [ 8.021215][ T1] apic=debug [ 8.021707][ T1] prompt_ramdisk=0 [ 8.022251][ T1] vga=normal [ 8.022791][ T1] ia32_emulation=on [ 8.023339][ T1] riscv_isa_fallback=1 [ 8.779434][ C0] random: crng init done LKP: ttyS0: 107: skip deploy intel ucode as no ucode is specified BUG: kernel hang in boot stage
The kernel config and materials to reproduce are available at:
https://download.01.org/0day-ci/archive/20250807/[email protected]
we didn't observe more information in dmesg. and we only observe this "kernel hang in boot stage" with a i386 random config. kernel is compiled by clang-20.
as a contrast, parent dmesg looks like below:
[ 8.301768][ T1] Run /init as init process [ 8.302821][ T1] with arguments: [ 8.303849][ T1] /init [ 8.304408][ T1] with environment: [ 8.305053][ T1] HOME=/ [ 8.305635][ T1] TERM=linux [ 8.306225][ T1] RESULT_ROOT=/result/boot/1/vm-snb/quantal-i386-core-20190426.cgz/i386-randconfig-2006-20250804/clang-20/d827673d8a4e69937dd3731da2686a2d8206aef5/0 [ 8.308434][ T1] BOOT_IMAGE=/pkg/linux/i386-randconfig-2006-20250804/clang-20/d827673d8a4e69937dd3731da2686a2d8206aef5/vmlinuz-6.16.0-rc3-00004-gd827673d8a4e [ 8.310619][ T1] branch=gustavoars/testing/wfamnae-next20250804 [ 8.311610][ T1] job=/lkp/jobs/scheduled/vm-meta-7/boot-1-quantal-i386-core-20190426.cgz-i386-randconfig-2006-20250804-d827673d8a4e-20250805-99925-p5h1vs-1.yaml [ 8.313843][ T1] user=lkp [ 8.314287][ T1] ARCH=i386 [ 8.314701][ T1] kconfig=i386-randconfig-2006-20250804 [ 8.315329][ T1] commit=d827673d8a4e69937dd3731da2686a2d8206aef5 [ 8.316029][ T1] intremap=posted_msi [ 8.316574][ T1] max_uptime=600 [ 8.317018][ T1] LKP_SERVER=internal-lkp-server [ 8.317599][ T1] selinux=0 [ 8.318009][ T1] apic=debug [ 8.318424][ T1] prompt_ramdisk=0 [ 8.318888][ T1] vga=normal [ 8.319307][ T1] ia32_emulation=on [ 8.319841][ T1] riscv_isa_fallback=1 [ 9.079686][ C0] random: crng init done LKP: ttyS0: 108: skip deploy intel ucode as no ucode is specified [ 9.371040][ T182] udevd[182]: starting version 175 LKP: ttyS0: 108: Kernel tests: Boot OK! LKP: ttyS0: 108: HOSTNAME vm-snb, MAC 52:54:00:12:34:56, kernel 6.16.0-rc3-00004-gd827673d8a4e 1 LKP: ttyS0: 108: /lkp/lkp/src/bin/run-lkp /lkp/jobs/scheduled/vm-meta-7/boot-1-quantal-i386-core-20190426.cgz-i386-randconfig-2006-20250804-d827673d8a4e-20250805-99925-p5h1vs-1.yaml [ 10.016422][ T1] init: failsafe main process (327) killed by TERM signal [ 10.080302][ T1] init: udev-fallback-graphics main process (366) terminated with status 1 [ 10.120853][ T1] init: networking main process (373) terminated with status 1 LKP: ttyS0: 108: LKP: rebooting forcely [ 21.082808][ T108] sysrq: Emergency Sync [ 21.084955][ T40] Emergency Sync complete [ 21.086476][ T108] sysrq: Resetting
Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Frederic Weisbecker
maintainerQuoted 30 lines · kernel test robot
Hello,
kernel test robot noticed "BUG:kernel_hang_in_boot_stage" on:
commit:
b41642c87716bbd09797b1e4ea7d904f06c39b7b("rcu: Fixrcu_read_unlock()deadloop due to IRQ work")
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git master[test failed on linus/master
7e161a991ea71e6ec526abc8f40c6852ebe3d946]
[test failed on linux-next/master5c5a10f0be967a8950a2309ea965bae54251b50e]in testcase: boot
config: i386-randconfig-2006-20250804
compiler: clang-20
test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 16G(please refer to attached dmesg/kmsg for entire log/backtrace)
+-------------------------------+------------+------------+ | | d827673d8a | b41642c877 | +-------------------------------+------------+------------+ | boot_successes | 15 | 0 | | boot_failures | 0 | 15 | | BUG:kernel_hang_in_boot_stage | 0 | 15 | +-------------------------------+------------+------------+
Quoted 4 lines
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-lkp/[email protected]
#syz test
From a3cc7624264743996d2ad1295741933103a8d63b Mon Sep 17 00:00:00 2001
From: Frederic Weisbecker <[email protected]>
Date: Fri, 8 Aug 2025 19:03:22 +0200
Subject: [PATCH] rcu: Fix racy re-initialization of irq_work causing hangs
RCU re-initializes the deferred QS irq work everytime before attempting to queue it. However there are situations where the irq work is attempted to be queued even though it is already queued. In that case re-initializing messes-up with the irq work queue that is about to be handled.
The chances for that to happen are higher when the architecture doesn't support self-IPIs and irq work are then all lazy, such as with the following sequence:
1) rcu_read_unlock() is called when IRQs are disabled and there is a grace period involving blocked tasks on the node. The irq work is then initialized and queued.
2) The related tasks are unblocked and the CPU quiescent state is reported. rdp->defer_qs_iw_pending is reset to DEFER_QS_IDLE, allowing the irq work to be requeued in the future (note the previous one hasn't fired yet).
3) A new grace period starts and the node has blocked tasks.
4) rcu_read_unlock() is called when IRQs are disabled again. The irq work is re-initialized (but it's queued! and its node is cleared) and requeued. Which means it's requeued to itself.
5) The irq work finally fires with the tick. But since it was requeued to itself, it loops and hangs.
Fix this with initializing the irq work only once before the CPU boots.
--- kernel/rcu/tree.c | 2 ++ kernel/rcu/tree.h | 1 + kernel/rcu/tree_plugin.h | 8 ++++++-- 3 files changed, 9 insertions(+), 2 deletions(-)
kernel/rcu/tree.c +2 -0
@@ -4242,6 +4242,8 @@ int rcutree_prepare_cpu(unsigned int cpu) rdp->rcu_iw_gp_seq = rdp->gp_seq -1 ;trace_rcu_grace_period (rcu_state.name, rdp->gp_seq,TPS ("cpuonl" ));raw_spin_unlock_irqrestore_rcu_node (rnp, flags); + +rcu_preempt_deferred_qs_init (rdp);rcu_spawn_rnp_kthreads (rnp);rcu_spawn_cpu_nocb_kthread (cpu);ASSERT_EXCLUSIVE_WRITER (rcu_state.n_online_cpus);
kernel/rcu/tree.h +1 -0
@@ -488,6 +488,7 @@ static int rcu_print_task_exp_stall(struct rcu_node *rnp);static void rcu_preempt_check_blocked_tasks (struct rcu_node *rnp);static void rcu_flavor_sched_clock_irq (int user);static void dump_blkd_tasks (struct rcu_node *rnp,int ncheck); +static void rcu_preempt_deferred_qs_init (struct rcu_data *rdp);static void rcu_initiate_boost (struct rcu_node *rnp,unsigned long flags);static void rcu_preempt_boost_start_gp (struct rcu_node *rnp);static bool rcu_is_callbacks_kthread (struct rcu_data *rdp);
kernel/rcu/tree_plugin.h +6 -2
@@ -699,8 +699,6 @@ static void rcu_read_unlock_special(struct task_struct *t) cpu_online(rdp->cpu)) {// Get scheduler to re-evaluate and call hooks. // If !IRQ_WORK, FQS scan will eventually IPI. - rdp->defer_qs_iw = -IRQ_WORK_INIT_HARD (rcu_preempt_deferred_qs_handler); rdp->defer_qs_iw_pending =DEFER_QS_PENDING ;irq_work_queue_on (&rdp->defer_qs_iw, rdp->cpu); }
@@ -840,6 +838,10 @@ dump_blkd_tasks(struct rcu_node *rnp, int ncheck) } } +static void rcu_preempt_deferred_qs_init (struct rcu_data *rdp) +{ + rdp->defer_qs_iw =IRQ_WORK_INIT_HARD (rcu_preempt_deferred_qs_handler); +}#else /* #ifdef CONFIG_PREEMPT_RCU */ /*
@@ -1039,6 +1041,8 @@ dump_blkd_tasks(struct rcu_node *rnp, int ncheck) WARN_ON_ONCE(!list_empty(&rnp->blkd_tasks)); } +static void rcu_preempt_deferred_qs_init (struct rcu_data *rdp) { } +#endif /* #else #ifdef CONFIG_PREEMPT_RCU */ /*
Signature · 8 lines
2.50.1 -- Frederic Weisbecker SUSE Labs
Quoted 64 lines · Frederic Weisbecker
Quoted 30 lines · kernel test robot
Hello,
kernel test robot noticed "BUG:kernel_hang_in_boot_stage" on:
commit:
b41642c87716bbd09797b1e4ea7d904f06c39b7b("rcu: Fixrcu_read_unlock()deadloop due to IRQ work")
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git master[test failed on linus/master
7e161a991ea71e6ec526abc8f40c6852ebe3d946]
[test failed on linux-next/master5c5a10f0be967a8950a2309ea965bae54251b50e]in testcase: boot
config: i386-randconfig-2006-20250804
compiler: clang-20
test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 16G(please refer to attached dmesg/kmsg for entire log/backtrace)
+-------------------------------+------------+------------+ | | d827673d8a | b41642c877 | +-------------------------------+------------+------------+ | boot_successes | 15 | 0 | | boot_failures | 0 | 15 | | BUG:kernel_hang_in_boot_stage | 0 | 15 | +-------------------------------+------------+------------+Quoted 4 lines
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-lkp/[email protected]#syz test
From
a3cc7624264743996d2ad1295741933103a8d63bMon Sep 17 00:00:00 2001
From: Frederic Weisbecker <[email protected]>
Date: Fri, 8 Aug 2025 19:03:22 +0200
Subject: [PATCH] rcu: Fix racy re-initialization ofirq_workcausing hangsRCU re-initializes the deferred QS irq work everytime before attempting to queue it. However there are situations where the irq work is attempted to be queued even though it is already queued. In that case re-initializing messes-up with the irq work queue that is about to be handled.
The chances for that to happen are higher when the architecture doesn't support self-IPIs and irq work are then all lazy, such as with the following sequence:
1)
rcu_read_unlock()is called when IRQs are disabled and there is a grace period involving blocked tasks on the node. The irq work is then initialized and queued.2) The related tasks are unblocked and the CPU quiescent state is reported.
rdp->defer_qs_iw_pendingis reset toDEFER_QS_IDLE, allowing the irq work to be requeued in the future (note the previous one hasn't fired yet).3) A new grace period starts and the node has blocked tasks.
Quoted 8 lines
4)
rcu_read_unlock()is called when IRQs are disabled again. The irq work is re-initialized (but it's queued! and its node is cleared) and requeued. Which means it's requeued to itself.5) The irq work finally fires with the tick. But since it was requeued to itself, it loops and hangs.
Fix this with initializing the irq work only once before the CPU boots.
Makes sense, good catch and thanks!
- Joel
Quoted 69 lines
Fixes b41642c87716 ("rcu: Fix rcu_read_unlock() deadloop due to IRQ work")Reported-by kernel test robot <[email protected]>Signed-off-by Frederic Weisbecker <[email protected]>--- kernel/rcu/tree.c | 2 ++ kernel/rcu/tree.h | 1 + kernel/rcu/tree_plugin.h | 8 ++++++-- 3 files changed, 9 insertions(+), 2 deletions(-)kernel/rcu/tree.c +2
-0@@ -4242,6 +4242,8 @@ int rcutree_prepare_cpu(unsigned int cpu) rdp->rcu_iw_gp_seq = rdp->gp_seq -1 ;trace_rcu_grace_period (rcu_state.name, rdp->gp_seq,TPS ("cpuonl" ));raw_spin_unlock_irqrestore_rcu_node (rnp, flags); + +rcu_preempt_deferred_qs_init (rdp);rcu_spawn_rnp_kthreads (rnp);rcu_spawn_cpu_nocb_kthread (cpu);ASSERT_EXCLUSIVE_WRITER (rcu_state.n_online_cpus);kernel/rcu/tree.h +1
-0@@ -488,6 +488,7 @@ static int rcu_print_task_exp_stall(struct rcu_node *rnp);static void rcu_preempt_check_blocked_tasks (struct rcu_node *rnp);static void rcu_flavor_sched_clock_irq (int user);static void dump_blkd_tasks (struct rcu_node *rnp,int ncheck); +static void rcu_preempt_deferred_qs_init (struct rcu_data *rdp);static void rcu_initiate_boost (struct rcu_node *rnp,unsigned long flags);static void rcu_preempt_boost_start_gp (struct rcu_node *rnp);static bool rcu_is_callbacks_kthread (struct rcu_data *rdp);kernel/rcu/tree_plugin.h +6
-2@@ -699,8 +699,6 @@ static void rcu_read_unlock_special(struct task_struct *t) cpu_online(rdp->cpu)) {// Get scheduler to re-evaluate and call hooks. // If !IRQ_WORK, FQS scan will eventually IPI. - rdp->defer_qs_iw = -IRQ_WORK_INIT_HARD (rcu_preempt_deferred_qs_handler); rdp->defer_qs_iw_pending =DEFER_QS_PENDING ;irq_work_queue_on (&rdp->defer_qs_iw, rdp->cpu); }@@ -840,6 +838,10 @@ dump_blkd_tasks(struct rcu_node *rnp, int ncheck) } } +static void rcu_preempt_deferred_qs_init (struct rcu_data *rdp) +{ + rdp->defer_qs_iw =IRQ_WORK_INIT_HARD (rcu_preempt_deferred_qs_handler); +}#else /* #ifdef CONFIG_PREEMPT_RCU */ /* @@ -1039,6 +1041,8 @@ dump_blkd_tasks(struct rcu_node *rnp, int ncheck) WARN_ON_ONCE(!list_empty(&rnp->blkd_tasks)); } +static void rcu_preempt_deferred_qs_init (struct rcu_data *rdp) { } +#endif /* #else #ifdef CONFIG_PREEMPT_RCU */ /*
Neeraj Upadhyay
maintainerHi kernel test robot,
Quoted 35 lines
#syz test
Quoted 1 line
From
a3cc7624264743996d2ad1295741933103a8d63bMon Sep 17 00:00:00 2001From: Frederic Weisbecker <[email protected]>
Date: Fri, 8 Aug 2025 19:03:22 +0200
Subject: [PATCH] rcu: Fix racy re-initialization ofirq_workcausing hangsRCU re-initializes the deferred QS irq work everytime before attempting to queue it. However there are situations where the irq work is attempted to be queued even though it is already queued. In that case re-initializing messes-up with the irq work queue that is about to be handled.
The chances for that to happen are higher when the architecture doesn't support self-IPIs and irq work are then all lazy, such as with the following sequence:
1)
rcu_read_unlock()is called when IRQs are disabled and there is a grace period involving blocked tasks on the node. The irq work is then initialized and queued.2) The related tasks are unblocked and the CPU quiescent state is reported.
rdp->defer_qs_iw_pendingis reset toDEFER_QS_IDLE, allowing the irq work to be requeued in the future (note the previous one hasn't fired yet).3) A new grace period starts and the node has blocked tasks.
4)
rcu_read_unlock()is called when IRQs are disabled again. The irq work is re-initialized (but it's queued! and its node is cleared) and requeued. Which means it's requeued to itself.5) The irq work finally fires with the tick. But since it was requeued to itself, it loops and hangs.
Quoted 7 lines
Fix this with initializing the irq work only once before the CPU boots.
Fixes b41642c87716 ("rcu: Fix rcu_read_unlock() deadloop due to IRQ work")Reported-by kernel test robot <[email protected]>Signed-off-by Frederic Weisbecker <[email protected]>---
Can you please update testing results with the proposed fix?
- Neeraj
Oliver Sang
Tested-byhi, Neeraj,
Quoted 3 lines · Neeraj Upadhyay
Hi kernel test robot,
Quoted 1 line
#syz test
sorry, we are not syz bot :) didn't capture this.
[...]
Quoted 7 lines
Quoted 5 lines
Fixes b41642c87716 ("rcu: Fix rcu_read_unlock() deadloop due to IRQ work")Reported-by kernel test robot <[email protected]>Signed-off-by Frederic Weisbecker <[email protected]>---
Can you please update testing results with the proposed fix?
now we finished the test with the proposed fix, it works. thanks!
Quoted 4 lines
- Neeraj
Neeraj Upadhyay
maintainerQuoted 9 lines · Oliver Sang
hi, Neeraj,
Quoted 3 lines · Neeraj Upadhyay
Hi kernel test robot,
Quoted 1 line
#syz test
sorry, we are not syz bot :) didn't capture this.
Ah ok!
Quoted 8 lines
[...]
Quoted 6 lines
Quoted 5 lines
Fixes b41642c87716 ("rcu: Fix rcu_read_unlock() deadloop due to IRQ work")Reported-by kernel test robot <[email protected]>Signed-off-by Frederic Weisbecker <[email protected]>---
Quoted 6 lines
Quoted 1 line
Can you please update testing results with the proposed fix?
now we finished the test with the proposed fix, it works. thanks!
Tested-by kernel test robot <[email protected]>
Thanks for testing!
- Neeraj
Quoted 4 lines
Quoted 4 lines
- Neeraj