The following is the real time run queue structure in v3.5.4
struct rt_rq {
struct rt_prio_array active;
unsigned int rt_nr_running;
#if defined CONFIG_SMP || defined CONFIG_RT_GROUP_SCHED
struct {
int curr; /* highest queued rt task prio */
#ifdef CONFIG_SMP
int next; /* next highest */
#endif
} highest_prio;
#endif
#ifdef CONFIG_SMP
unsigned long rt_nr_migratory;
unsigned long rt_nr_total;
int overloaded;
struct plist_head pushable_tasks;
#endif
int rt_throttled;
u64 rt_time;
u64 rt_runtime;
/* Nests inside the rq lock: */
raw_spinlock_t rt_runtime_lock;
#ifdef CONFIG_RT_GROUP_SCHED
unsigned long rt_nr_boosted;
struct rq *rq;
struct list_head leaf_rt_rq_list;
struct task_group *tg;
#endif
};
I have understood what does some data members stand for but I am not completely sure for the following data members:
a) rt_nr_migratory : (I think that) it is a counter to keep count of how many tasks can be pushed to other cpu’s
b) pushable_tasks is the list of tasks which can be pushed to other run queues if they do not have anything to run.
Please correct me if I am wrong for the above entries.
c) rt_throttled, rt_time, rt_runtime, rt_nr_total, rt_nr_boosted : I do not understand what is the use of this.
Also why is struct rq *rq; only required when group scheduling is there. I mean what is its significance.
This is a difficult question to answer, partly because it’s really a half-dozen complicated questions at once. So to help you understand each of these pieces, I’ve looked up when each of those fields was added. Reading the commit message and possibly the patch that introduced each field should get you much closer to understanding why they’re there.
rt_nr_migratorywas added in commit sched: add RT-balance cpu-weight.pushable_taskswas added in commit sched: create “pushable_tasks” list to limit pushing to one attempt.rt_throttledandrt_timewere added in commit sched: rt time limit.rt_runtimewas added in commit sched: rt-group: smp balancing.rt_nr_totalwas added in commit sched_rt: Fix overload bug on rt group scheduling.rt_nr_boostedwas added in commit sched: rt-group: deal with PI. (I believe “PI” here means “priority inversion”.)rqwas added in commit sched: rt group scheduling.I used
git blameto find out when each line was introduced, but it was pretty complicated in this case because the scheduler source code has gone through two major reorganizations since all this work was done. So when I usedgit blame sched.h, it told me that that the whole structure was added all at once, but the commit it named was actually when the structure was moved out ofsched.c. Then I usedgit blame <commit>~ -- sched.cto see what sched.c looked like before that change. Finally, for each commit that I thought might matter, I double-checked usinggit show <commit>.