All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
To: "Peter Zijlstra (Intel)" <peterz@infradead.org>,
	Juri Lelli <juri.lelli@redhat.com>,
	Vincent Guittot <vincent.guittot@linaro.org>
Cc: Ricardo Neri <ricardo.neri@intel.com>,
	"Ravi V. Shankar" <ravi.v.shankar@intel.com>,
	Ben Segall <bsegall@google.com>,
	Daniel Bristot de Oliveira <bristot@redhat.com>,
	Dietmar Eggemann <dietmar.eggemann@arm.com>,
	Len Brown <len.brown@intel.com>, Mel Gorman <mgorman@suse.de>,
	"Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
	Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Tim Chen <tim.c.chen@linux.intel.com>,
	Valentin Schneider <vschneid@redhat.com>,
	x86@kernel.org,
	"Joel Fernandes (Google)" <joel@joelfernandes.org>,
	linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org,
	Ricardo Neri <ricardo.neri-calderon@linux.intel.com>,
	"Tim C . Chen" <tim.c.chen@intel.com>
Subject: [PATCH v2 09/22] sched/fair: Use IPC class score to select a busiest runqueue
Date: Mon, 28 Nov 2022 05:20:47 -0800	[thread overview]
Message-ID: <20221128132100.30253-10-ricardo.neri-calderon@linux.intel.com> (raw)
In-Reply-To: <20221128132100.30253-1-ricardo.neri-calderon@linux.intel.com>

For two runqueues of equal priority and equal number of running of tasks,
select the one whose current task would have the highest IPC class score
if placed on the destination CPU.

Cc: Ben Segall <bsegall@google.com>
Cc: Daniel Bristot de Oliveira <bristot@redhat.com>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: Joel Fernandes (Google) <joel@joelfernandes.org>
Cc: Len Brown <len.brown@intel.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Tim C. Chen <tim.c.chen@intel.com>
Cc: Valentin Schneider <vschneid@redhat.com>
Cc: x86@kernel.org
Cc: linux-pm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
---
Changes since v1:
 * Fixed a bug when selecting a busiest runqueue: when comparing two
   runqueues with equal nr_running, we must compute the IPCC score delta
   of both.
 * Renamed local variables to improve the layout of the code block.
   (PeterZ)
 * Used the new interface names.
---
 kernel/sched/fair.c | 54 ++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 53 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index e8b181c31842..113470bbd7a5 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -9233,6 +9233,24 @@ static bool sched_asym_ipcc_pick(struct sched_group *a,
 	return sched_asym_ipcc_prefer(a_stats, b_stats);
 }
 
+/**
+ * ipcc_score_delta - Get the IPCC score delta on a different CPU
+ * @p:		A task
+ * @alt_cpu:	A prospective CPU to place @p
+ *
+ * Returns: The IPCC score delta that @p would get if placed on @alt_cpu
+ */
+static int ipcc_score_delta(struct task_struct *p, int alt_cpu)
+{
+	unsigned long ipcc = p->ipcc;
+
+	if (!sched_ipcc_enabled())
+		return INT_MIN;
+
+	return arch_get_ipcc_score(ipcc, alt_cpu) -
+	       arch_get_ipcc_score(ipcc, task_cpu(p));
+}
+
 #else /* CONFIG_IPC_CLASSES */
 static void update_sg_lb_ipcc_stats(struct sg_lb_ipcc_stats *sgcs,
 				    struct rq *rq)
@@ -9258,6 +9276,11 @@ static bool sched_asym_ipcc_pick(struct sched_group *a,
 	return false;
 }
 
+static int ipcc_score_delta(struct task_struct *p, int alt_cpu)
+{
+	return INT_MIN;
+}
+
 #endif /* CONFIG_IPC_CLASSES */
 
 /**
@@ -10419,8 +10442,8 @@ static struct rq *find_busiest_queue(struct lb_env *env,
 {
 	struct rq *busiest = NULL, *rq;
 	unsigned long busiest_util = 0, busiest_load = 0, busiest_capacity = 1;
+	int i, busiest_ipcc_delta = INT_MIN;
 	unsigned int busiest_nr = 0;
-	int i;
 
 	for_each_cpu_and(i, sched_group_span(group), env->cpus) {
 		unsigned long capacity, load, util;
@@ -10526,8 +10549,37 @@ static struct rq *find_busiest_queue(struct lb_env *env,
 
 		case migrate_task:
 			if (busiest_nr < nr_running) {
+				struct task_struct *curr;
+
 				busiest_nr = nr_running;
 				busiest = rq;
+
+				/*
+				 * Remember the IPC score delta of busiest::curr.
+				 * We may need it to break a tie with other queues
+				 * with equal nr_running.
+				 */
+				curr = rcu_dereference(busiest->curr);
+				busiest_ipcc_delta = ipcc_score_delta(curr,
+								      env->dst_cpu);
+			/*
+			 * If rq and busiest have the same number of running
+			 * tasks, pick rq if doing so would give rq::curr a
+			 * bigger IPC boost on dst_cpu.
+			 */
+			} else if (sched_ipcc_enabled() &&
+				   busiest_nr == nr_running) {
+				struct task_struct *curr;
+				int delta;
+
+				curr = rcu_dereference(rq->curr);
+				delta = ipcc_score_delta(curr, env->dst_cpu);
+
+				if (busiest_ipcc_delta < delta) {
+					busiest_ipcc_delta = delta;
+					busiest_nr = nr_running;
+					busiest = rq;
+				}
 			}
 			break;
 
