Patch "sched/rt: Add a missing rescheduling point" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
sched/rt: Add a missing rescheduling point
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
sched-rt-add-a-missing-rescheduling-point.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
619bd4a71874a8fd78eb6ccf9f272c5e98bcc7b7Mon Sep 17 00:00:00 2001
From: Sebastian Andrzej Siewior <[email protected]>
Date: Tue, 24 Jan 2017 15:40:06 +0100
Subject: sched/rt: Add a missing rescheduling point
From: Sebastian Andrzej Siewior <[email protected]>
commit 619bd4a71874a8fd78eb6ccf9f272c5e98bcc7b7 upstream.
Since the change in commit:
fd7a4bed1835 ("sched, rt: Convert switched_{from, to}_rt() / prio_changed_rt() to balance callbacks")
... we don't reschedule a task under certain circumstances:
Lets say task-A, SCHED_OTHER, is running on CPU0 (and it may run only on CPU0) and holds a PI lock. This task is removed from the CPU because it used up its time slice and another SCHED_OTHER task is running. Task-B on CPU1 runs at RT priority and asks for the lock owned by task-A. This results in a priority boost for task-A. Task-B goes to sleep until the lock has been made available. Task-A is already runnable (but not active), so it receives no wake up.
The reality now is that task-A gets on the CPU once the scheduler decides to remove the current task despite the fact that a high priority task is enqueued and waiting. This may take a long time.
The desired behaviour is that CPU0 immediately reschedules after the priority boost which made task-A the task with the lowest priority.
--- kernel/sched/deadline.c | 3 +-- kernel/sched/rt.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-)
kernel/sched/deadline.c +1 -2
@@ -1729,12 +1729,11 @@ static void switched_to_dl(struct rq *rq#ifdef CONFIG_SMP if (tsk_nr_cpus_allowed (p) >1 && rq->dl.overloaded)queue_push_tasks (rq); -#else +#endif if (dl_task (rq->curr))check_preempt_curr_dl (rq, p,0 );else resched_curr (rq); -#endif } }
kernel/sched/rt.c +1 -2
@@ -2198,10 +2198,9 @@ static void switched_to_rt(struct rq *rq#ifdef CONFIG_SMP if (tsk_nr_cpus_allowed (p) >1 && rq->rt.overloaded)queue_push_tasks (rq); -#else +#endif /* CONFIG_SMP */ if (p->prio < rq->curr->prio)resched_curr (rq); -#endif /* CONFIG_SMP */ } }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/sched-rt-add-a-missing-rescheduling-point.patch