]> 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 241fc86bc61340b6a1e0f9a1d5e36f19f0798928..f86b0cb5eb298a62372d6ef87d8b3bf77fe3fac3 100644 (file)
@@ -1310,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);
 }
 
@@ -1339,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) {
@@ -1358,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);
 }
 
@@ -3660,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;