From: Jason Low <jason.low2@hp.com>
To: Preeti U Murthy <preeti@linux.vnet.ibm.com>
Cc: Morten Rasmussen <morten.rasmussen@arm.com>,
"peterz@infradead.org" <peterz@infradead.org>,
"mingo@kernel.org" <mingo@kernel.org>,
Daniel Lezcano <daniel.lezcano@linaro.org>,
"riel@redhat.com" <riel@redhat.com>,
"vincent.guittot@linaro.org" <vincent.guittot@linaro.org>,
"srikar@linux.vnet.ibm.com" <srikar@linux.vnet.ibm.com>,
"pjt@google.com" <pjt@google.com>,
"benh@kernel.crashing.org" <benh@kernel.crashing.org>,
"efault@gmx.de" <efault@gmx.de>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"iamjoonsoo.kim@lge.com" <iamjoonsoo.kim@lge.com>,
"svaidy@linux.vnet.ibm.com" <svaidy@linux.vnet.ibm.com>,
"tim.c.chen@linux.intel.com" <tim.c.chen@linux.intel.com>,
jason.low2@hp.com
Subject: Re: sched: Improve load balancing in the presence of idle CPUs
Date: Mon, 13 Apr 2015 19:59:56 -0700 [thread overview]
Message-ID: <1428980396.5848.4.camel@j-VirtualBox> (raw)
In-Reply-To: <1428965360.2605.33.camel@j-VirtualBox>
On Mon, 2015-04-13 at 15:49 -0700, Jason Low wrote:
> hmm, so taking a look at the patch again, it looks like we pass nohz
> balance even when the NOHZ_BALANCE_KICK is not set on the current CPU.
> We should separate the 2 conditions:
>
> if (!test_bit(NOHZ_BALANCE_KICK, nohz_flags(this_cpu)))
> return;
>
> if (idle != CPU_IDLE) {
> /* another CPU continue balancing */
> pass_nohz_balance(this_rq, this_cpu);
> return;
> }
Here's the example patch with the above update.
---
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index ffeaa41..9aa48f7 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -7622,6 +7622,16 @@ out:
}
#ifdef CONFIG_NO_HZ_COMMON
+static inline bool nohz_kick_needed(struct rq *rq);
+
+static inline void pass_nohz_balance(struct rq *this_rq, int this_cpu)
+{
+ clear_bit(NOHZ_BALANCE_KICK, nohz_flags(this_cpu));
+ nohz.next_balance = jiffies;
+ if (nohz_kick_needed(this_rq))
+ nohz_balancer_kick();
+}
+
/*
* In CONFIG_NO_HZ_COMMON case, the idle balance kickee will do the
* rebalancing for all the cpus for whom scheduler ticks are stopped.
@@ -7632,9 +7642,13 @@ static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle)
struct rq *rq;
int balance_cpu;
- if (idle != CPU_IDLE ||
- !test_bit(NOHZ_BALANCE_KICK, nohz_flags(this_cpu)))
- goto end;
+ if (!test_bit(NOHZ_BALANCE_KICK, nohz_flags(this_cpu)))
+ return;
+
+ if (idle != CPU_IDLE) {
+ pass_nohz_balance(this_rq, this_cpu);
+ return;
+ }
for_each_cpu(balance_cpu, nohz.idle_cpus_mask) {
if (balance_cpu == this_cpu || !idle_cpu(balance_cpu))
@@ -7645,8 +7659,10 @@ static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle)
* work being done for other cpus. Next load
* balancing owner will pick it up.
*/
- if (need_resched())
- break;
+ if (need_resched()) {
+ pass_nohz_balance(this_rq, this_cpu);
+ return;
+ }
rq = cpu_rq(balance_cpu);
@@ -7666,7 +7682,6 @@ static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle)
this_rq->next_balance = rq->next_balance;
}
nohz.next_balance = this_rq->next_balance;
-end:
clear_bit(NOHZ_BALANCE_KICK, nohz_flags(this_cpu));
}
@@ -7689,7 +7704,7 @@ static inline bool nohz_kick_needed(struct rq *rq)
int nr_busy, cpu = rq->cpu;
bool kick = false;
- if (unlikely(rq->idle_balance))
+ if (unlikely(idle_cpu(cpu)))
return false;
/*
@@ -7709,7 +7724,7 @@ static inline bool nohz_kick_needed(struct rq *rq)
if (time_before(now, nohz.next_balance))
return false;
- if (rq->nr_running >= 2)
+ if (rq->nr_running >= 2 || rq->rd->overload)
return true;
rcu_read_lock();
@@ -7759,16 +7774,14 @@ static void run_rebalance_domains(struct softirq_action *h)
enum cpu_idle_type idle = this_rq->idle_balance ?
CPU_IDLE : CPU_NOT_IDLE;
+ rebalance_domains(this_rq, idle);
+
/*
* If this cpu has a pending nohz_balance_kick, then do the
* balancing on behalf of the other idle cpus whose ticks are
- * stopped. Do nohz_idle_balance *before* rebalance_domains to
- * give the idle cpus a chance to load balance. Else we may
- * load balance only within the local sched_domain hierarchy
- * and abort nohz_idle_balance altogether if we pull some load.
+ * stopped.
*/
nohz_idle_balance(this_rq, idle);
- rebalance_domains(this_rq, idle);
}
/*
next prev parent reply other threads:[~2015-04-14 3:00 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-30 18:55 sched: Improve load balancing in the presence of idle CPUs Jason Low
2015-03-31 8:37 ` Preeti U Murthy
2015-03-31 18:54 ` Jason Low
2015-04-01 6:49 ` Preeti U Murthy
2015-04-01 17:04 ` Morten Rasmussen
2015-04-02 3:30 ` Jason Low
2015-04-02 8:49 ` Morten Rasmussen
2015-04-02 5:59 ` Jason Low
2015-04-02 8:42 ` Preeti U Murthy
2015-04-02 9:17 ` Morten Rasmussen
2015-04-02 17:22 ` Jason Low
2015-04-03 22:35 ` Tim Chen
2015-04-07 17:42 ` Jason Low
2015-04-07 19:39 ` Tim Chen
2015-04-07 20:24 ` Jason Low
2015-04-04 9:59 ` Preeti U Murthy
2015-04-07 23:28 ` Jason Low
2015-04-08 0:07 ` Jason Low
2015-04-08 11:12 ` Srikar Dronamraju
2015-04-08 21:22 ` Jason Low
2015-04-10 8:37 ` Srikar Dronamraju
2015-04-13 18:55 ` Jason Low
2015-04-13 20:54 ` Jason Low
2015-04-09 2:39 ` Jason Low
2015-04-09 7:02 ` Srikar Dronamraju
2015-04-09 22:49 ` Jason Low
2015-04-13 6:16 ` Preeti U Murthy
2015-04-13 22:49 ` Jason Low
2015-04-14 2:59 ` Jason Low [this message]
2015-04-02 2:11 ` Jason Low
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=1428980396.5848.4.camel@j-VirtualBox \
--to=jason.low2@hp.com \
--cc=benh@kernel.crashing.org \
--cc=daniel.lezcano@linaro.org \
--cc=efault@gmx.de \
--cc=iamjoonsoo.kim@lge.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=morten.rasmussen@arm.com \
--cc=peterz@infradead.org \
--cc=pjt@google.com \
--cc=preeti@linux.vnet.ibm.com \
--cc=riel@redhat.com \
--cc=srikar@linux.vnet.ibm.com \
--cc=svaidy@linux.vnet.ibm.com \
--cc=tim.c.chen@linux.intel.com \
--cc=vincent.guittot@linaro.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.