scheduler fix
Linus,
Please pull the latest sched-fixes-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git sched-fixes-for-linus
Thanks,
Ingo
------------------>
Yong Zhang (1):
sched: Fix poor interactivity on UP systems due to group scheduler nice tune bug
kernel/sched_fair.c | 78 ++++++++++++++++++++++++++++++++++---------------- 1 files changed, 53 insertions(+), 25 deletions(-)
kernel/sched_fair.c +53 -25
@@ -699,7 +699,8 @@ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se) cfs_rq->nr_running--; } -#if definedCONFIG_SMP && definedCONFIG_FAIR_GROUP_SCHED +#ifdef CONFIG_FAIR_GROUP_SCHED +# ifdef CONFIG_SMP static void update_cfs_rq_load_contribution(struct cfs_rq *cfs_rq, int global_update) {
@@ -762,6 +763,51 @@ static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update)list_del_leaf_cfs_rq (cfs_rq); } +static long calc_cfs_shares (struct cfs_rq *cfs_rq,struct task_group *tg, +long weight_delta) +{ +long load_weight, load, shares; + + load = cfs_rq->load.weight + weight_delta; + + load_weight =atomic_read (&tg->load_weight); + load_weight -= cfs_rq->load_contribution; + load_weight += load; + + shares = (tg->shares * load); +if (load_weight) + shares /= load_weight; + +if (shares <MIN_SHARES ) + shares =MIN_SHARES ; +if (shares > tg->shares) + shares = tg->shares; + +return shares; +} + +static void update_entity_shares_tick (struct cfs_rq *cfs_rq) +{ +if (cfs_rq->load_unacc_exec_time > sysctl_sched_shares_window) { +update_cfs_load (cfs_rq,0 ); +update_cfs_shares (cfs_rq,0 ); + } +} +# else /* CONFIG_SMP */ +static void update_cfs_load (struct cfs_rq *cfs_rq,int global_update) +{ +} + +static inline long calc_cfs_shares (struct cfs_rq *cfs_rq,struct task_group *tg, +long weight_delta) +{ +return tg->shares; +} + +static inline void update_entity_shares_tick (struct cfs_rq *cfs_rq) +{ +} +# endif /* CONFIG_SMP */ static void reweight_entity (struct cfs_rq *cfs_rq,struct sched_entity *se,unsigned long weight) {
@@ -782,7 +828,7 @@ static void update_cfs_shares(struct cfs_rq *cfs_rq, long weight_delta) {struct task_group *tg;struct sched_entity *se; -long load_weight, load, shares; +long shares;if (!cfs_rq)return ;
@@ -791,32 +837,14 @@ static void update_cfs_shares(struct cfs_rq *cfs_rq, long weight_delta) se = tg->se[cpu_of (rq_of (cfs_rq))];if (!se)return ; - - load = cfs_rq->load.weight + weight_delta; - - load_weight =atomic_read (&tg->load_weight); - load_weight -= cfs_rq->load_contribution; - load_weight += load; - - shares = (tg->shares * load); -if (load_weight) - shares /= load_weight; - -if (shares <MIN_SHARES ) - shares =MIN_SHARES ; -if (shares > tg->shares) - shares = tg->shares; +#ifndef CONFIG_SMP +if (likely (se->load.weight == tg->shares)) +return ; +#endif + shares =calc_cfs_shares (cfs_rq, tg, weight_delta); reweight_entity(cfs_rq_of(se), se, shares); } - -static void update_entity_shares_tick (struct cfs_rq *cfs_rq) -{ -if (cfs_rq->load_unacc_exec_time > sysctl_sched_shares_window) { -update_cfs_load (cfs_rq,0 ); -update_cfs_shares (cfs_rq,0 ); - } -}#else /* CONFIG_FAIR_GROUP_SCHED */ static void update_cfs_load (struct cfs_rq *cfs_rq,int global_update) {