From: Peter Zijlstra <peterz@infradead.org> To: Vincent Guittot <vincent.guittot@linaro.org> Cc: mingo@kernel.org, linux-kernel@vger.kernel.org, linux@arm.linux.org.uk, linux-arm-kernel@lists.infradead.org, preeti@linux.vnet.ibm.com, Morten.Rasmussen@arm.com, efault@gmx.de, nicolas.pitre@linaro.org, linaro-kernel@lists.linaro.org, daniel.lezcano@linaro.org Subject: Re: [PATCH v2 10/11] sched: move cfs task on a CPU with higher capacity Date: Thu, 29 May 2014 11:50:24 +0200 [thread overview] Message-ID: <20140529095024.GF11074@laptop.programming.kicks-ass.net> (raw) In-Reply-To: <1400860385-14555-11-git-send-email-vincent.guittot@linaro.org> On Fri, May 23, 2014 at 05:53:04PM +0200, Vincent Guittot wrote: > If the CPU is used for handling lot of IRQs, trig a load balance to check if > it's worth moving its tasks on another CPU that has more capacity > > Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org> > --- > kernel/sched/fair.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index e8a30f9..2501e49 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -5948,6 +5948,13 @@ static bool update_sd_pick_busiest(struct lb_env *env, > if (sgs->sum_nr_running > sgs->group_capacity) > return true; > > + /* > + * The group capacity is reduced probably because of activity from other > + * sched class or interrupts which use part of the available capacity > + */ > + if ((sg->sgp->power_orig * 100) > (sgs->group_power * env->sd->imbalance_pct)) > + return true; > + > if (sgs->group_imb) > return true; > But we should already do this because the load numbers are scaled with the power/capacity figures. If one CPU gets significant less time to run fair tasks, its effective load would spike and it'd get to be selected here anyway. Or am I missing something? > @@ -7282,6 +7289,12 @@ static inline int nohz_kick_needed(struct rq *rq) > > if (nr_busy > 1) > goto need_kick_unlock; > + > + if ((rq->cfs.h_nr_running >= 1) > + && ((rq->cpu_power * sd->imbalance_pct) < > + (rq->cpu_power_orig * 100))) > + goto need_kick_unlock; > + > } > > sd = rcu_dereference(per_cpu(sd_asym, cpu)); OK, so there you're kicking the idle balancer to try and get another CPU to pull some load? That makes sense I suppose. That function is pretty horrible though; how about something like this first? --- kernel/sched/fair.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index c9617b73bcc0..47fb96e6fa83 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7215,15 +7215,16 @@ static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle) * - For SD_ASYM_PACKING, if the lower numbered cpu's in the scheduler * domain span are idle. */ -static inline int nohz_kick_needed(struct rq *rq) +static inline bool nohz_kick_needed(struct rq *rq) { unsigned long now = jiffies; struct sched_domain *sd; struct sched_group_power *sgp; int nr_busy, cpu = rq->cpu; + bool kick = false; if (unlikely(rq->idle_balance)) - return 0; + return false; /* * We may be recently in ticked or tickless idle mode. At the first @@ -7237,38 +7238,34 @@ static inline int nohz_kick_needed(struct rq *rq) * balancing. */ if (likely(!atomic_read(&nohz.nr_cpus))) - return 0; + return false; if (time_before(now, nohz.next_balance)) - return 0; + return false; if (rq->nr_running >= 2) - goto need_kick; + return true; rcu_read_lock(); sd = rcu_dereference(per_cpu(sd_busy, cpu)); - if (sd) { sgp = sd->groups->sgp; nr_busy = atomic_read(&sgp->nr_busy_cpus); - if (nr_busy > 1) - goto need_kick_unlock; + if (nr_busy > 1) { + kick = true; + goto unlock; + } } sd = rcu_dereference(per_cpu(sd_asym, cpu)); - if (sd && (cpumask_first_and(nohz.idle_cpus_mask, sched_domain_span(sd)) < cpu)) - goto need_kick_unlock; - - rcu_read_unlock(); - return 0; + kick = true; -need_kick_unlock: +unlock: rcu_read_unlock(); -need_kick: - return 1; + return kick; } #else static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle) { }
WARNING: multiple messages have this Message-ID (diff)
From: peterz@infradead.org (Peter Zijlstra) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v2 10/11] sched: move cfs task on a CPU with higher capacity Date: Thu, 29 May 2014 11:50:24 +0200 [thread overview] Message-ID: <20140529095024.GF11074@laptop.programming.kicks-ass.net> (raw) In-Reply-To: <1400860385-14555-11-git-send-email-vincent.guittot@linaro.org> On Fri, May 23, 2014 at 05:53:04PM +0200, Vincent Guittot wrote: > If the CPU is used for handling lot of IRQs, trig a load balance to check if > it's worth moving its tasks on another CPU that has more capacity > > Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org> > --- > kernel/sched/fair.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index e8a30f9..2501e49 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -5948,6 +5948,13 @@ static bool update_sd_pick_busiest(struct lb_env *env, > if (sgs->sum_nr_running > sgs->group_capacity) > return true; > > + /* > + * The group capacity is reduced probably because of activity from other > + * sched class or interrupts which use part of the available capacity > + */ > + if ((sg->sgp->power_orig * 100) > (sgs->group_power * env->sd->imbalance_pct)) > + return true; > + > if (sgs->group_imb) > return true; > But we should already do this because the load numbers are scaled with the power/capacity figures. If one CPU gets significant less time to run fair tasks, its effective load would spike and it'd get to be selected here anyway. Or am I missing something? > @@ -7282,6 +7289,12 @@ static inline int nohz_kick_needed(struct rq *rq) > > if (nr_busy > 1) > goto need_kick_unlock; > + > + if ((rq->cfs.h_nr_running >= 1) > + && ((rq->cpu_power * sd->imbalance_pct) < > + (rq->cpu_power_orig * 100))) > + goto need_kick_unlock; > + > } > > sd = rcu_dereference(per_cpu(sd_asym, cpu)); OK, so there you're kicking the idle balancer to try and get another CPU to pull some load? That makes sense I suppose. That function is pretty horrible though; how about something like this first? --- kernel/sched/fair.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index c9617b73bcc0..47fb96e6fa83 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7215,15 +7215,16 @@ static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle) * - For SD_ASYM_PACKING, if the lower numbered cpu's in the scheduler * domain span are idle. */ -static inline int nohz_kick_needed(struct rq *rq) +static inline bool nohz_kick_needed(struct rq *rq) { unsigned long now = jiffies; struct sched_domain *sd; struct sched_group_power *sgp; int nr_busy, cpu = rq->cpu; + bool kick = false; if (unlikely(rq->idle_balance)) - return 0; + return false; /* * We may be recently in ticked or tickless idle mode. At the first @@ -7237,38 +7238,34 @@ static inline int nohz_kick_needed(struct rq *rq) * balancing. */ if (likely(!atomic_read(&nohz.nr_cpus))) - return 0; + return false; if (time_before(now, nohz.next_balance)) - return 0; + return false; if (rq->nr_running >= 2) - goto need_kick; + return true; rcu_read_lock(); sd = rcu_dereference(per_cpu(sd_busy, cpu)); - if (sd) { sgp = sd->groups->sgp; nr_busy = atomic_read(&sgp->nr_busy_cpus); - if (nr_busy > 1) - goto need_kick_unlock; + if (nr_busy > 1) { + kick = true; + goto unlock; + } } sd = rcu_dereference(per_cpu(sd_asym, cpu)); - if (sd && (cpumask_first_and(nohz.idle_cpus_mask, sched_domain_span(sd)) < cpu)) - goto need_kick_unlock; - - rcu_read_unlock(); - return 0; + kick = true; -need_kick_unlock: +unlock: rcu_read_unlock(); -need_kick: - return 1; + return kick; } #else static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle) { }
next prev parent reply other threads:[~2014-05-29 9:50 UTC|newest] Thread overview: 216+ messages / expand[flat|nested] mbox.gz Atom feed top 2014-05-23 15:52 [PATCH v2 00/11] sched: consolidation of cpu_power Vincent Guittot 2014-05-23 15:52 ` Vincent Guittot 2014-05-23 15:52 ` [PATCH v2 01/11] sched: fix imbalance flag reset Vincent Guittot 2014-05-23 15:52 ` Vincent Guittot 2014-05-25 10:33 ` Preeti U Murthy 2014-05-25 10:33 ` Preeti U Murthy 2014-05-26 7:49 ` Vincent Guittot 2014-05-26 7:49 ` Vincent Guittot 2014-05-26 9:16 ` Preeti U Murthy 2014-05-26 9:16 ` Preeti U Murthy 2014-05-26 10:14 ` Vincent Guittot 2014-05-26 10:14 ` Vincent Guittot 2014-05-23 15:52 ` [PATCH v2 02/11] sched: remove a wake_affine condition Vincent Guittot 2014-05-23 15:52 ` Vincent Guittot 2014-05-27 12:48 ` Peter Zijlstra 2014-05-27 12:48 ` Peter Zijlstra 2014-05-27 15:19 ` Vincent Guittot 2014-05-27 15:19 ` Vincent Guittot 2014-05-27 15:39 ` Peter Zijlstra 2014-05-27 15:39 ` Peter Zijlstra 2014-05-27 16:14 ` Vincent Guittot 2014-05-27 16:14 ` Vincent Guittot 2014-05-28 6:49 ` Vincent Guittot 2014-05-28 6:49 ` Vincent Guittot 2014-05-28 15:09 ` Dietmar Eggemann 2014-05-28 15:09 ` Dietmar Eggemann 2014-05-28 15:25 ` Vincent Guittot 2014-05-28 15:25 ` Vincent Guittot 2014-05-27 13:43 ` Peter Zijlstra 2014-05-27 13:43 ` Peter Zijlstra 2014-05-27 13:45 ` Peter Zijlstra 2014-05-27 13:45 ` Peter Zijlstra 2014-05-27 15:20 ` Vincent Guittot 2014-05-27 15:20 ` Vincent Guittot 2014-05-23 15:52 ` [PATCH v2 03/11] sched: fix avg_load computation Vincent Guittot 2014-05-23 15:52 ` Vincent Guittot 2014-05-27 13:48 ` Peter Zijlstra 2014-05-27 13:48 ` Peter Zijlstra 2014-05-23 15:52 ` [PATCH v2 04/11] sched: Allow all archs to set the power_orig Vincent Guittot 2014-05-23 15:52 ` Vincent Guittot 2014-05-30 14:04 ` Dietmar Eggemann 2014-05-30 14:04 ` Dietmar Eggemann 2014-05-30 14:46 ` Peter Zijlstra 2014-05-30 14:46 ` Peter Zijlstra 2014-05-30 20:50 ` Vincent Guittot 2014-05-30 20:50 ` Vincent Guittot 2014-06-04 9:42 ` Dietmar Eggemann 2014-06-04 9:42 ` Dietmar Eggemann 2014-06-04 11:15 ` Vincent Guittot 2014-06-04 11:15 ` Vincent Guittot 2014-06-05 8:59 ` Dietmar Eggemann 2014-06-05 8:59 ` Dietmar Eggemann 2014-06-16 9:01 ` Vincent Guittot 2014-06-16 9:01 ` Vincent Guittot 2014-06-03 13:22 ` Morten Rasmussen 2014-06-03 13:22 ` Morten Rasmussen 2014-06-03 14:02 ` Vincent Guittot 2014-06-03 14:02 ` Vincent Guittot 2014-06-04 11:17 ` Morten Rasmussen 2014-06-04 11:17 ` Morten Rasmussen 2014-06-06 7:01 ` Vincent Guittot 2014-06-06 7:01 ` Vincent Guittot 2014-05-23 15:52 ` [PATCH v2 05/11] ARM: topology: use new cpu_power interface Vincent Guittot 2014-05-23 15:52 ` Vincent Guittot 2014-05-25 13:22 ` Preeti U Murthy 2014-05-25 13:22 ` Preeti U Murthy 2014-05-26 8:25 ` Vincent Guittot 2014-05-26 8:25 ` Vincent Guittot 2014-05-26 9:19 ` Preeti U Murthy 2014-05-26 9:19 ` Preeti U Murthy 2014-05-23 15:53 ` [PATCH v2 06/11] sched: add per rq cpu_power_orig Vincent Guittot 2014-05-23 15:53 ` Vincent Guittot 2014-05-23 15:53 ` [PATCH v2 07/11] Revert "sched: Put rq's sched_avg under CONFIG_FAIR_GROUP_SCHED" Vincent Guittot 2014-05-23 15:53 ` Vincent Guittot 2014-05-23 15:53 ` [PATCH v2 08/11] sched: get CPU's activity statistic Vincent Guittot 2014-05-23 15:53 ` Vincent Guittot 2014-05-27 17:32 ` Peter Zijlstra 2014-05-27 17:32 ` Peter Zijlstra 2014-05-28 7:01 ` Vincent Guittot 2014-05-28 7:01 ` Vincent Guittot 2014-05-28 12:10 ` Morten Rasmussen 2014-05-28 12:10 ` Morten Rasmussen 2014-05-28 13:15 ` Vincent Guittot 2014-05-28 13:15 ` Vincent Guittot 2014-05-28 15:47 ` Morten Rasmussen 2014-05-28 15:47 ` Morten Rasmussen 2014-05-28 16:39 ` Vincent Guittot 2014-05-28 16:39 ` Vincent Guittot 2014-06-03 12:03 ` Morten Rasmussen 2014-06-03 12:03 ` Morten Rasmussen 2014-06-03 15:59 ` Peter Zijlstra 2014-06-03 15:59 ` Peter Zijlstra 2014-06-03 17:41 ` Morten Rasmussen 2014-06-03 17:41 ` Morten Rasmussen 2014-06-03 15:50 ` Peter Zijlstra 2014-06-03 15:50 ` Peter Zijlstra 2014-06-03 17:20 ` Morten Rasmussen 2014-06-03 17:20 ` Morten Rasmussen 2014-06-04 7:47 ` Vincent Guittot 2014-06-04 7:47 ` Vincent Guittot 2014-06-04 8:08 ` Peter Zijlstra 2014-06-04 8:08 ` Peter Zijlstra 2014-06-04 8:55 ` Morten Rasmussen 2014-06-04 8:55 ` Morten Rasmussen 2014-06-04 9:23 ` Peter Zijlstra 2014-06-04 9:23 ` Peter Zijlstra 2014-06-04 9:35 ` Vincent Guittot 2014-06-04 9:35 ` Vincent Guittot 2014-06-04 10:25 ` Morten Rasmussen 2014-06-04 10:25 ` Morten Rasmussen 2014-06-04 9:44 ` Morten Rasmussen 2014-06-04 9:44 ` Morten Rasmussen 2014-06-04 9:32 ` Vincent Guittot 2014-06-04 9:32 ` Vincent Guittot 2014-06-04 10:00 ` Morten Rasmussen 2014-06-04 10:00 ` Morten Rasmussen 2014-06-04 10:17 ` Peter Zijlstra 2014-06-04 10:17 ` Peter Zijlstra 2014-06-04 10:36 ` Morten Rasmussen 2014-06-04 10:36 ` Morten Rasmussen 2014-06-04 10:55 ` Peter Zijlstra 2014-06-04 10:55 ` Peter Zijlstra 2014-06-04 11:07 ` Vincent Guittot 2014-06-04 11:07 ` Vincent Guittot 2014-06-04 11:23 ` Morten Rasmussen 2014-06-04 11:23 ` Morten Rasmussen 2014-06-04 11:52 ` Vincent Guittot 2014-06-04 11:52 ` Vincent Guittot 2014-06-04 13:09 ` Morten Rasmussen 2014-06-04 13:09 ` Morten Rasmussen 2014-06-04 13:23 ` Morten Rasmussen 2014-06-04 13:23 ` Morten Rasmussen 2014-05-28 15:17 ` Peter Zijlstra 2014-05-28 15:17 ` Peter Zijlstra 2014-06-03 15:40 ` Peter Zijlstra 2014-06-03 15:40 ` Peter Zijlstra 2014-06-03 17:16 ` Morten Rasmussen 2014-06-03 17:16 ` Morten Rasmussen 2014-06-03 17:37 ` Peter Zijlstra 2014-06-03 17:37 ` Peter Zijlstra 2014-06-03 17:39 ` Peter Zijlstra 2014-06-03 17:39 ` Peter Zijlstra 2014-06-03 23:11 ` Yuyang Du 2014-06-03 23:11 ` Yuyang Du 2014-05-30 9:50 ` Dietmar Eggemann 2014-05-30 9:50 ` Dietmar Eggemann 2014-05-30 19:20 ` Vincent Guittot 2014-05-30 19:20 ` Vincent Guittot 2014-06-01 11:33 ` Dietmar Eggemann 2014-06-01 11:33 ` Dietmar Eggemann 2014-06-02 14:07 ` Vincent Guittot 2014-06-02 14:07 ` Vincent Guittot 2014-05-23 15:53 ` [PATCH v2 09/11] sched: test the cpu's capacity in wake affine Vincent Guittot 2014-05-23 15:53 ` Vincent Guittot 2014-05-28 10:58 ` Peter Zijlstra 2014-05-28 10:58 ` Peter Zijlstra 2014-05-28 11:15 ` Vincent Guittot 2014-05-28 11:15 ` Vincent Guittot 2014-11-24 0:34 ` Wanpeng Li 2014-11-24 0:34 ` Wanpeng Li 2014-11-24 13:23 ` Vincent Guittot 2014-11-24 13:23 ` Vincent Guittot 2014-05-23 15:53 ` [PATCH v2 10/11] sched: move cfs task on a CPU with higher capacity Vincent Guittot 2014-05-23 15:53 ` Vincent Guittot 2014-05-29 9:50 ` Peter Zijlstra [this message] 2014-05-29 9:50 ` Peter Zijlstra 2014-05-29 19:37 ` Vincent Guittot 2014-05-29 19:37 ` Vincent Guittot 2014-05-30 6:29 ` Peter Zijlstra 2014-05-30 6:29 ` Peter Zijlstra 2014-05-30 20:05 ` Vincent Guittot 2014-05-30 20:05 ` Vincent Guittot 2014-06-02 17:06 ` Vincent Guittot 2014-06-02 17:06 ` Vincent Guittot 2014-06-03 11:15 ` Peter Zijlstra 2014-06-03 11:15 ` Peter Zijlstra 2014-06-03 12:31 ` Vincent Guittot 2014-06-03 12:31 ` Vincent Guittot 2014-05-29 14:04 ` Peter Zijlstra 2014-05-29 14:04 ` Peter Zijlstra 2014-05-29 19:44 ` Vincent Guittot 2014-05-29 19:44 ` Vincent Guittot 2014-05-30 13:26 ` Dietmar Eggemann 2014-05-30 13:26 ` Dietmar Eggemann 2014-05-30 19:24 ` Vincent Guittot 2014-05-30 19:24 ` Vincent Guittot 2014-05-30 19:45 ` Nicolas Pitre 2014-05-30 19:45 ` Nicolas Pitre 2014-05-30 20:07 ` Vincent Guittot 2014-05-30 20:07 ` Vincent Guittot 2014-05-23 15:53 ` [PATCH v2 11/11] sched: replace capacity by activity Vincent Guittot 2014-05-23 15:53 ` Vincent Guittot 2014-05-29 13:55 ` Peter Zijlstra 2014-05-29 13:55 ` Peter Zijlstra 2014-05-29 19:51 ` Vincent Guittot 2014-05-29 19:51 ` Vincent Guittot 2014-06-02 6:21 ` Preeti U Murthy 2014-06-02 6:21 ` Preeti U Murthy 2014-06-03 9:50 ` Vincent Guittot 2014-06-03 9:50 ` Vincent Guittot 2014-05-29 14:02 ` Peter Zijlstra 2014-05-29 14:02 ` Peter Zijlstra 2014-05-29 19:56 ` Vincent Guittot 2014-05-29 19:56 ` Vincent Guittot 2014-05-30 6:34 ` Peter Zijlstra 2014-05-30 6:34 ` Peter Zijlstra 2014-05-30 19:13 ` Vincent Guittot 2014-05-30 19:13 ` Vincent Guittot 2014-05-26 9:44 ` [PATCH v2 00/11] sched: consolidation of cpu_power Preeti U Murthy 2014-05-26 9:44 ` Preeti U Murthy 2014-05-26 10:04 ` Vincent Guittot 2014-05-26 10:04 ` Vincent Guittot 2014-05-26 15:54 ` Vincent Guittot 2014-05-26 15:54 ` Vincent Guittot 2014-05-27 5:47 ` Preeti U Murthy 2014-05-27 5:47 ` Preeti U Murthy
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=20140529095024.GF11074@laptop.programming.kicks-ass.net \ --to=peterz@infradead.org \ --cc=Morten.Rasmussen@arm.com \ --cc=daniel.lezcano@linaro.org \ --cc=efault@gmx.de \ --cc=linaro-kernel@lists.linaro.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux@arm.linux.org.uk \ --cc=mingo@kernel.org \ --cc=nicolas.pitre@linaro.org \ --cc=preeti@linux.vnet.ibm.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: linkBe 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.