From: Yong Zhang <yong.zhang0@gmail.com>
To: Pekka Enberg <penberg@kernel.org>
Cc: linux-kernel@vger.kernel.org, mfwitten@gmail.com,
christian@nerdbynature.de, a.p.zijlstra@chello.nl,
Ingo Molnar <mingo@elte.hu>,
Peter Zijlstra <peterz@infradead.org>,
Mike Galbraith <efault@gmx.de>
Subject: [PATCH V3] sched: fix autogroup nice tune on UP
Date: Mon, 24 Jan 2011 15:33:52 +0800 [thread overview]
Message-ID: <20110124073352.GA24186@windriver.com> (raw)
In-Reply-To: <AANLkTikLnOXOAeBgMQCcOqgNP1WrVf9QeFEkgthTbU2N@mail.gmail.com>
On Mon, Jan 24, 2011 at 08:18:11AM +0200, Pekka Enberg wrote:
> I proposed extracting the shares calculation logic in
> update_cfs_shares() to reduce code duplication for the SMP and UP
> patch. So something like this:
Thanks for your example.
So something like this?
---
From: Yong Zhang <yong.zhang0@gmail.com>
Subject: [PATCH V3] sched: fix autogroup nice tune on UP
When on UP with FAIR_GROUP_SCHED enabled, tune shares
only affect tg->shares, but is not reflected on
tg->se->load, the reason is update_cfs_shares()
do nothing on UP.
So introduce update_cfs_shares() for UP && FAIR_GROUP_SCHED.
This issue is found when enable autogroup, but also
exists on cgroup.cpu on UP.
Signed-off-by: Yong Zhang <yong.zhang0@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
---
Changelog from V2:
Move share caculation to calc_cfs_shares(), thus save
some duplicated code for update_cfs_shares().
Idea from Pekka Enberg.
kernel/sched_fair.c | 78 ++++++++++++++++++++++++++++++++++----------------
1 files changed, 53 insertions(+), 25 deletions(-)
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index 77e9166..3547699 100644
--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -699,7 +699,8 @@ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se)
cfs_rq->nr_running--;
}
-#if defined CONFIG_SMP && defined CONFIG_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)
{
--
1.7.0.4
next prev parent reply other threads:[~2011-01-24 7:35 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-21 18:20 'autogroup' sched code KILLING responsiveness Michael Witten
2011-01-21 22:27 ` Mike Galbraith
2011-01-21 22:39 ` Michael Witten
2011-01-22 3:22 ` Mike Galbraith
2011-01-22 21:23 ` Michael Witten
2011-01-23 3:32 ` Michael Witten
2011-01-23 5:42 ` Mike Galbraith
2011-01-23 10:50 ` Christian Kujau
2011-01-23 11:19 ` Christian Kujau
2011-01-23 14:54 ` Yong Zhang
2011-01-23 15:03 ` [PATCH] sched: fix autogroup nice tune on UP Yong Zhang
2011-01-23 15:16 ` Pekka Enberg
2011-01-24 3:17 ` Yong Zhang
2011-01-24 5:40 ` [PATCH V2] " Yong Zhang
2011-01-24 5:54 ` Pekka Enberg
2011-01-24 6:11 ` Yong Zhang
2011-01-24 6:18 ` Pekka Enberg
2011-01-24 7:33 ` Yong Zhang [this message]
2011-01-24 8:01 ` [PATCH V3] " Pekka Enberg
2011-01-24 9:00 ` Mike Galbraith
2011-01-24 10:51 ` [tip:sched/urgent] sched: Fix poor interactivity on UP systems due to group scheduler nice tune bug tip-bot for Yong Zhang
2011-01-23 15:15 ` 'autogroup' sched code KILLING responsiveness Ingo Molnar
2011-01-23 15:53 ` Michael Witten
2011-01-23 18:52 ` Andreas Mohr
2011-01-23 23:57 ` Christian Kujau
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=20110124073352.GA24186@windriver.com \
--to=yong.zhang0@gmail.com \
--cc=a.p.zijlstra@chello.nl \
--cc=christian@nerdbynature.de \
--cc=efault@gmx.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mfwitten@gmail.com \
--cc=mingo@elte.hu \
--cc=penberg@kernel.org \
--cc=peterz@infradead.org \
/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.