From: Yuyang Du <yuyang.du@intel.com>
To: peterz@infradead.org, mingo@kernel.org, linux-kernel@vger.kernel.org
Cc: umgwanakikbuti@gmail.com, bsegall@google.com, pjt@google.com,
morten.rasmussen@arm.com, vincent.guittot@linaro.org,
dietmar.eggemann@arm.com, matt@codeblueprint.co.uk,
Yuyang Du <yuyang.du@intel.com>
Subject: [RFC PATCH 09/11] sched: Add per CPU variable sd_socket_id to specify the CPU's socket
Date: Thu, 16 Jun 2016 09:49:33 +0800 [thread overview]
Message-ID: <1466041775-4528-10-git-send-email-yuyang.du@intel.com> (raw)
In-Reply-To: <1466041775-4528-1-git-send-email-yuyang.du@intel.com>
Add an unique ID per socket (we use the first CPU number in the
cpumask of the socket). This allows us to quickly tell if two CPUs are
in the same socket, see cpus_share_socket().
Signed-off-by: Yuyang Du <yuyang.du@intel.com>
---
include/linux/sched.h | 5 +++++
kernel/sched/core.c | 16 ++++++++++++++--
kernel/sched/sched.h | 1 +
3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 0803abd..4b2a0fa 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1158,6 +1158,7 @@ cpumask_var_t *alloc_sched_domains(unsigned int ndoms);
void free_sched_domains(cpumask_var_t doms[], unsigned int ndoms);
bool cpus_share_cache(int this_cpu, int that_cpu);
+bool cpus_share_socket(int this_cpu, int that_cpu);
typedef const struct cpumask *(*sched_domain_mask_f)(int cpu);
typedef int (*sched_domain_flags_f)(void);
@@ -1206,6 +1207,10 @@ static inline bool cpus_share_cache(int this_cpu, int that_cpu)
return true;
}
+static inline bool cpus_share_socket(int this_cpu, int that_cpu)
+{
+ return true;
+}
#endif /* !CONFIG_SMP */
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 56ac8f1..0a332ed 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1859,6 +1859,11 @@ bool cpus_share_cache(int this_cpu, int that_cpu)
{
return per_cpu(sd_llc_id, this_cpu) == per_cpu(sd_llc_id, that_cpu);
}
+
+bool cpus_share_socket(int this_cpu, int that_cpu)
+{
+ return per_cpu(sd_socket_id, this_cpu) == per_cpu(sd_socket_id, that_cpu);
+}
#endif /* CONFIG_SMP */
static void ttwu_queue(struct task_struct *p, int cpu, int wake_flags)
@@ -5875,10 +5880,15 @@ static void destroy_sched_domains(struct sched_domain *sd)
* Also keep a unique ID per domain (we use the first cpu number in
* the cpumask of the domain), this allows us to quickly tell if
* two cpus are in the same cache domain, see cpus_share_cache().
+
+ * And also keep a unique ID per socket (we use the first cpu number
+ * in the cpumask of the socket), this allows us to quickly tell if
+ * two cpus are in the same socket, see cpus_share_socket().
*/
DEFINE_PER_CPU(struct sched_domain *, sd_llc);
DEFINE_PER_CPU(int, sd_llc_size);
DEFINE_PER_CPU(int, sd_llc_id);
+DEFINE_PER_CPU(int, sd_socket_id);
DEFINE_PER_CPU(struct sched_domain_shared *, sd_llc_shared);
DEFINE_PER_CPU(struct sched_domain *, sd_numa);
DEFINE_PER_CPU(struct sched_domain *, sd_asym);
@@ -5887,8 +5897,7 @@ static void update_top_cache_domain(int cpu)
{
struct sched_domain_shared *sds = NULL;
struct sched_domain *sd;
- int id = cpu;
- int size = 1;
+ int id = cpu, size = 1, socket_id = 0;
sd = highest_flag_domain(cpu, SD_SHARE_PKG_RESOURCES);
if (sd) {
@@ -5904,6 +5913,9 @@ static void update_top_cache_domain(int cpu)
sd = lowest_flag_domain(cpu, SD_NUMA);
rcu_assign_pointer(per_cpu(sd_numa, cpu), sd);
+ if (sd)
+ socket_id = cpumask_first(sched_group_cpus(sd->groups));
+ per_cpu(sd_socket_id, cpu) = socket_id;
sd = highest_flag_domain(cpu, SD_ASYM_PACKING);
rcu_assign_pointer(per_cpu(sd_asym, cpu), sd);
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index df27200..654bc65 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -856,6 +856,7 @@ static inline struct sched_domain *lowest_flag_domain(int cpu, int flag)
DECLARE_PER_CPU(struct sched_domain *, sd_llc);
DECLARE_PER_CPU(int, sd_llc_size);
DECLARE_PER_CPU(int, sd_llc_id);
+DECLARE_PER_CPU(int, sd_socket_id);
DECLARE_PER_CPU(struct sched_domain_shared *, sd_llc_shared);
DECLARE_PER_CPU(struct sched_domain *, sd_numa);
DECLARE_PER_CPU(struct sched_domain *, sd_asym);
--
1.7.9.5
next prev parent reply other threads:[~2016-06-16 9:46 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-16 1:49 [RFC PATCH 00/11] Refactor select_task_rq_fair() Yuyang Du
2016-06-16 1:49 ` [RFC PATCH 01/11] sched: Remove unused @cpu argument from destroy_sched_domain*() Yuyang Du
2016-06-16 1:49 ` [RFC PATCH 02/11] sched: Restructure destroy_sched_domain() Yuyang Du
2016-06-16 1:49 ` [RFC PATCH 03/11] sched: Introduce struct sched_domain_shared Yuyang Du
2016-06-16 1:49 ` [RFC PATCH 04/11] sched: Replace sd_busy/nr_busy_cpus with sched_domain_shared Yuyang Du
2016-06-16 1:49 ` [RFC PATCH 05/11] sched: Rewrite select_idle_siblings() Yuyang Du
2016-06-16 1:49 ` [RFC PATCH 06/11] sched: Optimize SCHED_SMT Yuyang Du
2016-06-16 1:49 ` [RFC PATCH 07/11] sched: Clean up SD_BALANCE_WAKE flags in sched domain build-up Yuyang Du
2016-06-16 1:49 ` [RFC PATCH 08/11] sched: Remove SD_WAKE_AFFINE flag and replace it with SD_BALANCE_WAKE Yuyang Du
2016-06-23 13:04 ` Matt Fleming
2016-06-23 13:54 ` Peter Zijlstra
2016-06-23 14:06 ` Mike Galbraith
2016-06-16 1:49 ` Yuyang Du [this message]
2016-06-16 1:49 ` [RFC PATCH 10/11] sched: Add sched_llc_complete static key to specify whether the LLC covers all CPUs Yuyang Du
2016-06-16 1:49 ` [RFC PATCH 11/11] sched/fair: Refactor select_task_rq_fair() Yuyang Du
2016-06-16 1:57 ` Yuyang Du
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=1466041775-4528-10-git-send-email-yuyang.du@intel.com \
--to=yuyang.du@intel.com \
--cc=bsegall@google.com \
--cc=dietmar.eggemann@arm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=matt@codeblueprint.co.uk \
--cc=mingo@kernel.org \
--cc=morten.rasmussen@arm.com \
--cc=peterz@infradead.org \
--cc=pjt@google.com \
--cc=umgwanakikbuti@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®