Port ms commits: fed14d45f945042a15b09de48d7d3d58d9455fc4 eb7a59b2c888c2518ba2c9d0020343ca71aa9dee (fix for the first).
Track depth in cgroup tree, this is useful for things like find_matching_se() where you need to get to a common parent of two sched entities. Keeping the depth avoids having to calculate it on the spot, which saves a number of possible cache-misses. Signed-off-by: Peter Zijlstra <[email protected]> Link: http://lkml.kernel.org/r/1328936700.2476.17.camel@laptop Signed-off-by: Ingo Molnar <[email protected]> Signed-off-by: Kirill Tkhai <[email protected]> Reviewed-by: Vladimir Davydov <[email protected]> --- include/linux/sched.h | 1 + kernel/sched/fair.c | 34 ++++++++++++++++++++-------------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index eb1585a..e1bcabe 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1099,6 +1099,7 @@ struct sched_entity { struct cfs_rq *cfs_rq; /* rq "owned" by this entity/group: */ struct cfs_rq *my_q; + int depth; #endif /* diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 171601d..8bc8c0f 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -335,16 +335,6 @@ static inline struct sched_entity *parent_entity(struct sched_entity *se) } /* return depth at which a sched entity is present in the hierarchy */ -static inline int depth_se(struct sched_entity *se) -{ - int depth = 0; - - for_each_sched_entity(se) - depth++; - - return depth; -} - static void find_matching_se(struct sched_entity **se, struct sched_entity **pse) { @@ -358,8 +348,8 @@ find_matching_se(struct sched_entity **se, struct sched_entity **pse) */ /* First walk up until both entities are at same depth */ - se_depth = depth_se(*se); - pse_depth = depth_se(*pse); + se_depth = (*se)->depth; + pse_depth = (*pse)->depth; while (se_depth > pse_depth) { se_depth--; @@ -7819,6 +7809,13 @@ static void switched_from_fair(struct rq *rq, struct task_struct *p) */ static void switched_to_fair(struct rq *rq, struct task_struct *p) { +#ifdef CONFIG_FAIR_GROUP_SCHED + /* + * Since the real-depth could have been changed (only FAIR + * class maintain depth value), reset depth properly. + */ + p->se.depth = p->se.parent ? p->se.parent->depth + 1 : 0; +#endif if (!p->se.on_rq) return; @@ -7913,6 +7910,12 @@ static void task_move_group_fair(struct task_struct *p, int on_rq) cfs_rq->blocked_load_avg += p->se.avg.load_avg_contrib; #endif } + + /* + * Since the real-depth could have been changed (only FAIR + * class maintain depth value), reset depth properly. + */ + p->se.depth = p->se.parent ? p->se.parent->depth + 1 : 0; } void free_fair_sched_group(struct task_group *tg) @@ -8006,10 +8009,13 @@ void init_tg_cfs_entry(struct task_group *tg, struct cfs_rq *cfs_rq, if (!se) return; - if (!parent) + if (!parent) { se->cfs_rq = &rq->cfs; - else + se->depth = 0; + } else { se->cfs_rq = parent->my_q; + se->depth = parent->depth + 1; + } se->my_q = cfs_rq; update_load_set(&se->load, 0); _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
