On Sat, Jan 04, 2025 at 01:00:17PM +0900, Koichiro Den wrote: > On Fri, Jan 03, 2025 at 11:33:19PM +0000, Lorenzo Stoakes wrote: > > Hi, > > > > I observed a warning in my qemu and real hardware, which I bisected to this commit: > > > > [ 0.087733] ------------[ cut here ]------------ > > [ 0.087733] workqueue: work disable count underflowed > > [ 0.087733] WARNING: CPU: 1 PID: 21 at kernel/workqueue.c:4313 enable_work+0xb5/0xc0 FWIW, I hit similar when testing v6.13-rc6 defconfig on arm64, when booting secondaries I always get a splat (trimmed): | ------------[ cut here ]------------ | workqueue: work disable count underflowed | WARNING: CPU: 1 PID: 21 at kernel/workqueue.c:4317 enable_work+0xfc/0x108 | Modules linked in: | CPU: 1 UID: 0 PID: 21 Comm: cpuhp/1 Not tainted 6.13.0-rc6 #1 | Hardware name: linux,dummy-virt (DT) | [...] | Call trace: | enable_work+0xfc/0x108 (P) | enable_delayed_work+0x10/0x1c | vmstat_cpu_online+0x88/0xbc | cpuhp_invoke_callback+0x10c/0x208 | cpuhp_thread_fun+0xb0/0x1a0 | smpboot_thread_fn+0x20c/0x234 | kthread+0x110/0x114 | ret_from_fork+0x10/0x20 | ---[ end trace 0000000000000000 ]--- [...] > In my current view, the simplest solution would be to make sure a local > vmstat_work is disabled until vmstat_cpu_online() runs for the cpu, even > during boot-up. The following patch suppresses the warning: > > diff --git a/mm/vmstat.c b/mm/vmstat.c > index 0889b75cef14..19ceed5d34bf 100644 > --- a/mm/vmstat.c > +++ b/mm/vmstat.c > @@ -2122,10 +2122,14 @@ static void __init start_shepherd_timer(void) > { > int cpu; > > - for_each_possible_cpu(cpu) > + for_each_possible_cpu(cpu) { > INIT_DEFERRABLE_WORK(per_cpu_ptr(&vmstat_work, cpu), > vmstat_update); > > + /* will be enabled on vmstat_cpu_online */ > + disable_delayed_work_sync(&per_cpu(vmstat_work, cpu)); > + } > + > schedule_delayed_work(&shepherd, > round_jiffies_relative(sysctl_stat_interval)); > } FWIW, the above solves the warning for me. Mark.