From: Paul Turner <pjt@google.com>
To: linux-kernel@vger.kernel.org
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>,
Ingo Molnar <mingo@elte.hu>,
Srivatsa Vaddagiri <vatsa@in.ibm.com>,
Chris Friesen <cfriesen@nortel.com>,
Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>,
Pierre Bourdon <pbourdon@excellency.fr>,
Paul Turner <pjt@google.com>,
Bharata B Rao <bharata@linux.vnet.ibm.com>,
Karl Rister <kmr@us.ibm.com>,
Balbir Singh <balbir@linux.vnet.ibm.com>
Subject: [tg_shares_up rewrite v2 10/11] sched: allow update_cfs_load to update global load
Date: Wed, 10 Nov 2010 19:50:15 -0800 [thread overview]
Message-ID: <20101111035051.156752259@google.com> (raw)
In-Reply-To: 20101111035005.443640006@google.com
[-- Attachment #1: sched-tg-global_update_load.patch --]
[-- Type: text/plain, Size: 4056 bytes --]
Refactor the global load updates from update_shares_cpu() so that
update_cfs_load() can update global load when it is more than ~10% out of sync.
The new global_load parameter allows us to force an update, regardless of
the error factor so that we can synchronize w/ update_shares().
Signed-off-by: Paul Turner <pjt@google.com>
---
kernel/sched_fair.c | 42 ++++++++++++++++++++++++++++--------------
1 file changed, 28 insertions(+), 14 deletions(-)
Index: kernel/sched_fair.c
===================================================================
--- kernel/sched_fair.c.orig
+++ kernel/sched_fair.c
@@ -538,7 +538,7 @@ static u64 sched_vslice(struct cfs_rq *c
return calc_delta_fair(sched_slice(cfs_rq, se), se);
}
-static void update_cfs_load(struct cfs_rq *cfs_rq);
+static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update);
static void update_cfs_shares(struct cfs_rq *cfs_rq, long weight_delta);
/*
@@ -563,7 +563,7 @@ __update_curr(struct cfs_rq *cfs_rq, str
cfs_rq->load_unacc_exec_time += delta_exec;
if (cfs_rq->load_unacc_exec_time > sysctl_sched_shares_window) {
- update_cfs_load(cfs_rq);
+ update_cfs_load(cfs_rq, 0);
update_cfs_shares(cfs_rq, 0);
}
}
@@ -701,7 +701,22 @@ account_entity_dequeue(struct cfs_rq *cf
}
#if defined CONFIG_SMP && defined CONFIG_FAIR_GROUP_SCHED
-static void update_cfs_load(struct cfs_rq *cfs_rq)
+static void update_cfs_rq_load_contribution(struct cfs_rq *cfs_rq,
+ int global_update)
+{
+ struct task_group *tg = cfs_rq->tg;
+ long load_avg;
+
+ load_avg = div64_u64(cfs_rq->load_avg, cfs_rq->load_period+1);
+ load_avg -= cfs_rq->load_contribution;
+
+ if (global_update || abs(load_avg) > cfs_rq->load_contribution / 8) {
+ atomic_add(load_avg, &tg->load_weight);
+ cfs_rq->load_contribution += load_avg;
+ }
+}
+
+static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update)
{
u64 period = sysctl_sched_shares_window;
u64 now, delta;
@@ -728,6 +743,11 @@ static void update_cfs_load(struct cfs_r
cfs_rq->load_avg += delta * load;
}
+ /* consider updating load contribution on each fold or truncate */
+ if (global_update || cfs_rq->load_period > period
+ || !cfs_rq->load_period)
+ update_cfs_rq_load_contribution(cfs_rq, global_update);
+
while (cfs_rq->load_period > period) {
/*
* Inline assembly required to prevent the compiler
@@ -917,7 +937,7 @@ enqueue_entity(struct cfs_rq *cfs_rq, st
* Update run-time statistics of the 'current'.
*/
update_curr(cfs_rq);
- update_cfs_load(cfs_rq);
+ update_cfs_load(cfs_rq, 0);
update_cfs_shares(cfs_rq, se->load.weight);
account_entity_enqueue(cfs_rq, se);
@@ -978,7 +998,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, st
if (se != cfs_rq->curr)
__dequeue_entity(cfs_rq, se);
se->on_rq = 0;
- update_cfs_load(cfs_rq);
+ update_cfs_load(cfs_rq, 0);
account_entity_dequeue(cfs_rq, se);
update_min_vruntime(cfs_rq);
update_cfs_shares(cfs_rq, 0);
@@ -1213,7 +1233,7 @@ enqueue_task_fair(struct rq *rq, struct
for_each_sched_entity(se) {
struct cfs_rq *cfs_rq = cfs_rq_of(se);
- update_cfs_load(cfs_rq);
+ update_cfs_load(cfs_rq, 0);
update_cfs_shares(cfs_rq, 0);
}
@@ -1243,7 +1263,7 @@ static void dequeue_task_fair(struct rq
for_each_sched_entity(se) {
struct cfs_rq *cfs_rq = cfs_rq_of(se);
- update_cfs_load(cfs_rq);
+ update_cfs_load(cfs_rq, 0);
update_cfs_shares(cfs_rq, 0);
}
@@ -2045,7 +2065,6 @@ static int update_shares_cpu(struct task
struct cfs_rq *cfs_rq;
unsigned long flags;
struct rq *rq;
- long load_avg;
if (!tg->se[cpu])
return 0;
@@ -2056,12 +2075,7 @@ static int update_shares_cpu(struct task
raw_spin_lock_irqsave(&rq->lock, flags);
update_rq_clock(rq);
- update_cfs_load(cfs_rq);
-
- load_avg = div64_u64(cfs_rq->load_avg, cfs_rq->load_period+1);
- load_avg -= cfs_rq->load_contribution;
- atomic_add(load_avg, &tg->load_weight);
- cfs_rq->load_contribution += load_avg;
+ update_cfs_load(cfs_rq, 1);
/*
* We need to update shares after updating tg->load_weight in
--
next prev parent reply other threads:[~2010-11-11 3:56 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-11 3:50 [tg_shares_up rewrite v2 00/11] reducing overhead for tg->shares distribution Paul Turner
2010-11-11 3:50 ` [tg_shares_up rewrite v2 01/11] sched: rewrite tg_shares_up Paul Turner
2010-11-11 3:50 ` [tg_shares_up rewrite v2 02/11] sched: on-demand (active) cfs_rq list Paul Turner
2010-11-11 3:50 ` [tg_shares_up rewrite v2 03/11] sched: make tg_shares_up() walk on-demand Paul Turner
2010-11-11 3:50 ` [tg_shares_up rewrite v2 04/11] sched: fix load corruption from update_cfs_shares Paul Turner
2010-11-11 3:50 ` [tg_shares_up rewrite v2 05/11] sched: fix update_cfs_load synchronization Paul Turner
2010-11-11 3:50 ` [tg_shares_up rewrite v2 06/11] sched: hierarchal order on shares update list Paul Turner
2010-11-11 3:50 ` [tg_shares_up rewrite v2 07/11] sched: add sysctl_sched_shares_window Paul Turner
2010-11-11 3:50 ` [tg_shares_up rewrite v2 08/11] sched: update shares on idle_balance Paul Turner
2010-11-11 3:50 ` [tg_shares_up rewrite v2 09/11] sched: demand based update_cfs_load() Paul Turner
2010-11-11 3:50 ` Paul Turner [this message]
2010-11-11 4:47 ` [tg_shares_up rewrite v2 10/11] sched: allow update_cfs_load to update global load David Miller
2010-11-11 4:50 ` David Miller
2010-11-11 11:13 ` Paul Turner
2010-11-11 12:37 ` Peter Zijlstra
2010-11-11 3:50 ` [tg_shares_up rewrite v2 11/11] sched: update tg->shares after cpu.shares write Paul Turner
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=20101111035051.156752259@google.com \
--to=pjt@google.com \
--cc=a.p.zijlstra@chello.nl \
--cc=balbir@linux.vnet.ibm.com \
--cc=bharata@linux.vnet.ibm.com \
--cc=cfriesen@nortel.com \
--cc=kmr@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=pbourdon@excellency.fr \
--cc=svaidy@linux.vnet.ibm.com \
--cc=vatsa@in.ibm.com \
/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.