report a bug about sched_rt

sen wang
2009-07-24T10:57:37Z

I find something is wrong about sched_rt.

when I am debugging my system with rt_bandwidth_enabled, there is a
running realtime FIFO task in the sched_rt running queue and
the fair running queue is empty. I found the idle task will be
scheduled up when the running task still lie in the sched_rt running
queue!

this will happen when rt runqueue passed it's rt_bandwidth_enabled
runtime,then the scheduler choose the idle task instead of realtime
FIFO task.

the reason lie in: when scheduler try to pick up a realtime FIFO task,
it will check if rt_throttled is enabled,
if so, it'll return and try fair queue but it is empty, then it come
to the sched_idle class.

I don't think it reasonable, we should give the realtime FIFO task the
chance, even when rt runqueue passed it's runtime.
because it is cpu's free time.

To fix it ,and keep rt_bandwidth works as before, I think
pick_next_task_rt() is the best space,

the pick_next_task_rt should check another condiction: rq->cfs.nr_running.

So,I modify pick_next_task_rt() like this and debug it on my omap3430
zoom2 board, it works!

static struct task_struct *pick_next_task_rt(struct rq *rq)
{
struct sched_rt_entity *rt_se;
struct task_struct *p;
struct rt_rq *rt_rq;

...

if (rt_rq_throttled(rt_rq)&& rq->cfs.nr_running)
return NULL;

...
}