Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Understanding the use of data members in rt_rq(real time runqueue) kernel

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.

like image 715
Aman Deep Gautam Avatar asked Oct 26 '12 04:10

Aman Deep Gautam


1 Answers

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_migratory was added in commit sched: add RT-balance cpu-weight.

pushable_tasks was added in commit sched: create "pushable_tasks" list to limit pushing to one attempt.

rt_throttled and rt_time were added in commit sched: rt time limit.

rt_runtime was added in commit sched: rt-group: smp balancing.

rt_nr_total was added in commit sched_rt: Fix overload bug on rt group scheduling.

rt_nr_boosted was added in commit sched: rt-group: deal with PI. (I believe "PI" here means "priority inversion".)

rq was added in commit sched: rt group scheduling.


I used git blame to 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 used git 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 of sched.c. Then I used git blame <commit>~ -- sched.c to see what sched.c looked like before that change. Finally, for each commit that I thought might matter, I double-checked using git show <commit>.

like image 146
Jamey Sharp Avatar answered Sep 18 '22 06:09

Jamey Sharp