From: Andrea Righi Date: Tue, 25 Feb 2025 09:37:42 +0000 (+0100) Subject: sched_ext: idle: Fix scx_bpf_pick_any_cpu_node() behavior X-Git-Tag: io_uring-6.15-20250403~149^2~10 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=fde7d64766c1142fe79507bbef4968cee274cc0b;p=linux-block.git sched_ext: idle: Fix scx_bpf_pick_any_cpu_node() behavior When %SCX_PICK_IDLE_IN_NODE is specified, scx_bpf_pick_any_cpu_node() should always return a CPU from the specified node, regardless of its idle state. Also clarify this logic in the function documentation. Fixes: 01059219b0cfd ("sched_ext: idle: Introduce node-aware idle cpu kfunc helpers") Signed-off-by: Andrea Righi Signed-off-by: Tejun Heo --- diff --git a/kernel/sched/ext_idle.c b/kernel/sched/ext_idle.c index 759a06774b5b..dc40e0baf77c 100644 --- a/kernel/sched/ext_idle.c +++ b/kernel/sched/ext_idle.c @@ -1029,8 +1029,9 @@ __bpf_kfunc s32 scx_bpf_pick_idle_cpu(const struct cpumask *cpus_allowed, * empty. * * The search starts from @node and proceeds to other online NUMA nodes in - * order of increasing distance (unless SCX_PICK_IDLE_IN_NODE is specified, - * in which case the search is limited to the target @node). + * order of increasing distance (unless %SCX_PICK_IDLE_IN_NODE is specified, + * in which case the search is limited to the target @node, regardless of + * the CPU idle state). * * If ops.update_idle() is implemented and %SCX_OPS_KEEP_BUILTIN_IDLE is not * set, this function can't tell which CPUs are idle and will always pick any @@ -1049,7 +1050,10 @@ __bpf_kfunc s32 scx_bpf_pick_any_cpu_node(const struct cpumask *cpus_allowed, if (cpu >= 0) return cpu; - cpu = cpumask_any_distribute(cpus_allowed); + if (flags & SCX_PICK_IDLE_IN_NODE) + cpu = cpumask_any_and_distribute(cpumask_of_node(node), cpus_allowed); + else + cpu = cpumask_any_distribute(cpus_allowed); if (cpu < nr_cpu_ids) return cpu; else