All of lore.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Paul Turner <pjt@google.com>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, hpa@zytor.com, mingo@redhat.com,
	a.p.zijlstra@chello.nl, pjt@google.com, tglx@linutronix.de,
	mingo@elte.hu
Subject: [tip:sched/core] sched: Allow update_cfs_load() to update global load
Date: Thu, 18 Nov 2010 14:13:13 GMT	[thread overview]
Message-ID: <tip-d6b5591829bd348a5fbe1c428d28dea00621cdba@git.kernel.org> (raw)
In-Reply-To: <20101115234938.377473595@google.com>

Commit-ID:  d6b5591829bd348a5fbe1c428d28dea00621cdba
Gitweb:     http://git.kernel.org/tip/d6b5591829bd348a5fbe1c428d28dea00621cdba
Author:     Paul Turner <pjt@google.com>
AuthorDate: Mon, 15 Nov 2010 15:47:09 -0800
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Thu, 18 Nov 2010 13:27:50 +0100

sched: Allow update_cfs_load() to update global load

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>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <20101115234938.377473595@google.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 kernel/sched_fair.c |   44 +++++++++++++++++++++++++++++---------------
 1 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index e7e2f08..390ce30 100644
--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -539,7 +539,7 @@ static u64 sched_vslice(struct cfs_rq *cfs_rq, struct sched_entity *se)
 	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);
 
 /*
@@ -565,7 +565,7 @@ __update_curr(struct cfs_rq *cfs_rq, struct sched_entity *curr,
 #ifdef CONFIG_FAIR_GROUP_SCHED
 	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);
 	}
 #endif
@@ -704,7 +704,22 @@ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se)
 }
 
 #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;
@@ -731,6 +746,11 @@ static void update_cfs_load(struct cfs_rq *cfs_rq)
 		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
@@ -790,7 +810,7 @@ static void update_cfs_shares(struct cfs_rq *cfs_rq, long weight_delta)
 	reweight_entity(cfs_rq_of(se), se, shares);
 }
 #else /* CONFIG_FAIR_GROUP_SCHED */
-static inline void update_cfs_load(struct cfs_rq *cfs_rq)
+static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update)
 {
 }
 
@@ -920,7 +940,7 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
 	 * 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);
 
@@ -981,7 +1001,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
 	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);
@@ -1216,7 +1236,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
 	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);
 	}
 
@@ -1246,7 +1266,7 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags)
 	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);
 	}
 
@@ -2052,7 +2072,6 @@ static int update_shares_cpu(struct task_group *tg, int cpu)
 	struct cfs_rq *cfs_rq;
 	unsigned long flags;
 	struct rq *rq;
-	long load_avg;
 
 	if (!tg->se[cpu])
 		return 0;
@@ -2063,12 +2082,7 @@ static int update_shares_cpu(struct task_group *tg, int cpu)
 	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

  reply	other threads:[~2010-11-18 14:13 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-15 23:46 [tg_shares_up rewrite v4 00/11] reduce overhead for tg->shares distribution Paul Turner
2010-11-15 23:47 ` [tg_shares_up rewrite v4 01/11] sched: rewrite tg_shares_up Paul Turner
2010-11-18 14:10   ` [tip:sched/core] sched: Rewrite tg_shares_up) tip-bot for Peter Zijlstra
2010-11-15 23:47 ` [tg_shares_up rewrite v4 02/11] sched: on-demand (active) cfs_rq list Paul Turner
2010-11-18 14:10   ` [tip:sched/core] sched: Implement " tip-bot for Peter Zijlstra
2010-11-15 23:47 ` [tg_shares_up rewrite v4 03/11] sched: make tg_shares_up() walk on-demand Paul Turner
2010-11-18 14:10   ` [tip:sched/core] sched: Make " tip-bot for Peter Zijlstra
2010-11-15 23:47 ` [tg_shares_up rewrite v4 04/11] sched: fix load corruption from update_cfs_shares Paul Turner
2010-11-18 14:11   ` [tip:sched/core] sched: Fix load corruption from update_cfs_shares() tip-bot for Paul Turner
2010-11-15 23:47 ` [tg_shares_up rewrite v4 05/11] sched: fix update_cfs_load synchronization Paul Turner
2010-11-18 14:11   ` [tip:sched/core] sched: Fix update_cfs_load() synchronization tip-bot for Paul Turner
2010-11-15 23:47 ` [tg_shares_up rewrite v4 06/11] sched: hierarchal order on shares update list Paul Turner
2010-11-18 14:11   ` [tip:sched/core] sched: Introduce " tip-bot for Paul Turner
2010-11-15 23:47 ` [tg_shares_up rewrite v4 07/11] sched: add sysctl_sched_shares_window Paul Turner
2010-11-18 14:12   ` [tip:sched/core] sched: Add sysctl_sched_shares_window tip-bot for Paul Turner
2010-11-15 23:47 ` [tg_shares_up rewrite v4 08/11] sched: update shares on idle_balance Paul Turner
2010-11-18 14:12   ` [tip:sched/core] sched: Update " tip-bot for Paul Turner
2010-11-15 23:47 ` [tg_shares_up rewrite v4 09/11] sched: demand based update_cfs_load() Paul Turner
2010-11-18 14:12   ` [tip:sched/core] sched: Implement " tip-bot for Paul Turner
2010-11-15 23:47 ` [tg_shares_up rewrite v4 10/11] sched: allow update_cfs_load to update global load Paul Turner
2010-11-18 14:13   ` tip-bot for Paul Turner [this message]
2010-11-15 23:47 ` [tg_shares_up rewrite v4 11/11] sched: update tg->shares after cpu.shares write Paul Turner
2010-11-18 14:13   ` [tip:sched/core] sched: Update " tip-bot for Paul Turner
2010-11-16 12:31 ` [tg_shares_up rewrite v4 00/11] reduce overhead for tg->shares distribution Peter Zijlstra

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=tip-d6b5591829bd348a5fbe1c428d28dea00621cdba@git.kernel.org \
    --to=pjt@google.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    /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.