--- x/kernel/sched/deadline.c +++ y/kernel/sched/deadline.c @@ -1498,6 +1498,9 @@ static void update_curr_dl_se(struct rq * starting a new period, pushing the activation. */ if (dl_se->dl_defer && dl_se->dl_throttled && dl_runtime_exceeded(dl_se)) { + bool lock = rq != dl_se->rq; + struct rq_flags rf; + struct rq *__rq = dl_se->rq; /* * If the server was previously activated - the starving condition * took place, it this point it went away because the fair scheduler @@ -1508,7 +1511,11 @@ static void update_curr_dl_se(struct rq hrtimer_try_to_cancel(&dl_se->dl_timer); + if (lock) + rq_lock(__rq, &rf); replenish_dl_new_period(dl_se, dl_se->rq); + if (lock) + rq_unlock(__rq, &rf); /* * Not being able to start the timer seems problematic. If it could not