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

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
...@@ -636,7 +636,7 @@ static void toggle_allocation_gate(struct work_struct *work) ...@@ -636,7 +636,7 @@ static void toggle_allocation_gate(struct work_struct *work)
/* Disable static key and reset timer. */ /* Disable static key and reset timer. */
static_branch_disable(&kfence_allocation_key); static_branch_disable(&kfence_allocation_key);
#endif #endif
queue_delayed_work(system_power_efficient_wq, &kfence_timer, queue_delayed_work(system_unbound_wq, &kfence_timer,
msecs_to_jiffies(kfence_sample_interval)); msecs_to_jiffies(kfence_sample_interval));
} }
static DECLARE_DELAYED_WORK(kfence_timer, toggle_allocation_gate); static DECLARE_DELAYED_WORK(kfence_timer, toggle_allocation_gate);
...@@ -666,7 +666,7 @@ void __init kfence_init(void) ...@@ -666,7 +666,7 @@ void __init kfence_init(void)
} }
WRITE_ONCE(kfence_enabled, true); 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, 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, CONFIG_KFENCE_NUM_OBJECTS, (void *)__kfence_pool,
(void *)(__kfence_pool + KFENCE_POOL_SIZE)); (void *)(__kfence_pool + KFENCE_POOL_SIZE));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment