[PATCH] random: replace use of system_unbound_wq with system_dfl_wq

Marco Crivellari posted 1 patch 3 months, 1 week ago
drivers/char/random.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
[PATCH] random: replace use of system_unbound_wq with system_dfl_wq
Posted by Marco Crivellari 3 months, 1 week ago
Currently if a user enqueue a work item using schedule_delayed_work() the
used wq is "system_wq" (per-cpu wq) while queue_delayed_work() use
WORK_CPU_UNBOUND (used when a cpu is not specified). The same applies to
schedule_work() that is using system_wq and queue_work(), that makes use
again of WORK_CPU_UNBOUND.

This lack of consistency cannot be addressed without refactoring the API.

system_unbound_wq should be the default workqueue so as not to enforce
locality constraints for random work whenever it's not required.

Adding system_dfl_wq to encourage its use when unbound work should be used.

The old system_unbound_wq will be kept for a few release cycles.

Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Marco Crivellari <marco.crivellari@suse.com>
---
 drivers/char/random.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/char/random.c b/drivers/char/random.c
index b8b24b6ed3fe..92ec34a303c9 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -259,8 +259,8 @@ static void crng_reseed(struct work_struct *work)
 	u8 key[CHACHA_KEY_SIZE];
 
 	/* Immediately schedule the next reseeding, so that it fires sooner rather than later. */
-	if (likely(system_unbound_wq))
-		queue_delayed_work(system_unbound_wq, &next_reseed, crng_reseed_interval());
+	if (likely(system_dfl_wq))
+		queue_delayed_work(system_dfl_wq, &next_reseed, crng_reseed_interval());
 
 	extract_entropy(key, sizeof(key));
 
@@ -741,8 +741,8 @@ static void __cold _credit_init_bits(size_t bits)
 
 	if (orig < POOL_READY_BITS && new >= POOL_READY_BITS) {
 		crng_reseed(NULL); /* Sets crng_init to CRNG_READY under base_crng.lock. */
-		if (static_key_initialized && system_unbound_wq)
-			queue_work(system_unbound_wq, &set_ready);
+		if (static_key_initialized && system_dfl_wq)
+			queue_work(system_dfl_wq, &set_ready);
 		atomic_notifier_call_chain(&random_ready_notifier, 0, NULL);
 #ifdef CONFIG_VDSO_GETRANDOM
 		WRITE_ONCE(vdso_k_rng_data->is_ready, true);
-- 
2.51.0
Re: [PATCH] random: replace use of system_unbound_wq with system_dfl_wq
Posted by Jason A. Donenfeld 3 months, 1 week ago
On Thu, Oct 30, 2025 at 4:58 PM Marco Crivellari
<marco.crivellari@suse.com> wrote:
>
> Currently if a user enqueue a work item using schedule_delayed_work() the
> used wq is "system_wq" (per-cpu wq) while queue_delayed_work() use
> WORK_CPU_UNBOUND (used when a cpu is not specified). The same applies to
> schedule_work() that is using system_wq and queue_work(), that makes use
> again of WORK_CPU_UNBOUND.
>
> This lack of consistency cannot be addressed without refactoring the API.
>
> system_unbound_wq should be the default workqueue so as not to enforce
> locality constraints for random work whenever it's not required.
>
> Adding system_dfl_wq to encourage its use when unbound work should be used.
>
> The old system_unbound_wq will be kept for a few release cycles.
>
> Suggested-by: Tejun Heo <tj@kernel.org>
> Signed-off-by: Marco Crivellari <marco.crivellari@suse.com>

I rewrote the copy&pasted commit message to be simpler and also
include a reference to 128ea9f6ccfb ("workqueue: Add system_percpu_wq
and system_dfl_wq"). And then I queued it up in the random tree.
Thanks for the patch.

Jason
Re: [PATCH] random: replace use of system_unbound_wq with system_dfl_wq
Posted by Marco Crivellari 3 months, 1 week ago
On Thu, Oct 30, 2025 at 6:50 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote:
> [...]
> I rewrote the copy&pasted commit message to be simpler and also
> include a reference to 128ea9f6ccfb ("workqueue: Add system_percpu_wq
> and system_dfl_wq"). And then I queued it up in the random tree.
> Thanks for the patch.
>
> Jason

Many thanks Jason!

-- 

Marco Crivellari

L3 Support Engineer, Technology & Product