scheduler fix
Linus,
Please pull the latest sched-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched-urgent-for-linus
# HEAD: 53d3bc773eaa7ab1cf63585e76af7ee869d5e709 Revert "sched/fair: Fix fairness issue on migration"
This is a revert to fix an interactivity problem. The proper fixes for the problems that the reverted commit exposed are now in sched/core (consisting of 3 patches), but were too risky for v4.6 and will arrive in the v4.7 merge window.
Thanks,
Ingo
------------------>
Ingo Molnar (1):
Revert "sched/fair: Fix fairness issue on migration"
kernel/sched/fair.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-)
kernel/sched/fair.c +6 -14
@@ -3188,25 +3188,17 @@ static inline void check_schedstat_required(void)static void enqueue_entity (struct cfs_rq *cfs_rq,struct sched_entity *se,int flags) { -bool renorm = !(flags &ENQUEUE_WAKEUP ) || (flags &ENQUEUE_WAKING ); -bool curr = cfs_rq->curr == se; -/* -* If we're the current task, we must renormalise before calling -* update_curr(). +* Update the normalized vruntime before updating min_vruntime +* through calling update_curr(). */ -if (renorm && curr) +if (!(flags &ENQUEUE_WAKEUP ) || (flags &ENQUEUE_WAKING )) se->vruntime += cfs_rq->min_vruntime; -update_curr (cfs_rq); -/* -* Otherwise, renormalise after, such that we're placed at the current -* moment in time, instead of some random moment in the past. +* Update run-time statistics of the 'current'. */ -if (renorm && !curr) - se->vruntime += cfs_rq->min_vruntime; - +update_curr (cfs_rq);enqueue_entity_load_avg (cfs_rq, se);account_entity_enqueue (cfs_rq, se);update_cfs_shares (cfs_rq);
@@ -3222,7 +3214,7 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)update_stats_enqueue (cfs_rq, se);check_spread (cfs_rq, se); } -if (!curr) +if (se != cfs_rq->curr)__enqueue_entity (cfs_rq, se); se->on_rq =1 ;