Skip to content

Commit ccaeeb5

Browse files
Zqianghtejun
authored andcommitted
sched_ext: Use the resched_cpu() to replace resched_curr() in the bypass_lb_node()
For the PREEMPT_RT kernels, the scx_bypass_lb_timerfn() running in the preemptible per-CPU ktimer kthread context, this means that the following scenarios will occur(for x86 platform): cpu1 cpu2 ktimer kthread: ->scx_bypass_lb_timerfn ->bypass_lb_node ->for_each_cpu(cpu, resched_mask) migration/1: by preempt by migration/2: multi_cpu_stop() multi_cpu_stop() ->take_cpu_down() ->__cpu_disable() ->set cpu1 offline ->rq1 = cpu_rq(cpu1) ->resched_curr(rq1) ->smp_send_reschedule(cpu1) ->native_smp_send_reschedule(cpu1) ->if(unlikely(cpu_is_offline(cpu))) { WARN(1, "sched: Unexpected reschedule of offline CPU#%d!\n", cpu); return; } This commit therefore use the resched_cpu() to replace resched_curr() in the bypass_lb_node() to avoid send-ipi to offline CPUs. Signed-off-by: Zqiang <[email protected]> Reviewed-by: Andrea Righi <[email protected]> Signed-off-by: Tejun Heo <[email protected]>
1 parent 12494e5 commit ccaeeb5

1 file changed

Lines changed: 2 additions & 7 deletions

File tree

kernel/sched/ext.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3956,13 +3956,8 @@ static void bypass_lb_node(struct scx_sched *sch, int node)
39563956
nr_donor_target, nr_target);
39573957
}
39583958

3959-
for_each_cpu(cpu, resched_mask) {
3960-
struct rq *rq = cpu_rq(cpu);
3961-
3962-
raw_spin_rq_lock_irq(rq);
3963-
resched_curr(rq);
3964-
raw_spin_rq_unlock_irq(rq);
3965-
}
3959+
for_each_cpu(cpu, resched_mask)
3960+
resched_cpu(cpu);
39663961

39673962
for_each_cpu_and(cpu, cpu_online_mask, node_mask) {
39683963
u32 nr = READ_ONCE(cpu_rq(cpu)->scx.bypass_dsq.nr);

0 commit comments

Comments
 (0)