mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 10:04:04 +02:00
- 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 -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEzv7L6UO9uDPlPSfHEsHwGGHeVUoFAmhqM/8ACgkQEsHwGGHe VUqxng/+P/CQXrijxNOTSlN0NeDfuVPMtpmaijDONxa+m/BAxDjNKVuJefZY/tGa jV14hTUMIQkrjuSapIdN2Io02dK7p371ozsOxjNB+kJvDI6kKkOkOn1tWLOGyI+e oTIrpJvuxTkVmJOud+3Bl6OR/k+mrQ2R5ud5xJ/exgmBz+wRaRMxIYwQBlmCAZ7I uzrR94VL++sZdIuWrBt/5qFQMiwJ3xdrruhz/wdWoq6OQJovNECV1TGFZifKh2Rh 4DXoMR46gPRXV0r5JoP8BSyw0V2PGwFnVoM3PsOCcN1guJgdiKszCGp89lzN5Z2x ySDegu6rnpYoaCmQLjBngGlzBnaEKWKUz9IYrXr/qGjVR8GIvoWjAhOQWvbXjyS2 5CHRsUBlSJhwlTPJc5RGt8+O9ahWkBGPBCSsnImygTMGl2JIxsZUEEv8ELxaUq5K qTAZKYBwzOb2aA3FNe51Pwpz8SI3TKcDLWujHvcNeOSlbO23Bg/TTa3OCy1c3gGg HJ7dKw5lSi89VzKhpWwhqBKL1vu/fuVTZ52GCu0BiiwYfCVJwYD40vNNKgiiG1oq X2Sr4DUCtwzpFcIMfo9yJ9scqaT5gJywydnB4+oHlbg5OCLDOuWCs0EGGOCPd4LY Gi3ft9MBepwYeuCv7DELKKO62jIrlDeOU2FmW+9/RC7/z5egWI4= =ubM9 -----END PGP SIGNATURE----- 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:
commit
772b78c2ab
|
|
@ -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 @@ static void update_curr_dl_se(struct rq *rq, struct sched_dl_entity *dl_se, s64
|
|||
*/
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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 @@ static int cpu_stop_queue_two_works(int cpu1, struct cpu_stop_work *work1,
|
|||
}
|
||||
|
||||
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 @@ static int cpu_stop_queue_two_works(int cpu1, struct cpu_stop_work *work1,
|
|||
goto retry;
|
||||
}
|
||||
|
||||
wake_up_q(&wakeq);
|
||||
if (!err) {
|
||||
wake_up_process(stopper1->thread);
|
||||
wake_up_process(stopper2->thread);
|
||||
}
|
||||
preempt_enable();
|
||||
|
||||
return err;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user