Re: [PATCH v2] smpboot: Run the thread function only once before parking

From: Sebastian Andrzej Siewior

Date: Fri Nov 06 2026 - 05:46:21 EST


On 2026-11-04 16:58:09 [-0500], Mani Tofigh via B4 Relay wrote:
> From: Mani Tofigh <mt4022@xxxxxxxxxxxx>
>
> Since commit 4a3b51aab6e2 ("smpboot: Don't park the thread if work is
> pending"), smpboot_thread_fn() parks only once thread_should_run() is
> false. CPU offline waits for that with no timeout and with
> cpu_hotplug_lock held for write.
>
> When the outgoing CPU keeps receiving more packets than it can process,
> ksoftirqd always has NET_RX pending and never parks. The offline then
> waits for as long as the packets keep coming and everything that takes
> cpus_read_lock() waits with it:

I would end with a full stop and strip the backtrace. We do know what it
looks like.

> [ 41.469979] INFO: task kworker/0:1:10 blocked for more than 20 seconds.
> [ 41.470020] task:kworker/0:1 state:D stack:28392 pid:10 tgid:10 ppid:2 task_flags:0x4208060 flags:0x00080000
> [ 41.470055] Workqueue: events vmstat_shepherd
> [ 41.470077] Call Trace:
> [ 41.470082] <TASK>
> [ 41.470091] __schedule+0x10f1/0x4760
> [ 41.470175] schedule+0xd7/0x2c0
> [ 41.470189] percpu_rwsem_wait+0x1f8/0x4e0
> [ 41.470269] __percpu_down_read+0x11f/0x3e0
> [ 41.470287] cpus_read_lock+0xc1/0xd0
> [ 41.470301] vmstat_shepherd+0x22/0x2a0
> [ 41.470315] process_one_work+0x92b/0x16d0
> [ 41.470393] worker_thread+0x4e6/0xd60
> [ 41.470507] kthread+0x300/0x3e0
> [ 41.470542] ret_from_fork+0x4f0/0x6f0
> [ 41.470597] ret_from_fork_asm+0x1a/0x30
> [ 41.470623] </TASK>
> [ 41.470635] INFO: task cpuhp/3:33 blocked for more than 20 seconds.
> [ 41.470653] task:cpuhp/3 state:D stack:27976 pid:33 tgid:33 ppid:2 task_flags:0x4208040 flags:0x00080000
> [ 41.470678] Call Trace:
> [ 41.470682] <TASK>
> [ 41.470690] __schedule+0x10f1/0x4760
> [ 41.470753] schedule+0xd7/0x2c0
> [ 41.470766] schedule_timeout+0x176/0x250
> [ 41.470849] wait_for_completion+0x169/0x3b0
> [ 41.470918] kthread_park+0xff/0x180
> [ 41.470934] smpboot_park_threads+0xd5/0x160
> [ 41.470959] cpuhp_invoke_callback+0x2b0/0x1190
> [ 41.470995] cpuhp_thread_fun+0x2f8/0x6d0
> [ 41.471027] smpboot_thread_fn+0x2fb/0x8a0
> [ 41.471051] kthread+0x300/0x3e0
> [ 41.471083] ret_from_fork+0x4f0/0x6f0
> [ 41.471132] ret_from_fork_asm+0x1a/0x30
> [ 41.471154] </TASK>
>
> That commit only needs the work queued before the park request to run
> once on its own CPU. Softirqs left pending are taken over by the
> dead-CPU callbacks as before. So on a park request, run the thread
> function once if there is work and then park. With the fix, the
> offline finishes under the same load.
>
> This bug was identified and confirmed with the help of a deterministic
> hypervisor currently under development. The C reproducer below however
> hits it within about 25s.
>
> Fixes: 4a3b51aab6e2 ("smpboot: Don't park the thread if work is pending")
> Signed-off-by: Mani Tofigh <mt4022@xxxxxxxxxxxx>

Other than that,
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>

> ---
> Changes in v2:
> - Use Sebastian's comment above the thread function call
> - Link to v1: https://lore.kernel.org/all/20261102-smpboot-park-once-v1-1-920282635d20@xxxxxxxxxxxx/
>
> Reproducer: https://github.com/manitofigh/files/blob/main/linux-repros/ksoftpark.c

Sebastian