From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: miaox@cn.fujitsu.com
Cc: Ingo Molnar <mingo@elte.hu>, Linux-Kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] sched: fix unfairness when upgrade weight
Date: Wed, 25 Feb 2009 09:20:53 +0100 [thread overview]
Message-ID: <1235550053.4645.3035.camel@laptop> (raw)
In-Reply-To: <49A4F401.30503@cn.fujitsu.com>
On Wed, 2009-02-25 at 15:32 +0800, Miao Xie wrote:
> This patch fixes this bug by tuning the vruntime of weight-upgraded
> sched entities, just like waking up a task. the new vruntime will be
> cfs_rq->min_vruntime + sched_vslice();
I really don't like that.
Better would be to scale with min_vruntime, which would at least
approximate the lag somewhat.
Best is to compute the actual lag, but that might just not be worth the
extra overhead.
http://programming.kicks-ass.net/kernel-patches/sched-avg_vruntime/
> ---
> kernel/sched.c | 16 +++++++++-------
> kernel/sched_fair.c | 9 +++++++++
> 2 files changed, 18 insertions(+), 7 deletions(-)
>
> diff --git a/kernel/sched.c b/kernel/sched.c
> index 410eec4..26e6d33 100644
> --- a/kernel/sched.c
> +++ b/kernel/sched.c
> @@ -5096,12 +5096,8 @@ void set_user_nice(struct task_struct *p, long nice)
>
> if (on_rq) {
> enqueue_task(rq, p, 0);
> - /*
> - * If the task increased its priority or is running and
> - * lowered its priority, then reschedule its CPU:
> - */
> - if (delta < 0 || (delta > 0 && task_running(rq, p)))
> - resched_task(rq->curr);
> + p->sched_class->prio_changed(rq, p, old_prio,
> + task_running(rq, p));
> }
> out_unlock:
> task_rq_unlock(rq, &flags);
> @@ -8929,16 +8925,22 @@ static void __set_se_shares(struct sched_entity *se, unsigned long shares)
> {
> struct cfs_rq *cfs_rq = se->cfs_rq;
> int on_rq;
> + unsigned long old_weight;
>
> on_rq = se->on_rq;
> if (on_rq)
> dequeue_entity(cfs_rq, se, 0);
>
> + old_weight = se->load.weight;
> se->load.weight = shares;
> se->load.inv_weight = 0;
>
> - if (on_rq)
> + if (on_rq) {
> + if (se->load.weight > old_weight)
> + se->vruntime = cfs_rq->min_vruntime
> + + sched_vslice(cfs_rq, se);
> enqueue_entity(cfs_rq, se, 0);
> + }
> }
>
> static void set_se_shares(struct sched_entity *se, unsigned long shares)
> diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
> index 0566f2a..34d4d11 100644
> --- a/kernel/sched_fair.c
> +++ b/kernel/sched_fair.c
> @@ -1690,6 +1690,15 @@ static void task_new_fair(struct rq *rq, struct task_struct *p)
> static void prio_changed_fair(struct rq *rq, struct task_struct *p,
> int oldprio, int running)
> {
> + struct cfs_rq *cfs_rq = task_cfs_rq(p);
> + struct sched_entity *se = &p->se;
> + int on_rq = se->on_rq;
> +
> + if (p->prio < oldprio && on_rq) {
> + dequeue_entity(cfs_rq, se, 0);
> + se->vruntime = cfs_rq->min_vruntime + sched_vslice(cfs_rq, se);
> + enqueue_entity(cfs_rq, se, 0);
> + }
we very likely just enqueued the thing, and now we dequeue/enqueue
again.. not very nice.
> /*
> * Reschedule if we are currently running on this runqueue and
> * our priority decreased, or if we are not currently running on
next prev parent reply other threads:[~2009-02-25 8:21 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-25 7:32 [PATCH] sched: fix unfairness when upgrade weight Miao Xie
2009-02-25 8:20 ` Peter Zijlstra [this message]
2009-02-25 11:13 ` Ingo Molnar
-- strict thread matches above, loose matches on Subject: below --
2008-06-30 6:27 Lai Jiangshan
2008-07-02 21:49 ` Peter Zijlstra
2008-07-03 11:30 ` jha
2008-07-04 2:39 ` Lai Jiangshan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1235550053.4645.3035.camel@laptop \
--to=a.p.zijlstra@chello.nl \
--cc=linux-kernel@vger.kernel.org \
--cc=miaox@cn.fujitsu.com \
--cc=mingo@elte.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.