]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - kernel/sched_fair.c
sched: Implement hierarchical task accounting for SCHED_OTHER
[karo-tx-linux.git] / kernel / sched_fair.c
index bc8ee999381437515c7664c5e4b7fddb00656841..f86b0cb5eb298a62372d6ef87d8b3bf77fe3fac3 100644 (file)
@@ -1095,9 +1095,6 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
         * narrow margin doesn't have to wait for a full slice.
         * This also mitigates buddy induced latencies under load.
         */
-       if (!sched_feat(WAKEUP_PREEMPT))
-               return;
-
        if (delta_exec < sysctl_sched_min_granularity)
                return;
 
@@ -1233,7 +1230,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued)
                return;
 #endif
 
-       if (cfs_rq->nr_running > 1 || !sched_feat(WAKEUP_PREEMPT))
+       if (cfs_rq->nr_running > 1)
                check_preempt_tick(cfs_rq, curr);
 }
 
@@ -1313,16 +1310,19 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
                        break;
                cfs_rq = cfs_rq_of(se);
                enqueue_entity(cfs_rq, se, flags);
+               cfs_rq->h_nr_running++;
                flags = ENQUEUE_WAKEUP;
        }
 
        for_each_sched_entity(se) {
                cfs_rq = cfs_rq_of(se);
+               cfs_rq->h_nr_running++;
 
                update_cfs_load(cfs_rq, 0);
                update_cfs_shares(cfs_rq);
        }
 
+       inc_nr_running(rq);
        hrtick_update(rq);
 }
 
@@ -1342,6 +1342,7 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags)
        for_each_sched_entity(se) {
                cfs_rq = cfs_rq_of(se);
                dequeue_entity(cfs_rq, se, flags);
+               cfs_rq->h_nr_running--;
 
                /* Don't dequeue parent if it has other entities besides us */
                if (cfs_rq->load.weight) {
@@ -1361,11 +1362,13 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags)
 
        for_each_sched_entity(se) {
                cfs_rq = cfs_rq_of(se);
+               cfs_rq->h_nr_running--;
 
                update_cfs_load(cfs_rq, 0);
                update_cfs_shares(cfs_rq);
        }
 
+       dec_nr_running(rq);
        hrtick_update(rq);
 }
 
@@ -1899,10 +1902,6 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_
        if (unlikely(p->policy != SCHED_NORMAL))
                return;
 
-
-       if (!sched_feat(WAKEUP_PREEMPT))
-               return;
-
        find_matching_se(&se, &pse);
        update_curr(cfs_rq_of(se));
        BUG_ON(!pse);
@@ -3667,7 +3666,7 @@ static inline struct sched_domain *lowest_flag_domain(int cpu, int flag)
        struct sched_domain *sd;
 
        for_each_domain(cpu, sd)
-               if (sd && (sd->flags & flag))
+               if (sd->flags & flag)
                        break;
 
        return sd;