mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Preeti U Murthy <preeti@linux.vnet.ibm.com>
To: alex.shi@intel.com, vincent.guittot@linaro.org,
	peterz@infradead.org, pjt@google.com, efault@gmx.de,
	rjw@rjwysocki.net, morten.rasmussen@arm.com,
	svaidy@linux.vnet.ibm.com, arjan@linux.intel.com,
	mingo@kernel.org
Cc: nicolas.pitre@linaro.org, len.brown@intel.com,
	yuyang.du@intel.com, linaro-kernel@lists.linaro.org,
	daniel.lezcano@linaro.org, corbet@lwn.net,
	catalin.marinas@arm.com, markgross@thegnar.org,
	sundar.iyer@intel.com, linux-kernel@vger.kernel.org,
	dietmar.eggemann@arm.com, Lorenzo.Pieralisi@arm.com,
	mike.turquette@linaro.org, akpm@linux-foundation.org,
	paulmck@linux.vnet.ibm.com, tglx@linutronix.de
Subject: [RFC PATCH V2 15/19] sched: pull all tasks from source grp and no balance for prefer_sibling
Date: Mon, 11 Aug 2014 17:10:43 +0530	[thread overview]
Message-ID: <20140811114033.31956.52263.stgit@preeti.in.ibm.com> (raw)
In-Reply-To: <20140811113000.31956.52857.stgit@preeti.in.ibm.com>

From: Alex Shi <alex.shi@intel.com>

In power balance, we hope some sched groups are fully empty to save
CPU power of them. So, we want to move any tasks from them.

Also in power aware scheduling, we don't want to balance 'prefer_sibling'
groups just because local group has capacity. If the local group has no tasks
at the time, that is the power balance hope so.

Signed-off-by: Alex Shi <alex.shi@intel.com>
[Added CONFIG_SCHED_POWER switch to enable this patch]
Signed-off-by: Preeti U Murthy <preeti@linux.vnet.ibm.com>
---

 kernel/sched/fair.c |   51 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 49 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index f9b2a21..fd93eaf 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6346,6 +6346,21 @@ static inline enum fbq_type fbq_classify_rq(struct rq *rq)
 }
 #endif /* CONFIG_NUMA_BALANCING */
 
+#ifdef CONFIG_SCHED_POWER
+static int get_power_policy(struct lb_env *env)
+{
+	if (env->flags & LBF_PERF_BAL)
+		return 0;
+	else
+		return 1;
+}
+#else
+static int get_power_policy(struct lb_env *env)
+{
+	return 0;
+}
+#endif /* CONFIG_SCHED_POWER */
+
 /**
  * update_sd_lb_stats - Update sched_domain's statistics for load balancing.
  * @env: The load balancing environment.
@@ -6358,6 +6373,7 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
 	struct sg_lb_stats tmp_sgs;
 	int load_idx, prefer_sibling = 0;
 	bool overload = false;
+	int powersave = 0;
 
 	if (child && child->flags & SD_PREFER_SIBLING)
 		prefer_sibling = 1;
@@ -6393,9 +6409,14 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
 		 * extra check prevents the case where you always pull from the
 		 * heaviest group when it is already under-utilized (possible
 		 * with a large weight task outweighs the tasks on the system).
+		 *
+		 * In power aware scheduling, we don't care load weight and
+		 * want not to pull tasks just because local group has capacity.
 		 */
