How task_struct.rt.time_slice is initialized?
Simon Guo
wei.guo.simon at gmail.com
Sat Jun 6 06:53:22 EDT 2015
Dear alias,
I noticed there is a time_slice variable for SCHED_RR policy in
task_struct.rt member (I am using 4.1.0 kernel):
struct sched_rt_entity {
...
unsigned int time_slice;
...
};
Per my understanding, the task_struct.rt.time_slice should be
initialized to sched_rr_timeslice or RR_TIMESLICE . Like what process 0 has done:
#define INIT_TASK(tsk) \
{
...
.rt = { \
.run_list = LIST_HEAD_INIT(tsk.rt.run_list), \
.time_slice = RR_TIMESLICE, \
},
...
}
However I didn't see somewhere in copy_process() to set time_slice
value for a new forked SCHED_RR process.
If time_slice is not initialized, time_slice will be with value 0 and
will be overflow to a big value in following "if (--p->rt.time_slice)" statement:
static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued)
{
...
/*
* RR tasks need a special form of timeslice management.
* FIFO tasks have no timeslices.
*/
if (p->policy != SCHED_RR)
return;
if (--p->rt.time_slice)
return;
p->rt.time_slice = sched_rr_timeslice;
...
}
Is it a bug? Please correct me if I am wrong.
Thanks,
Simon
More information about the Kernelnewbies
mailing list