Commit ff06e45d authored by Marco Elver's avatar Marco Elver Committed by Linus Torvalds
Browse files

kfence: unconditionally use unbound work queue

Unconditionally use unbound work queue, and not just if wq_power_efficient
is true.  Because if the system is idle, KFENCE may wait, and by being run
on the unbound work queue, we permit the scheduler to make better
scheduling decisions and not require pinning KFENCE to the same CPU upon
waking up.

Link: https://lkml.kernel.org/r/20210521111630.472579-1-elver@google.com


Fixes: 36f0b35d ("kfence: use power-efficient work queue to run delayed work")
Signed-off-by: default avatarMarco Elver <elver@google.com>
Reported-by: default avatarHillf Danton <hdanton@sina.com>
Reviewed-by: default avatarAlexander Potapenko <glider@google.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1c2f7d14
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -636,7 +636,7 @@ static void toggle_allocation_gate(struct work_struct *work)
	/* Disable static key and reset timer. */
	static_branch_disable(&kfence_allocation_key);
#endif
	queue_delayed_work(system_power_efficient_wq, &kfence_timer,
	queue_delayed_work(system_unbound_wq, &kfence_timer,
			   msecs_to_jiffies(kfence_sample_interval));
}
static DECLARE_DELAYED_WORK(kfence_timer, toggle_allocation_gate);
@@ -666,7 +666,7 @@ void __init kfence_init(void)
	}

	WRITE_ONCE(kfence_enabled, true);
	queue_delayed_work(system_power_efficient_wq, &kfence_timer, 0);
	queue_delayed_work(system_unbound_wq, &kfence_timer, 0);
	pr_info("initialized - using %lu bytes for %d objects at 0x%p-0x%p\n", KFENCE_POOL_SIZE,
		CONFIG_KFENCE_NUM_OBJECTS, (void *)__kfence_pool,
		(void *)(__kfence_pool + KFENCE_POOL_SIZE));