CFS mechanism...

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,
i have one basic doubt in the CFS algorithm. 
Following is my doubts. I am using 2.6.23 as the kernel version

In CFS , when a Sleeping task wants to get inside the Running Queue ( cfs_rq ) , Then it calcluates the its own "vruntime" depend on "cfs_rq->min_vruntime" and "sysctl_sched_latency". In function "place_entity" , "vruntime" is assigned the value.
   in brief ===> 
            se.vruntime = cfs_rq->min_vruntime - sysctl_sched_latency  ( equation 1 )

  So the process which wants to get inserted in CFS QUEUE , 
         will have a KEY ==> "se->vruntime - cfs_rq->min_vruntime" ( equation 2 )
  If we take merge equation 1 and equation 2 .. then KEY is equal to "-sysctl_sched_latency".

  So when the Process will be added to RB TREE , then this new Task will always be the leftmost entry,  as its KEY is in negative value.

I thought if we add the value of "sysctl_sched_latency" in equation "1" , then it would have been right as the New task will be waiting minimum "sysctl_sched_latency" nano seconds before getting schedule ( if run queue is heavily loaded ).


Can somebody help me in understanding  why we are Subtracting "sysctl_sched_latency" instead of Adding

Help will be greatly appreciated.

below i have added the code for "place_entity" and "entity_key"
regards
Anirban Roy

static void
place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
{
u64 vruntime;

vruntime = cfs_rq->min_vruntime;

if (sched_feat(USE_TREE_AVG)) {
struct sched_entity *last = __pick_last_entity(cfs_rq);
if (last) {
vruntime += last->vruntime;
vruntime >>= 1;
}
} else if (sched_feat(APPROX_AVG) && cfs_rq->nr_running)
vruntime += __sched_vslice(cfs_rq->nr_running)/2;

if (initial && sched_feat(START_DEBIT))
vruntime += __sched_vslice(cfs_rq->nr_running + 1);

if (!initial) {
if (sched_feat(NEW_FAIR_SLEEPERS))
vruntime -= sysctl_sched_latency;

vruntime = max_t(s64, vruntime, se->vruntime);
}

se->vruntime = vruntime;


static inline s64
entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)
{
return se->vruntime - cfs_rq->min_vruntime;
}
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux