[PATCH v2 3/3] mm: add WQ_PERCPU to alloc_workqueue users

Marco Crivellari posted 3 patches 3 weeks, 5 days ago
[PATCH v2 3/3] mm: add WQ_PERCPU to alloc_workqueue users
Posted by Marco Crivellari 3 weeks, 5 days ago
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

Re: [PATCH v2 3/3] mm: add WQ_PERCPU to alloc_workqueue users
Posted by Sebastian Andrzej Siewior 2 weeks, 1 day ago
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
Re: [PATCH v2 3/3] mm: add WQ_PERCPU to alloc_workqueue users
Posted by Marco Crivellari 1 week, 6 days ago
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
Re: [PATCH v2 3/3] mm: add WQ_PERCPU to alloc_workqueue users
Posted by Andrew Morton 2 weeks, 1 day ago
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 *
_
Re: [PATCH v2 3/3] mm: add WQ_PERCPU to alloc_workqueue users
Posted by Frederic Weisbecker 1 week, 5 days ago
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
Re: [PATCH v2 3/3] mm: add WQ_PERCPU to alloc_workqueue users
Posted by kernel test robot 3 weeks, 5 days ago
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
Re: [PATCH v2 3/3] mm: add WQ_PERCPU to alloc_workqueue users
Posted by kernel test robot 3 weeks, 5 days ago
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
Re: [PATCH v2 3/3] mm: add WQ_PERCPU to alloc_workqueue users
Posted by Andrew Morton 3 weeks, 5 days ago
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 *
_