Messages in this thread |  | | | Date | Tue, 22 Apr 2008 11:51:35 -0400 (EDT) | | From | Steven Rostedt <> | | Subject | Re: [PATCH 1/2] sched: push rt tasks only if newly activated tasks have been added |
Hi Dmitry,
Did you see this behaviour or is this an analysis of the code?
On Tue, 22 Apr 2008, Dmitry Adamushko wrote:
>> consider the following 2-cpu system: cpu0 and cpu1.
>> cpu0: is idle --> in such a state, it never pulls RT tasks on its own.
>
> T0 and T1 are RT tasks
This is the important part. How did cpu0 get to "is idle --> in such a
state, it never pulls RT tasks on its own" ? And then have cpu1 have T0
and T1 running.
When ever a cpu goes to idle, it should definitely try to do a RT pull
before going idle. When a
>>> square#0:>> cpu1: T0 is running>> T1 is of the same prio as T0 (shouldn't really matter but to get the
> same result it would require altering the flow of events slightly)
>> T1's affinity allows it to be run only on cpu1.> T0 can run on both.>> try_to_wake_up() is called for T1.> |> --> select_task_rq_rt() => gives cpu1
> |
> --> task_wake_up_rt()
> |
> ---> push_rt_tasks() -> rq->rt.pushed = 1
>
> now, neither T1 (due to its affinity), nor T0 (it's running) can be
> pushed away to cpu0.
Ah, this may be what you are talking about. T0 was running, but because
T1 has its affinity set to cpu1 it wont cause a push. When T0 schedules
away to give T1 its cpu time, T0 wont push away because of the pushed
flag.
Hmm, interesting. Of course my response is "Don't use SCHED_RR! It's
evil!" ;-)
Perhaps we need logic to reset the push flag when a sched RR task is
scheduled out to give way for another SCHED_RR task. This should fix this
scenario. Unless I'm missing something else.
-- Steve
> [ btw., (1) I'd expect that this task_wake_up_rt() thing should be
> redundant, logically-wise... I'll check once more and comment later
> on.> (2) any example when (p->prio >= rq->rt.highest_prio) is not true in
> task_wake_up_rt() ?> ]>> as a result, rq->rt.pushed == 1.>> Now, post_schedule_rt() won't call push_rt_tasks().
>> T0 and T1 are both running for some time on cpu1 (possibly
> context-switching if they are both of SCHED_RR type).
>> Then they both block, _first_ T1 and then T0.>> After some interval of time, they wake up (let's say they are
> periodic) in the following order: _first_ T0 and then T1.
>> rq->rt.pushed becomes 0 and here we are back to square#0. The whole
> story repeats again.>> cpu0 is idle so it won't pull T0. Both T0 and T1 are competing for the
> same cpu. Not good.>> am I missing smth?>>> --> Best regards,> Dmitry Adamushko>
|  |