Messages in this thread | | | Subject | Re: [PATCH] sched_rt: Migrate equal priority tasks to available CPUs | From | Steven Rostedt <> | Date | Tue, 13 Sep 2011 09:05:46 -0400 |
| |
On Mon, 2011-09-12 at 09:28 -0500, Shawn Bohrer wrote: > Commit 43fa5460fe60dea5c610490a1d263415419c60f6 "sched: Try not to > migrate higher priority RT tasks" also introduced a change in behavior > which keeps RT tasks on the same CPU if there is an equal priority RT > task currently running even if there are empty CPUs available. This can > cause unnecessary wakeup latencies, and can prevent the scheduler from > balancing all RT tasks across the available CPUs. > > This change causes an RT task to search for a new CPU if an equal > priority RT task is already running on wakeup. Lower priority tasks > will still have to wait on higher priority tasks, but the system should > still balance out because there is always the possibility that if there > are both a high and low priority RT tasks on a given CPU that the high > priority task could wakeup while the low priority task is running and > force it to search for a better runqueue. >
Looks good, but do you have a test case that shows the issue? I like to have something that proves even the obvious before making changes to the schedule.
If not, I probably could write a test case to trigger this.
Thanks!
-- Steve
> Signed-off-by: Shawn Bohrer <sbohrer@rgmadvisors.com> > --- > kernel/sched_rt.c | 4 ++-- > 1 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c > index 10d0182..17f2319 100644 > --- a/kernel/sched_rt.c > +++ b/kernel/sched_rt.c > @@ -1038,7 +1038,7 @@ select_task_rq_rt(struct task_struct *p, int sd_flag, int flags) > */ > if (curr && unlikely(rt_task(curr)) && > (curr->rt.nr_cpus_allowed < 2 || > - curr->prio < p->prio) && > + curr->prio <= p->prio) && > (p->rt.nr_cpus_allowed > 1)) { > int target = find_lowest_rq(p); > > @@ -1569,7 +1569,7 @@ static void task_woken_rt(struct rq *rq, struct task_struct *p) > p->rt.nr_cpus_allowed > 1 && > rt_task(rq->curr) && > (rq->curr->rt.nr_cpus_allowed < 2 || > - rq->curr->prio < p->prio)) > + rq->curr->prio <= p->prio)) > push_rt_tasks(rq); > } >
| |