-- 
2.25.1


  parent reply	other threads:[~2022-11-28 13:14 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-28 13:20 [PATCH v2 00/22] sched: Introduce IPC classes for load balance Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 01/22] sched/task_struct: Introduce IPC classes of tasks Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 02/22] sched: Add interfaces for IPC classes Ricardo Neri
2022-12-08  8:48   ` Ionela Voinescu
2022-12-14  0:31     ` Ricardo Neri
2022-12-14 23:15       ` Ionela Voinescu
2022-12-20  0:12         ` Ricardo Neri
2022-12-14  7:36   ` Lukasz Luba
2022-12-16 21:56     ` Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 03/22] sched/core: Initialize the IPC class of a new task Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 04/22] sched/core: Add user_tick as argument to scheduler_tick() Ricardo Neri
2022-12-07 12:21   ` Dietmar Eggemann
2022-12-12 18:47     ` Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 05/22] sched/core: Update the IPC class of the current task Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 06/22] sched/fair: Collect load-balancing stats for IPC classes Ricardo Neri
2022-12-07 17:00   ` Dietmar Eggemann
2022-12-12 21:41     ` Ricardo Neri
2022-12-08  8:50   ` Ionela Voinescu
2022-12-14  0:31     ` Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 07/22] sched/fair: Compute IPC class scores for load balancing Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 08/22] sched/fair: Use IPC class to pick the busiest group Ricardo Neri
2022-11-28 13:20 ` Ricardo Neri [this message]
2022-12-08  8:51   ` [PATCH v2 09/22] sched/fair: Use IPC class score to select a busiest runqueue Ionela Voinescu
2022-12-14  0:32     ` Ricardo Neri
2022-12-14 23:16       ` Ionela Voinescu
2022-12-16 23:24         ` Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 10/22] thermal: intel: hfi: Introduce Intel Thread Director classes Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 11/22] thermal: intel: hfi: Store per-CPU IPCC scores Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 12/22] x86/cpufeatures: Add the Intel Thread Director feature definitions Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 13/22] thermal: intel: hfi: Update the IPC class of the current task Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 14/22] thermal: intel: hfi: Report the IPC class score of a CPU Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 15/22] thermal: intel: hfi: Define a default class for unclassified tasks Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 16/22] thermal: intel: hfi: Enable the Intel Thread Director Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 17/22] sched/task_struct: Add helpers for IPC classification Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 18/22] sched/core: Initialize helpers of task classification Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 19/22] thermal: intel: hfi: Implement model-specific checks for " Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 20/22] x86/cpufeatures: Add feature bit for HRESET Ricardo Neri
2022-11-28 13:20 ` [PATCH v2 21/22] x86/hreset: Configure history reset Ricardo Neri
2022-11-28 13:21 ` [PATCH v2 22/22] x86/process: Reset hardware history in context switch Ricardo Neri

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=20221128132100.30253-10-ricardo.neri-calderon@linux.intel.com \
    --to=ricardo.neri-calderon@linux.intel.com \
    --cc=bristot@redhat.com \
    --cc=bsegall@google.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=joel@joelfernandes.org \
    --cc=juri.lelli@redhat.com \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mgorman@suse.de \
    --cc=peterz@infradead.org \
    --cc=rafael.j.wysocki@intel.com \
    --cc=ravi.v.shankar@intel.com \
    --cc=ricardo.neri@intel.com \
    --cc=rostedt@goodmis.org \
    --cc=srinivas.pandruvada@linux.intel.com \
    --cc=tim.c.chen@intel.com \
    --cc=tim.c.chen@linux.intel.com \
    --cc=vincent.guittot@linaro.org \
    --cc=vschneid@redhat.com \
    --cc=x86@kernel.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.