This continues the effort to refactor workqueue APIs, which began with
the introduction of new workqueues and a new alloc_workqueue flag in:
commit 128ea9f6ccfb ("workqueue: Add system_percpu_wq and system_dfl_wq")
commit 930c2ea566af ("workqueue: Add new WQ_PERCPU flag")
The refactoring is going to alter the default behavior of
alloc_workqueue() to be unbound by default.
With the introduction of the WQ_PERCPU flag (equivalent to !WQ_UNBOUND),
any alloc_workqueue() caller that doesn’t explicitly specify WQ_UNBOUND
must now use WQ_PERCPU. For more details see the Link tag below.
In order to keep alloc_workqueue() behavior identical, explicitly request
WQ_PERCPU.
Link: https://lore.kernel.org/all/20250221112003.1dSuoGyc@linutronix.de/
Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Marco Crivellari <marco.crivellari@suse.com>
---
mm/backing-dev.c | 2 +-
mm/slub.c | 4 +++-
mm/vmstat.c | 3 ++-
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index 4c6f0b85a24e..861fee5e48b7 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -974,7 +974,7 @@ static int __init cgwb_init(void)
* system_percpu_wq. Put them in a separate wq and limit concurrency.
* There's no point in executing many of these in parallel.
*/
- cgwb_release_wq = alloc_workqueue("cgwb_release", 0, 1);
+ cgwb_release_wq = alloc_workqueue("cgwb_release", WQ_PERCPU, 1);
if (!cgwb_release_wq)
return -ENOMEM;
diff --git a/mm/slub.c b/mm/slub.c
index 861592ac5425..bbaa247dce2a 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -8542,7 +8542,9 @@ void __init kmem_cache_init(void)
void __init kmem_cache_init_late(void)
{
- flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM, 0);
+#ifndef CONFIG_SLUB_TINY
+ flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
+ 0);
WARN_ON(!flushwq);
}
diff --git a/mm/vmstat.c b/mm/vmstat.c
index 65de88cdf40e..580b5ad293d6 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -2274,7 +2274,8 @@ void __init init_mm_internals(void)
{
int ret __maybe_unused;
- mm_percpu_wq = alloc_workqueue("mm_percpu_wq", WQ_MEM_RECLAIM, 0);
+ mm_percpu_wq = alloc_workqueue("mm_percpu_wq",
+ WQ_MEM_RECLAIM | WQ_PERCPU, 0);
#ifdef CONFIG_SMP
ret = cpuhp_setup_state_nocalls(CPUHP_MM_VMSTAT_DEAD, "mm/vmstat:dead",
--
2.52.0
On 2026-01-13 12:46:30 [+0100], Marco Crivellari wrote:
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -8542,7 +8542,9 @@ void __init kmem_cache_init(void)
>
> void __init kmem_cache_init_late(void)
> {
> - flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM, 0);
> +#ifndef CONFIG_SLUB_TINY
This ifndef does not belong here.
> + flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
> + 0);
> WARN_ON(!flushwq);
> }
Without the ifndef above I am happy with
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Sebastian
On Sat, Jan 24, 2026 at 11:21 PM Sebastian Andrzej Siewior
<bigeasy@linutronix.de> wrote:
> [..]
> > void __init kmem_cache_init_late(void)
> > {
> > - flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM, 0);
> > +#ifndef CONFIG_SLUB_TINY
>
> This ifndef does not belong here.
>
> > + flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
> > + 0);
> > WARN_ON(!flushwq);
> > }
>
> Without the ifndef above I am happy with
> Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Thanks, it seems like I messed up the thing when I rebased...
--
Marco Crivellari
L3 Support Engineer
On Sat, 24 Jan 2026 23:21:35 +0100 Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote:
> On 2026-01-13 12:46:30 [+0100], Marco Crivellari wrote:
> > --- a/mm/slub.c
> > +++ b/mm/slub.c
> > @@ -8542,7 +8542,9 @@ void __init kmem_cache_init(void)
> >
> > void __init kmem_cache_init_late(void)
> > {
> > - flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM, 0);
> > +#ifndef CONFIG_SLUB_TINY
>
> This ifndef does not belong here.
>
> > + flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
> > + 0);
> > WARN_ON(!flushwq);
> > }
Yup, thanks, mm.git is carrying a -fix patch, which is actually wrong.
From: Andrew Morton <akpm@linux-foundation.org>
Subject: mm-add-wq_percpu-to-alloc_workqueue-users-fix
Date: Tue Jan 13 05:59:13 PM PST 2026
fix mm/slub.c
Cc: Marco Crivellari <marco.crivellari@suse.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
mm/slub.c | 1 +
1 file changed, 1 insertion(+)
--- a/mm/slub.c~mm-add-wq_percpu-to-alloc_workqueue-users-fix
+++ a/mm/slub.c
@@ -8546,6 +8546,7 @@ void __init kmem_cache_init_late(void)
flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
0);
WARN_ON(!flushwq);
+#endif
}
struct kmem_cache *
I'll add this:
--- a/mm/slub.c~mm-add-wq_percpu-to-alloc_workqueue-users-fix-fix
+++ a/mm/slub.c
@@ -8542,11 +8542,9 @@ void __init kmem_cache_init(void)
void __init kmem_cache_init_late(void)
{
-#ifndef CONFIG_SLUB_TINY
flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
0);
WARN_ON(!flushwq);
-#endif
}
struct kmem_cache *
_
Le Sat, Jan 24, 2026 at 03:22:41PM -0800, Andrew Morton a écrit :
> On Sat, 24 Jan 2026 23:21:35 +0100 Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote:
>
> > On 2026-01-13 12:46:30 [+0100], Marco Crivellari wrote:
> > > --- a/mm/slub.c
> > > +++ b/mm/slub.c
> > > @@ -8542,7 +8542,9 @@ void __init kmem_cache_init(void)
> > >
> > > void __init kmem_cache_init_late(void)
> > > {
> > > - flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM, 0);
> > > +#ifndef CONFIG_SLUB_TINY
> >
> > This ifndef does not belong here.
> >
> > > + flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
> > > + 0);
> > > WARN_ON(!flushwq);
> > > }
>
> Yup, thanks, mm.git is carrying a -fix patch, which is actually wrong.
>
>
> From: Andrew Morton <akpm@linux-foundation.org>
> Subject: mm-add-wq_percpu-to-alloc_workqueue-users-fix
> Date: Tue Jan 13 05:59:13 PM PST 2026
>
> fix mm/slub.c
>
> Cc: Marco Crivellari <marco.crivellari@suse.com>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> ---
>
> mm/slub.c | 1 +
> 1 file changed, 1 insertion(+)
>
> --- a/mm/slub.c~mm-add-wq_percpu-to-alloc_workqueue-users-fix
> +++ a/mm/slub.c
> @@ -8546,6 +8546,7 @@ void __init kmem_cache_init_late(void)
> flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
> 0);
> WARN_ON(!flushwq);
> +#endif
> }
>
> struct kmem_cache *
>
>
>
> I'll add this:
>
> --- a/mm/slub.c~mm-add-wq_percpu-to-alloc_workqueue-users-fix-fix
> +++ a/mm/slub.c
> @@ -8542,11 +8542,9 @@ void __init kmem_cache_init(void)
>
> void __init kmem_cache_init_late(void)
> {
> -#ifndef CONFIG_SLUB_TINY
> flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
> 0);
> WARN_ON(!flushwq);
> -#endif
With that as a fixup, looks good:
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
--
Frederic Weisbecker
SUSE Labs
Hi Marco,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on linus/master v6.19-rc5 next-20260113]
[cannot apply to vbabka-slab/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Marco-Crivellari/mm-Replace-use-of-system_unbound_wq-with-system_dfl_wq/20260113-195017
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20260113114630.152942-4-marco.crivellari%40suse.com
patch subject: [PATCH v2 3/3] mm: add WQ_PERCPU to alloc_workqueue users
config: riscv-randconfig-002-20260114 (https://download.01.org/0day-ci/archive/20260114/202601141042.qJuTeEP0-lkp@intel.com/config)
compiler: riscv64-linux-gcc (GCC) 9.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260114/202601141042.qJuTeEP0-lkp@intel.com/reproduce)
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 <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601141042.qJuTeEP0-lkp@intel.com/
All errors (new ones prefixed by >>):
>> mm/slub.c:8545: error: unterminated #ifndef
8545 | #ifndef CONFIG_SLUB_TINY
|
vim +8545 mm/slub.c
8542
8543 void __init kmem_cache_init_late(void)
8544 {
> 8545 #ifndef CONFIG_SLUB_TINY
8546 flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
8547 0);
8548 WARN_ON(!flushwq);
8549 }
8550
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Hi Marco,
kernel test robot noticed the following build errors:
[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on linus/master v6.19-rc5 next-20260113]
[cannot apply to vbabka-slab/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Marco-Crivellari/mm-Replace-use-of-system_unbound_wq-with-system_dfl_wq/20260113-195017
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20260113114630.152942-4-marco.crivellari%40suse.com
patch subject: [PATCH v2 3/3] mm: add WQ_PERCPU to alloc_workqueue users
config: arm-randconfig-002-20260114 (https://download.01.org/0day-ci/archive/20260114/202601140922.x7qD91JV-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 9b8addffa70cee5b2acc5454712d9cf78ce45710)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260114/202601140922.x7qD91JV-lkp@intel.com/reproduce)
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 <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601140922.x7qD91JV-lkp@intel.com/
All errors (new ones prefixed by >>):
>> mm/slub.c:8545:2: error: unterminated conditional directive
8545 | #ifndef CONFIG_SLUB_TINY
| ^
1 error generated.
vim +8545 mm/slub.c
8542
8543 void __init kmem_cache_init_late(void)
8544 {
> 8545 #ifndef CONFIG_SLUB_TINY
8546 flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
8547 0);
8548 WARN_ON(!flushwq);
8549 }
8550
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
On Tue, 13 Jan 2026 12:46:30 +0100 Marco Crivellari <marco.crivellari@suse.com> wrote:
> This continues the effort to refactor workqueue APIs, which began with
> the introduction of new workqueues and a new alloc_workqueue flag in:
>
> commit 128ea9f6ccfb ("workqueue: Add system_percpu_wq and system_dfl_wq")
> commit 930c2ea566af ("workqueue: Add new WQ_PERCPU flag")
>
> The refactoring is going to alter the default behavior of
> alloc_workqueue() to be unbound by default.
>
> With the introduction of the WQ_PERCPU flag (equivalent to !WQ_UNBOUND),
> any alloc_workqueue() caller that doesn’t explicitly specify WQ_UNBOUND
> must now use WQ_PERCPU. For more details see the Link tag below.
>
> In order to keep alloc_workqueue() behavior identical, explicitly request
> WQ_PERCPU.
>
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -8542,7 +8542,9 @@ void __init kmem_cache_init(void)
>
> void __init kmem_cache_init_late(void)
> {
> - flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM, 0);
> +#ifndef CONFIG_SLUB_TINY
> + flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
> + 0);
> WARN_ON(!flushwq);
> }
>
oops. I did this:
--- a/mm/slub.c~mm-add-wq_percpu-to-alloc_workqueue-users-fix
+++ a/mm/slub.c
@@ -8546,6 +8546,7 @@ void __init kmem_cache_init_late(void)
flushwq = alloc_workqueue("slub_flushwq", WQ_MEM_RECLAIM | WQ_PERCPU,
0);
WARN_ON(!flushwq);
+#endif
}
struct kmem_cache *
_
© 2016 - 2026 Red Hat, Inc.