Messages in this thread Patch in this message | | | Subject | Re: [PATCH] sched/rt: Plug rt_mutex_setprio() vs push_rt_task() race | From | Dietmar Eggemann <> | Date | Mon, 24 Jan 2022 10:37:43 +0100 |
| |
On 20/01/2022 20:40, Valentin Schneider wrote:
[...]
> diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c > index 7b4f4fbbb404..48fc8c04b038 100644 > --- a/kernel/sched/rt.c > +++ b/kernel/sched/rt.c > @@ -2026,6 +2026,16 @@ static int push_rt_task(struct rq *rq, bool pull) > return 0; > > retry: > + /* > + * It's possible that the next_task slipped in of > + * higher priority than current. If that's the case > + * just reschedule current. > + */ > + if (unlikely(next_task->prio < rq->curr->prio)) { > + resched_curr(rq); > + return 0; > + }
If we do this before `is_migration_disabled(next_task), shouldn't then the related condition in push_dl_task() also be moved up?
if (dl_task(rq->curr) && dl_time_before(next_task->dl.deadline, rq->curr->dl.deadline) && rq->curr->nr_cpus_allowed > 1)
To enforce resched_curr(rq) in the `is_migration_disabled(next_task)` case there as well?
> + > if (is_migration_disabled(next_task)) { > struct task_struct *push_task = NULL; > int cpu; > @@ -2033,6 +2043,17 @@ static int push_rt_task(struct rq *rq, bool pull) > if (!pull || rq->push_busy) > return 0; > > + /* > + * Per the above priority check, curr is at least RT. If it's > + * of a higher class than RT, invoking find_lowest_rq() on it > + * doesn't make sense. > + * > + * Note that the stoppers are masqueraded as SCHED_FIFO > + * (cf. sched_set_stop_task()), so we can't rely on rt_task(). > + */ > + if (rq->curr->sched_class != &rt_sched_class)
s/ != / > / ... since the `unlikely(next_task->prio < rq->curr->prio)` already filters tasks from lower sched classes (CFS)?
> + return 0; > +
[...]
| |