+		powersave = get_power_policy(env);
+
 		if (prefer_sibling && sds->local &&
-		    sds->local_stat.group_has_free_capacity)
+		    sds->local_stat.group_has_free_capacity && !powersave)
 			sgs->group_capacity_factor = min(sgs->group_capacity_factor, 1U);
 
 		if (update_sd_pick_busiest(env, sds, sg, sgs)) {
@@ -6761,8 +6782,15 @@ static struct rq *find_busiest_queue(struct lb_env *env,
 		 * When comparing with imbalance, use weighted_cpuload()
 		 * which is not scaled with the cpu capacity.
 		 */
+#ifdef CONFIG_SCHED_POWER
+		if (rq->nr_running == 0 ||
+			(!(env->flags & LBF_POWER_BAL) && capacity_factor &&
+				rq->nr_running == 1 && wl > env->imbalance))
+ 			continue;
+#else
 		if (capacity_factor && rq->nr_running == 1 && wl > env->imbalance)
 			continue;
+#endif /* CONFIG_SCHED_POWER */
 
 		/*
 		 * For the load comparisons with the other cpu's, consider
@@ -6848,6 +6876,25 @@ static int should_we_balance(struct lb_env *env)
 	return balance_cpu == env->dst_cpu;
 }
 
+#ifdef CONFIG_SCHED_POWER
+static int is_busiest_eligible(struct rq *rq, struct lb_env *env)
+{
+	if (rq->nr_running > 1 ||
+		(rq->nr_running == 1 && env->flags & LBF_POWER_BAL))
+			return 1;
+	else
+		return 0;
+}
+#else
+static int is_busiest_eligible(struct rq *rq, struct lb_env *env)
+{
+	if (rq->nr_running > 1)
+		return 1;
+	else
+		return 0;
+}
+#endif /* CONFIG_SCHED_POWER */
+
 /*
  * Check this_cpu to ensure it is balanced within domain. Attempt to move
  * tasks if there is an imbalance.
@@ -6911,7 +6958,7 @@ redo:
 	schedstat_add(sd, lb_imbalance[idle], env.imbalance);
 
 	ld_moved = 0;
-	if (busiest->nr_running > 1) {
+	if (is_busiest_eligible(busiest, &env)) {
 		/*
 		 * Attempt to move tasks. If find_busiest_group has found
 		 * an imbalance but busiest->nr_running <= 1, the group is


  parent reply	other threads:[~2014-08-11 11:41 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-11 11:31 [RFC PATCH V2 00/19] Power Scheduler Design Preeti U Murthy
2014-08-11 11:32 ` [RFC PATCH V2 01/19] sched/power: Remove cpu idle state selection and cpu frequency tuning Preeti U Murthy
2014-08-18 15:39   ` Nicolas Pitre
2014-08-18 17:26     ` Preeti U Murthy
2014-08-18 17:53       ` Nicolas Pitre
2014-08-11 11:33 ` [RFC PATCH V2 02/19] sched/power: Move idle state selection into the scheduler Preeti U Murthy
2014-08-18 15:54   ` Nicolas Pitre
2014-08-18 17:19     ` Preeti U Murthy
2014-08-18 18:25       ` Nicolas Pitre
2014-08-11 11:33 ` [RFC PATCH V2 03/19] sched/idle: Enumerate idle states in scheduler topology Preeti U Murthy
2014-08-11 11:34 ` [RFC PATCH V2 04/19] sched: add sched balance policies in kernel Preeti U Murthy
2014-08-11 11:34 ` [RFC PATCH V2 05/19] sched: add sysfs interface for sched_balance_policy selection Preeti U Murthy
2014-08-11 11:35 ` [RFC PATCH V2 06/19] sched: log the cpu utilization at rq Preeti U Murthy
2014-08-11 11:35 ` [RFC PATCH V2 07/19] sched: add new sg/sd_lb_stats fields for incoming fork/exec/wake balancing Preeti U Murthy
2014-08-11 11:36 ` [RFC PATCH V2 08/19] sched: move sg/sd_lb_stats struct ahead Preeti U Murthy
2014-08-11 11:36 ` [RFC PATCH V2 09/19] sched: get rq potential maximum utilization Preeti U Murthy
2014-08-11 11:37 ` [RFC PATCH V2 10/19] sched: detect wakeup burst with rq->avg_idle Preeti U Murthy
2014-08-11 11:38 ` [RFC PATCH V2 11/19] sched: add power aware scheduling in fork/exec/wake Preeti U Murthy
2014-08-11 11:38 ` [RFC PATCH V2 12/19] sched: using avg_idle to detect bursty wakeup Preeti U Murthy
2014-08-11 11:39 ` [RFC PATCH V2 13/19] sched: packing transitory tasks in wakeup power balancing Preeti U Murthy
2014-08-11 11:39 ` [RFC PATCH V2 14/19] sched: add power/performance balance allow flag Preeti U Murthy
2014-08-11 11:40 ` Preeti U Murthy [this message]
2014-08-11 11:41 ` [RFC PATCH V2 16/19] sched: add new members of sd_lb_stats 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=20140811114033.31956.52263.stgit@preeti.in.ibm.com \
    --to=preeti@linux.vnet.ibm.com \
    --cc=Lorenzo.Pieralisi@arm.com \
    --cc=akpm@linux-foundation.org \
    --cc=alex.shi@intel.com \
    --cc=arjan@linux.intel.com \
    --cc=catalin.marinas@arm.com \
    --cc=corbet@lwn.net \
    --cc=daniel.lezcano@linaro.org \
    --cc=dietmar.eggemann@arm.com \
    --cc=efault@gmx.de \
    --cc=len.brown@intel.com \
    --cc=linaro-kernel@lists.linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=markgross@thegnar.org \
    --cc=mike.turquette@linaro.org \
    --cc=mingo@kernel.org \
    --cc=morten.rasmussen@arm.com \
    --cc=nicolas.pitre@linaro.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=pjt@google.com \
    --cc=rjw@rjwysocki.net \
    --cc=sundar.iyer@intel.com \
    --cc=svaidy@linux.vnet.ibm.com \
    --cc=tglx@linutronix.de \
    --cc=vincent.guittot@linaro.org \
    --cc=yuyang.du@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome