]> err.no Git - linux-2.6/blobdiff - kernel/sched_fair.c
rt2x00: Remove unused defines
[linux-2.6] / kernel / sched_fair.c
index b43748efaa7f2246c22df70fd976599bdddb3fa7..08ae848b71d4643429f67ef312a7bfd78a32aa0a 100644 (file)
@@ -362,29 +362,47 @@ static u64 __sched_period(unsigned long nr_running)
  */
 static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se)
 {
-       return calc_delta_mine(__sched_period(cfs_rq->nr_running),
-                              se->load.weight, &cfs_rq->load);
+       u64 slice = __sched_period(cfs_rq->nr_running);
+
+       for_each_sched_entity(se) {
+               cfs_rq = cfs_rq_of(se);
+
+               slice *= se->load.weight;
+               do_div(slice, cfs_rq->load.weight);
+       }
+
+
+       return slice;
 }
 
 /*
- * We calculate the vruntime slice.
+ * We calculate the vruntime slice of a to be inserted task
  *
  * vs = s/w = p/rw
  */
-static u64 __sched_vslice(unsigned long rq_weight, unsigned long nr_running)
+static u64 sched_vslice_add(struct cfs_rq *cfs_rq, struct sched_entity *se)
 {
-       u64 vslice = __sched_period(nr_running);
+       unsigned long nr_running = cfs_rq->nr_running;
+       unsigned long weight;
+       u64 vslice;
 
-       vslice *= NICE_0_LOAD;
-       do_div(vslice, rq_weight);
+       if (!se->on_rq)
+               nr_running++;
 
-       return vslice;
-}
+       vslice = __sched_period(nr_running);
 
-static u64 sched_vslice_add(struct cfs_rq *cfs_rq, struct sched_entity *se)
-{
-       return __sched_vslice(cfs_rq->load.weight + se->load.weight,
-                       cfs_rq->nr_running + 1);
+       for_each_sched_entity(se) {
+               cfs_rq = cfs_rq_of(se);
+
+               weight = cfs_rq->load.weight;
+               if (!se->on_rq)
+                       weight += se->load.weight;
+
+               vslice *= NICE_0_LOAD;
+               do_div(vslice, weight);
+       }
+
+       return vslice;
 }
 
 /*
@@ -498,6 +516,7 @@ account_entity_enqueue(struct cfs_rq *cfs_rq, struct sched_entity *se)
        update_load_add(&cfs_rq->load, se->load.weight);
        cfs_rq->nr_running++;
        se->on_rq = 1;
+       list_add(&se->group_node, &cfs_rq->tasks);
 }
 
 static void
@@ -506,6 +525,7 @@ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se)
        update_load_sub(&cfs_rq->load, se->load.weight);
        cfs_rq->nr_running--;
        se->on_rq = 0;
+       list_del_init(&se->group_node);
 }
 
 static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se)
@@ -589,13 +609,8 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
 
        if (!initial) {
                /* sleeps upto a single latency don't count. */
-               if (sched_feat(NEW_FAIR_SLEEPERS)) {
-                       if (sched_feat(NORMALIZED_SLEEPER))
-                               vruntime -= calc_delta_fair(sysctl_sched_latency,
-                                               &cfs_rq->load);
-                       else
-                               vruntime -= sysctl_sched_latency;
-               }
+               if (sched_feat(NEW_FAIR_SLEEPERS))
+                       vruntime -= sysctl_sched_latency;
 
                /* ensure we never gain time by being placed backwards. */
                vruntime = max_vruntime(se->vruntime, vruntime);
@@ -611,6 +626,7 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int wakeup)
         * Update run-time statistics of the 'current'.
         */
        update_curr(cfs_rq);
+       account_entity_enqueue(cfs_rq, se);
 
        if (wakeup) {
                place_entity(cfs_rq, se, 0);
@@ -621,7 +637,6 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int wakeup)
        check_spread(cfs_rq, se);
        if (se != cfs_rq->curr)
                __enqueue_entity(cfs_rq, se);
-       account_entity_enqueue(cfs_rq, se);
 }
 
 static void update_avg(u64 *avg, u64 sample)
@@ -770,8 +785,10 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued)
         * queued ticks are scheduled to match the slice, so don't bother
         * validating it and just reschedule.
         */
-       if (queued)
-               return resched_task(rq_of(cfs_rq)->curr);
+       if (queued) {
+               resched_task(rq_of(cfs_rq)->curr);
+               return;
+       }
        /*
         * don't let the period tick interfere with the hrtick preemption
         */
