Index: linux/kernel/sched/fair.c =================================================================== --- linux.orig/kernel/sched/fair.c +++ linux/kernel/sched/fair.c @@ -2990,6 +2990,22 @@ static struct task_struct *pick_next_tas if (hrtick_enabled(rq)) hrtick_start_fair(rq, p); +#ifdef CONFIG_FAIR_GROUP_SCHED + if (!se->parent) + goto out; + cfs_rq = group_cfs_rq(se->parent); + if (cfs_rq->prev == se) + goto out; + cfs_rq->prev = se; + + while (se->parent) { + se = se->parent; + cfs_rq = group_cfs_rq(se); + cfs_rq->nr_switches++; + } +out: +#endif + return p; } Index: linux/kernel/sched/sched.h =================================================================== --- linux.orig/kernel/sched/sched.h +++ linux/kernel/sched/sched.h @@ -237,6 +237,8 @@ struct cfs_rq { struct list_head leaf_cfs_rq_list; struct task_group *tg; /* group that "owns" this runqueue */ + u64 nr_switches; + struct sched_entity *prev; #ifdef CONFIG_SMP /* * h_load = weight * f(tg) @@ -307,6 +309,9 @@ struct rt_rq { struct rq *rq; struct list_head leaf_rt_rq_list; struct task_group *tg; + + u64 rt_nr_switches; + struct sched_rt_entity *prev; #endif };