diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c index 284bbe2a79c9..53069b1b4762 100644 --- a/kernel/locking/rtmutex.c +++ b/kernel/locking/rtmutex.c @@ -348,12 +348,7 @@ static __always_inline bool unlock_rt_mutex_safe(struct rt_mutex_base *lock, static __always_inline int __waiter_prio(struct task_struct *task) { - int prio = task->prio; - - if (!rt_or_dl_prio(prio)) - return DEFAULT_PRIO; - - return prio; + return task->prio; } /* diff --git a/kernel/sched/core.c b/kernel/sched/core.c index df63b3db2933..355fd9ad0d35 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -8224,8 +8224,15 @@ void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task) } else { if (dl_prio(oldprio)) p->dl.pi_se = &p->dl; - if (rt_prio(oldprio)) + else if (rt_prio(oldprio)) p->rt.timeout = 0; + else if (!task_has_idle_policy(p)) { + struct load_weight lw; + + lw.weight = scale_load(sched_prio_to_weight[prio - MAX_RT_PRIO]); + lw.inv_weight = sched_prio_to_wmult[prio - MAX_RT_PRIO]; + p->sched_class->reweight_task(rq, p, &lw); + } } p->sched_class = next_class;