@@ -886,7 +903,7 @@ static void yield_task_fair(struct rq *rq)
                return;
 
        if (likely(!sysctl_sched_compat_yield) && curr->policy != SCHED_BATCH) {
-               __update_rq_clock(rq);
+               update_rq_clock(rq);
                /*
                 * Update run-time statistics of the 'current'.
                 */
@@ -936,7 +953,7 @@ static int wake_idle(int cpu, struct task_struct *p)
         * sibling runqueue info. This will avoid the checks and cache miss
         * penalities associated with that.
         */
-       if (idle_cpu(cpu) || cpu_rq(cpu)->nr_running > 1)
+       if (idle_cpu(cpu) || cpu_rq(cpu)->cfs.nr_running > 1)
                return cpu;
 
        for_each_domain(cpu, sd) {
@@ -979,16 +996,27 @@ wake_affine(struct rq *rq, struct sched_domain *this_sd, struct rq *this_rq,
        struct task_struct *curr = this_rq->curr;
        unsigned long tl = this_load;
        unsigned long tl_per_task;
+       int balanced;
 
-       if (!(this_sd->flags & SD_WAKE_AFFINE))
+       if (!(this_sd->flags & SD_WAKE_AFFINE) || !sched_feat(AFFINE_WAKEUPS))
                return 0;
 
+       /*
+        * If sync wakeup then subtract the (maximum possible)
+        * effect of the currently running task from the load
+        * of the current CPU:
+        */
+       if (sync)
+               tl -= current->se.load.weight;
+
+       balanced = 100*(tl + p->se.load.weight) <= imbalance*load;
+
        /*
         * If the currently running task will sleep within
         * a reasonable amount of time then attract this newly
         * woken task:
         */
-       if (sync && curr->sched_class == &fair_sched_class) {
+       if (sync && balanced && curr->sched_class == &fair_sched_class) {
                if (curr->se.avg_overlap < sysctl_sched_migration_cost &&
                                p->se.avg_overlap < sysctl_sched_migration_cost)
                        return 1;
@@ -997,16 +1025,8 @@ wake_affine(struct rq *rq, struct sched_domain *this_sd, struct rq *this_rq,
        schedstat_inc(p, se.nr_wakeups_affine_attempts);
        tl_per_task = cpu_avg_load_per_task(this_cpu);
 
-       /*
-        * If sync wakeup then subtract the (maximum possible)
-        * effect of the currently running task from the load
-        * of the current CPU:
-        */
-       if (sync)
-               tl -= current->se.load.weight;
-
        if ((tl <= load && tl + target_load(prev_cpu, idx) <= tl_per_task) ||
-                       100*(tl + p->se.load.weight) <= imbalance*load) {
+                       balanced) {
                /*
                 * This domain has SD_WAKE_AFFINE and
                 * p is cache cold in this domain, and
@@ -1250,21 +1270,24 @@ static void put_prev_task_fair(struct rq *rq, struct task_struct *prev)
  * the current task:
  */
 static struct task_struct *
-__load_balance_iterator(struct cfs_rq *cfs_rq, struct rb_node *curr)
+__load_balance_iterator(struct cfs_rq *cfs_rq, struct list_head *next)
 {
        struct task_struct *p = NULL;
        struct sched_entity *se;
 
-       if (!curr)
+       if (next == &cfs_rq->tasks)
                return NULL;
 
        /* Skip over entities that are not tasks */
        do {
-               se = rb_entry(curr, struct sched_entity, run_node);
-               curr = rb_next(curr);
-       } while (curr && !entity_is_task(se));
+               se = list_entry(next, struct sched_entity, group_node);
+               next = next->next;
+       } while (next != &cfs_rq->tasks && !entity_is_task(se));
+
+       if (next == &cfs_rq->tasks)
+               return NULL;
 
-       cfs_rq->rb_load_balance_curr = curr;
+       cfs_rq->balance_iterator = next;
 
        if (entity_is_task(se))
                p = task_of(se);
@@ -1276,14 +1299,14 @@ static struct task_struct *load_balance_start_fair(void *arg)
 {
        struct cfs_rq *cfs_rq = arg;
 
-       return __load_balance_iterator(cfs_rq, first_fair(cfs_rq));
+       return __load_balance_iterator(cfs_rq, cfs_rq->tasks.next);
 }
 
 static struct task_struct *load_balance_next_fair(void *arg)
 {
        struct cfs_rq *cfs_rq = arg;
 
-       return __load_balance_iterator(cfs_rq, cfs_rq->rb_load_balance_curr);
+       return __load_balance_iterator(cfs_rq, cfs_rq->balance_iterator);
 }
 
 #ifdef CONFIG_FAIR_GROUP_SCHED