Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm: replace use of system_unbound_wq with system_dfl_wq

Patch series "Replace wq users and add WQ_PERCPU to alloc_workqueue()
users", v2.

This series continues the effort to refactor the Workqueue API. No
behavior changes are introduced by this series.

=== Recent changes to the WQ API ===

The following, address the recent changes in the Workqueue API:

- commit 128ea9f6ccfb ("workqueue: Add system_percpu_wq and system_dfl_wq")
- commit 930c2ea566af ("workqueue: Add new WQ_PERCPU flag")

The old workqueues will be removed in a future release cycle and
unbound will become the implicit default.

=== Introduced Changes by this series ===

1) [P 1-2] Replace use of system_wq and system_unbound_wq

Workqueue users converted to the better named new workqueues:

system_wq -> system_percpu_wq
system_unbound_wq -> system_dfl_wq

This way the old obsolete workqueues (system_wq, system_unbound_wq) can be
removed in the future.

2) [P 3] add WQ_PERCPU to remaining alloc_workqueue() users

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.

WQ_UNBOUND will be removed in future.

For more information:
https://lore.kernel.org/all/20250221112003.1dSuoGyc@linutronix.de/


This patch (of 3):

This patch continues the effort to refactor workqueue APIs, which has
begun with the changes introducing new workqueues and a new
alloc_workqueue flag:

commit 128ea9f6ccfb ("workqueue: Add system_percpu_wq and system_dfl_wq")
commit 930c2ea566af ("workqueue: Add new WQ_PERCPU flag")

The point of the refactoring is to eventually alter the default behavior
of workqueues to become unbound by default so that their workload
placement is optimized by the scheduler.

Before that to happen, workqueue users must be converted to the better
named new workqueues with no intended behaviour changes:

system_wq -> system_percpu_wq
system_unbound_wq -> system_dfl_wq

This way the old obsolete workqueues (system_wq, system_unbound_wq) can be
removed in the future.

Link: https://lkml.kernel.org/r/20260113114630.152942-1-marco.crivellari@suse.com
Link: https://lore.kernel.org/all/20250221112003.1dSuoGyc@linutronix.de/
Link: https://lkml.kernel.org/r/20260113114630.152942-2-marco.crivellari@suse.com
Signed-off-by: Marco Crivellari <marco.crivellari@suse.com>
Suggested-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Cc: Alexander Potapenko <glider@google.com>
Cc: David Hildenbrand <david@kernel.org>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Lai jiangshan <jiangshanlai@gmail.com>
Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Marco Elver <elver@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Marco Crivellari and committed by
Andrew Morton
0bcbd7cf 824b8c96

+6 -6
+1 -1
mm/backing-dev.c
··· 939 939 memcg_cgwb_list->next = NULL; /* prevent new wb's */ 940 940 spin_unlock_irq(&cgwb_lock); 941 941 942 - queue_work(system_unbound_wq, &cleanup_offline_cgwbs_work); 942 + queue_work(system_dfl_wq, &cleanup_offline_cgwbs_work); 943 943 } 944 944 945 945 /**
+3 -3
mm/kfence/core.c
··· 900 900 /* Disable static key and reset timer. */ 901 901 static_branch_disable(&kfence_allocation_key); 902 902 #endif 903 - queue_delayed_work(system_unbound_wq, &kfence_timer, 903 + queue_delayed_work(system_dfl_wq, &kfence_timer, 904 904 msecs_to_jiffies(kfence_sample_interval)); 905 905 } 906 906 ··· 950 950 #endif 951 951 952 952 WRITE_ONCE(kfence_enabled, true); 953 - queue_delayed_work(system_unbound_wq, &kfence_timer, 0); 953 + queue_delayed_work(system_dfl_wq, &kfence_timer, 0); 954 954 955 955 pr_info("initialized - using %lu bytes for %d objects at 0x%p-0x%p\n", KFENCE_POOL_SIZE, 956 956 CONFIG_KFENCE_NUM_OBJECTS, (void *)__kfence_pool, ··· 1046 1046 return kfence_init_late(); 1047 1047 1048 1048 WRITE_ONCE(kfence_enabled, true); 1049 - queue_delayed_work(system_unbound_wq, &kfence_timer, 0); 1049 + queue_delayed_work(system_dfl_wq, &kfence_timer, 0); 1050 1050 pr_info("re-enabled\n"); 1051 1051 return 0; 1052 1052 }
+2 -2
mm/memcontrol.c
··· 644 644 * in latency-sensitive paths is as cheap as possible. 645 645 */ 646 646 __mem_cgroup_flush_stats(root_mem_cgroup, true); 647 - queue_delayed_work(system_unbound_wq, &stats_flush_dwork, FLUSH_TIME); 647 + queue_delayed_work(system_dfl_wq, &stats_flush_dwork, FLUSH_TIME); 648 648 } 649 649 650 650 unsigned long memcg_page_state(struct mem_cgroup *memcg, int idx) ··· 3841 3841 goto offline_kmem; 3842 3842 3843 3843 if (unlikely(mem_cgroup_is_root(memcg)) && !mem_cgroup_disabled()) 3844 - queue_delayed_work(system_unbound_wq, &stats_flush_dwork, 3844 + queue_delayed_work(system_dfl_wq, &stats_flush_dwork, 3845 3845 FLUSH_TIME); 3846 3846 lru_gen_online_memcg(memcg); 3847 3847