Merge tag 'sched_urgent_for_v6.16_rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler fixes from Borislav Petkov: - Fix the calculation of the deadline server task's runtime as this mishap was preventing realtime tasks from running - Avoid a race condition during migrate-swapping two tasks - Fix the string reported for the "none" dynamic preemption option * tag 'sched_urgent_for_v6.16_rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: sched/deadline: Fix dl_server runtime calculation formula sched/core: Fix migrate_swap() vs. hotplug sched: Fix preemption string of preempt_dynamic_none
This commit is contained in:
+6
-1
@@ -3943,6 +3943,11 @@ static inline bool ttwu_queue_cond(struct task_struct *p, int cpu)
|
||||
if (!scx_allow_ttwu_queue(p))
|
||||
return false;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
if (p->sched_class == &stop_sched_class)
|
||||
return false;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Do not complicate things with the async wake_list while the CPU is
|
||||
* in hotplug state.
|
||||
@@ -7663,7 +7668,7 @@ const char *preempt_model_str(void)
|
||||
|
||||
if (IS_ENABLED(CONFIG_PREEMPT_DYNAMIC)) {
|
||||
seq_buf_printf(&s, "(%s)%s",
|
||||
preempt_dynamic_mode > 0 ?
|
||||
preempt_dynamic_mode >= 0 ?
|
||||
preempt_modes[preempt_dynamic_mode] : "undef",
|
||||
brace ? "}" : "");
|
||||
return seq_buf_str(&s);
|
||||
|
||||
@@ -1504,7 +1504,9 @@ static void update_curr_dl_se(struct rq *rq, struct sched_dl_entity *dl_se, s64
|
||||
if (dl_entity_is_special(dl_se))
|
||||
return;
|
||||
|
||||
scaled_delta_exec = dl_scaled_delta_exec(rq, dl_se, delta_exec);
|
||||
scaled_delta_exec = delta_exec;
|
||||
if (!dl_server(dl_se))
|
||||
scaled_delta_exec = dl_scaled_delta_exec(rq, dl_se, delta_exec);
|
||||
|
||||
dl_se->runtime -= scaled_delta_exec;
|
||||
|
||||
@@ -1611,7 +1613,7 @@ throttle:
|
||||
*/
|
||||
void dl_server_update_idle_time(struct rq *rq, struct task_struct *p)
|
||||
{
|
||||
s64 delta_exec, scaled_delta_exec;
|
||||
s64 delta_exec;
|
||||
|
||||
if (!rq->fair_server.dl_defer)
|
||||
return;
|
||||
@@ -1624,9 +1626,7 @@ void dl_server_update_idle_time(struct rq *rq, struct task_struct *p)
|
||||
if (delta_exec < 0)
|
||||
return;
|
||||
|
||||
scaled_delta_exec = dl_scaled_delta_exec(rq, &rq->fair_server, delta_exec);
|
||||
|
||||
rq->fair_server.runtime -= scaled_delta_exec;
|
||||
rq->fair_server.runtime -= delta_exec;
|
||||
|
||||
if (rq->fair_server.runtime < 0) {
|
||||
rq->fair_server.dl_defer_running = 0;
|
||||
|
||||
+10
-10
@@ -82,18 +82,15 @@ static void cpu_stop_signal_done(struct cpu_stop_done *done)
|
||||
}
|
||||
|
||||
static void __cpu_stop_queue_work(struct cpu_stopper *stopper,
|
||||
struct cpu_stop_work *work,
|
||||
struct wake_q_head *wakeq)
|
||||
struct cpu_stop_work *work)
|
||||
{
|
||||
list_add_tail(&work->list, &stopper->works);
|
||||
wake_q_add(wakeq, stopper->thread);
|
||||
}
|
||||
|
||||
/* queue @work to @stopper. if offline, @work is completed immediately */
|
||||
static bool cpu_stop_queue_work(unsigned int cpu, struct cpu_stop_work *work)
|
||||
{
|
||||
struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu);
|
||||
DEFINE_WAKE_Q(wakeq);
|
||||
unsigned long flags;
|
||||
bool enabled;
|
||||
|
||||
@@ -101,12 +98,13 @@ static bool cpu_stop_queue_work(unsigned int cpu, struct cpu_stop_work *work)
|
||||
raw_spin_lock_irqsave(&stopper->lock, flags);
|
||||
enabled = stopper->enabled;
|
||||
if (enabled)
|
||||
__cpu_stop_queue_work(stopper, work, &wakeq);
|
||||
__cpu_stop_queue_work(stopper, work);
|
||||
else if (work->done)
|
||||
cpu_stop_signal_done(work->done);
|
||||
raw_spin_unlock_irqrestore(&stopper->lock, flags);
|
||||
|
||||
wake_up_q(&wakeq);
|
||||
if (enabled)
|
||||
wake_up_process(stopper->thread);
|
||||
preempt_enable();
|
||||
|
||||
return enabled;
|
||||
@@ -264,7 +262,6 @@ static int cpu_stop_queue_two_works(int cpu1, struct cpu_stop_work *work1,
|
||||
{
|
||||
struct cpu_stopper *stopper1 = per_cpu_ptr(&cpu_stopper, cpu1);
|
||||
struct cpu_stopper *stopper2 = per_cpu_ptr(&cpu_stopper, cpu2);
|
||||
DEFINE_WAKE_Q(wakeq);
|
||||
int err;
|
||||
|
||||
retry:
|
||||
@@ -300,8 +297,8 @@ retry:
|
||||
}
|
||||
|
||||
err = 0;
|
||||
__cpu_stop_queue_work(stopper1, work1, &wakeq);
|
||||
__cpu_stop_queue_work(stopper2, work2, &wakeq);
|
||||
__cpu_stop_queue_work(stopper1, work1);
|
||||
__cpu_stop_queue_work(stopper2, work2);
|
||||
|
||||
unlock:
|
||||
raw_spin_unlock(&stopper2->lock);
|
||||
@@ -316,7 +313,10 @@ unlock:
|
||||
goto retry;
|
||||
}
|
||||
|
||||
wake_up_q(&wakeq);
|
||||
if (!err) {
|
||||
wake_up_process(stopper1->thread);
|
||||
wake_up_process(stopper2->thread);
|
||||
}
|
||||
preempt_enable();
|
||||
|
||||
return err;
|
||||
|
||||
Reference in New Issue
Block a user