于 2012年08月27日 23:53, Dave Anderson 写道:
----- Original Message -----
> And based on this patch, I made a new patch to solve the problem when
> dumping rt runqueues. Currently dump_RT_prio_array() doesn't support
> rt group scheduler.
>
> In my test, I put some rt tasks into one group, just like below:
>
> mkdir /cgroup/cpu/test1
> echo 850000 > /cgroup/cpu/test1/cpu.rt_runtime_us
>
> ./rtloop1 &
> echo $! > /cgroup/cpu/test1/tasks
> ./rtloop1 &
> echo $! > /cgroup/cpu/test1/tasks
> ./rtloop1 &
> echo $! > /cgroup/cpu/test1/tasks
> ./rtloop98 &
> echo $! > /cgroup/cpu/test1/tasks
> ./rtloop45 &
> echo $! > /cgroup/cpu/test1/tasks
> ./rtloop99 &
> echo $! > /cgroup/cpu/test1/tasks
>
... [ cut ] ...
>
> After applying the attached patch, crash seems to work well:
>
> crash> runq
> CPU 0 RUNQUEUE: ffff880028216680
> CURRENT: PID: 5125 TASK: ffff88010799d540 COMMAND: "sh"
> RT PRIO_ARRAY: ffff880028216808
> [ 0] PID: 5136 TASK: ffff8801153cc040 COMMAND: "rtloop99"
> CHILD RT PRIO_ARRAY: ffff88013b050000
> [ 0] PID: 5133 TASK: ffff88010799c080 COMMAND:
"rtloop99"
> [ 1] PID: 5131 TASK: ffff880037922aa0 COMMAND:
"rtloop98"
> [ 98] PID: 5128 TASK: ffff88011bd87540 COMMAND: "rtloop1"
> PID: 5130 TASK: ffff8801396e7500 COMMAND: "rtloop1"
> PID: 5129 TASK: ffff88011bf5a080 COMMAND: "rtloop1"
> PID: 6 TASK: ffff88013d7c6080 COMMAND: "watchdog/0"
> PID: 3 TASK: ffff88013d7ba040 COMMAND: "migration/0"
> [ 1] PID: 5134 TASK: ffff8801153cd500 COMMAND: "rtloop98"
> PID: 5135 TASK: ffff8801153ccaa0 COMMAND: "rtloop98"
> CFS RB_ROOT: ffff880028216718
> [120] PID: 5109 TASK: ffff880037923500 COMMAND: "sh"
> [120] PID: 5107 TASK: ffff88006eeccaa0 COMMAND: "sh"
> [120] PID: 5123 TASK: ffff880107a4caa0 COMMAND: "sh"
>
> CPU 1 RUNQUEUE: ffff880028296680
> CURRENT: PID: 5086 TASK: ffff88006eecc040 COMMAND: "bash"
> RT PRIO_ARRAY: ffff880028296808
> [ 0] PID: 5137 TASK: ffff880107b35540 COMMAND: "rtloop99"
> PID: 10 TASK: ffff88013cc2cae0 COMMAND: "watchdog/1"
> PID: 2852 TASK: ffff88013bd5aae0 COMMAND: "rtkit-daemon"
> [ 54] CHILD RT PRIO_ARRAY: ffff880138978000
> [ 54] PID: 5132 TASK: ffff88006eecd500 COMMAND:
"rtloop45"
> CFS RB_ROOT: ffff880028296718
> [120] PID: 5115 TASK: ffff8801152b1500 COMMAND: "sh"
> [120] PID: 5113 TASK: ffff880139530080 COMMAND: "sh"
> [120] PID: 5111 TASK: ffff88011bd86080 COMMAND: "sh"
> [120] PID: 5121 TASK: ffff880115a9e080 COMMAND: "sh"
> [120] PID: 5117 TASK: ffff8801152b0040 COMMAND: "sh"
> [120] PID: 5119 TASK: ffff880115a9eae0 COMMAND: "sh"
>
> Is this kind of output for rt runqueues ok? Or do you have any
> suggestion?
Hello Zhang,
I find the output a bit confusing. When Daisuke added support for
displaying the runnable tasks that are contained within a cgroup's
task-group scheduling entity, they are simply added to the list
of runnable tasks for a particular priority value. There is no
special "CHILD"/indent to differentiate them. So I'm not sure why
it would be necessary to to do the same thing for RT tasks?
Also, I'm not clear on what is going on here -- on cpu 0, the
"CHILD RT PRIO DISPLAY" looks like it's a "child" of task 5136:
Hmm, may be confusing here...
> crash> runq
> CPU 0 RUNQUEUE: ffff880028216680
> CURRENT: PID: 5125 TASK: ffff88010799d540 COMMAND: "sh"
> RT PRIO_ARRAY: ffff880028216808
> [ 0] PID: 5136 TASK: ffff8801153cc040 COMMAND: "rtloop99"
> CHILD RT PRIO_ARRAY: ffff88013b050000
> [ 0] PID: 5133 TASK: ffff88010799c080 COMMAND:
"rtloop99"
> [ 1] PID: 5131 TASK: ffff880037922aa0 COMMAND:
"rtloop98"
> [ 98] PID: 5128 TASK: ffff88011bd87540 COMMAND: "rtloop1"
> PID: 5130 TASK: ffff8801396e7500 COMMAND: "rtloop1"
> PID: 5129 TASK: ffff88011bf5a080 COMMAND: "rtloop1"
> PID: 6 TASK: ffff88013d7c6080 COMMAND: "watchdog/0"
> PID: 3 TASK: ffff88013d7ba040 COMMAND: "migration/0"
> [ 1] PID: 5134 TASK: ffff8801153cd500 COMMAND: "rtloop98"
> PID: 5135 TASK: ffff8801153ccaa0 COMMAND: "rtloop98"
> ...
whereas on cpu 1, the "CHILD RT PRIO ARRAY" line is on the same line as
priority 54:
> CPU 1 RUNQUEUE: ffff880028296680
> CURRENT: PID: 5086 TASK: ffff88006eecc040 COMMAND: "bash"
> RT PRIO_ARRAY: ffff880028296808
> [ 0] PID: 5137 TASK: ffff880107b35540 COMMAND: "rtloop99"
> PID: 10 TASK: ffff88013cc2cae0 COMMAND: "watchdog/1"
> PID: 2852 TASK: ffff88013bd5aae0 COMMAND: "rtkit-daemon"
> [ 54] CHILD RT PRIO_ARRAY: ffff880138978000
> [ 54] PID: 5132 TASK: ffff88006eecd500 COMMAND:
"rtloop45"
> CFS RB_ROOT: ffff880028296718
What is it a "child" of? Or maybe "CHILD" the wrong terminology
here?
Now, the scheduler is not limited to schedule processes, but can also
work with larger entities. This allows for implementing group scheduling.
So for every RT PRIO_ARRAY, each linked list for each priority has
its element embedded in a structure "sched_entity". This
"sched_entity"
could represent two things: a process or a child rt runqueue.
for example, in cpu0, array[0] has four linked elements:
1. task 5136
2. a child rt rq
3. task 6
4. task 3
and the child rt rq has its own runqueue array with 5 tasks in it:
task 5133 with a priority of 0, task 5131 with a priority of 1, and the
last three tasks -- 5128, 5230, 5129 with a priority of 98.
Thanks
Zhang Yanfei