|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 2/3] xen/sched: Link CPU topology to scheduler
Make CPU topology information available to the Xen scheduler.
Additionally, ensure that this topology information is displayed
when executing the 'xl info -n' command.
Signed-off-by: Hirokazu Takahashi <taka@xxxxxxxxxxxxx>
---
xen/arch/arm/include/asm/processor.h | 4 ---
xen/arch/arm/smpboot.c | 10 ++++--
xen/common/device-tree/cpu-topology.c | 51 +++++++++++++++++++++++++++
xen/common/sched/credit2.c | 3 ++
xen/common/sysctl.c | 1 +
xen/include/xen/cpu-topology.h | 10 ++++++
6 files changed, 72 insertions(+), 7 deletions(-)
diff --git a/xen/arch/arm/include/asm/processor.h
b/xen/arch/arm/include/asm/processor.h
index a3753c317f..41fa73cfc4 100644
--- a/xen/arch/arm/include/asm/processor.h
+++ b/xen/arch/arm/include/asm/processor.h
@@ -613,10 +613,6 @@ void show_stack(const struct cpu_user_regs *regs);
#define cpu_relax() barrier() /* Could yield? */
-/* All a bit UP for the moment */
-#define cpu_to_core(_cpu) (0)
-#define cpu_to_socket(_cpu) (0)
-
struct vcpu;
void vcpu_regs_hyp_to_user(const struct vcpu *vcpu,
struct vcpu_guest_core_regs *regs);
diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c
index c071f1494f..b25d98c109 100644
--- a/xen/arch/arm/smpboot.c
+++ b/xen/arch/arm/smpboot.c
@@ -91,13 +91,17 @@ static int setup_cpu_sibling_map(int cpu)
!zalloc_cpumask_var(&per_cpu(cpu_core_mask, cpu)) )
return -ENOMEM;
+#ifdef CONFIG_DT_CPU_TOPOLOGY
+ cpumask_copy(per_cpu(cpu_sibling_mask, cpu),
&cpu_topology[cpu].thread_sibling);
+ cpumask_copy(per_cpu(cpu_core_mask, cpu), &cpu_topology[cpu].core_sibling);
+#else /* CONFIG_DT_CPU_TOPOLOGY */
/*
- * Currently we assume there is no multithread and NUMA, so
- * a CPU is a sibling with itself, and the all possible CPUs
- * are supposed to belong to the same socket (NUMA node).
+ * If CONFIG_DT_CPU_TOPOLOGY is disabled, it is assumed that
+ * all CPUs reside in the same socket and that SMT is not used.
*/
cpumask_set_cpu(cpu, per_cpu(cpu_sibling_mask, cpu));
cpumask_copy(per_cpu(cpu_core_mask, cpu), &cpu_possible_map);
+#endif /* CONFIG_DT_CPU_TOPOLOGY */
return 0;
}
diff --git a/xen/common/device-tree/cpu-topology.c
b/xen/common/device-tree/cpu-topology.c
index bbdf0d1fe8..7b6c918139 100644
--- a/xen/common/device-tree/cpu-topology.c
+++ b/xen/common/device-tree/cpu-topology.c
@@ -325,6 +325,55 @@ int __init parse_dt_topology(void)
return parse_socket(map);
}
+static void __init setup_cpu_topology_ids(void)
+{
+ unsigned int cpu;
+ unsigned int next_core_id = 0U;
+ unsigned int next_cluster_id = 0U;
+ unsigned int next_socket_id = 0U;
+
+ for_each_possible_cpu( cpu )
+ {
+ unsigned int first_cpu;
+ struct cpu_topology *topo = &cpu_topology[cpu];
+
+ first_cpu = cpumask_first(&topo->thread_sibling);
+ if ( first_cpu == cpu )
+ {
+ topo->phys_core_id = next_core_id;
+ next_core_id++;
+ }
+ else
+ {
+ topo->phys_core_id = cpu_topology[first_cpu].phys_core_id;
+ }
+
+ first_cpu = cpumask_first(&topo->cluster_sibling);
+ if ( first_cpu == cpu )
+ {
+ topo->phys_cluster_id = next_cluster_id;
+ next_cluster_id++;
+ }
+ else
+ {
+ topo->phys_cluster_id = cpu_topology[first_cpu].phys_cluster_id;
+ }
+
+ first_cpu = cpumask_first(&topo->core_sibling);
+ if ( first_cpu == cpu )
+ {
+ topo->phys_socket_id = next_socket_id;
+ next_socket_id++;
+ }
+ else
+ {
+ topo->phys_socket_id = cpu_topology[first_cpu].phys_socket_id;
+ }
+
+ topo->num_siblings = cpumask_weight(&topo->thread_sibling);
+ }
+}
+
void __init dt_init_cpu_topology(void)
{
unsigned int cpu;
@@ -339,4 +388,6 @@ void __init dt_init_cpu_topology(void)
for_each_possible_cpu( cpu )
setup_siblings_masks(cpu);
+
+ setup_cpu_topology_ids();
}
diff --git a/xen/common/sched/credit2.c b/xen/common/sched/credit2.c
index 77475ee363..dcce1e361f 100644
--- a/xen/common/sched/credit2.c
+++ b/xen/common/sched/credit2.c
@@ -19,6 +19,7 @@
#include <xen/softirq.h>
#include <xen/time.h>
#include <xen/trace.h>
+#include <xen/cpu-topology.h>
#include <asm/div64.h>
@@ -37,6 +38,8 @@ static unsigned int cpu_nr_siblings(unsigned int cpu)
{
#ifdef CONFIG_X86
return cpu_data[cpu].x86_num_siblings;
+#elif CONFIG_DT_CPU_TOPOLOGY
+ return cpu_topology[cpu].num_siblings;
#else
return 1;
#endif
diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c
index 5207664252..81a68fe24c 100644
--- a/xen/common/sysctl.c
+++ b/xen/common/sysctl.c
@@ -28,6 +28,7 @@
#include <xen/pmstat.h>
#include <xen/livepatch.h>
#include <xen/coverage.h>
+#include <xen/cpu-topology.h>
long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl)
{
diff --git a/xen/include/xen/cpu-topology.h b/xen/include/xen/cpu-topology.h
index 1c03f4deaa..f268069449 100644
--- a/xen/include/xen/cpu-topology.h
+++ b/xen/include/xen/cpu-topology.h
@@ -10,6 +10,10 @@ struct cpu_topology {
cpumask_t thread_sibling;
cpumask_t core_sibling;
cpumask_t cluster_sibling;
+ unsigned int phys_core_id;
+ unsigned int phys_cluster_id;
+ unsigned int phys_socket_id;
+ unsigned int num_siblings;
};
@@ -19,11 +23,17 @@ extern struct cpu_topology *cpu_topology;
void map_cpuid_to_node(unsigned int cpuid, struct dt_device_node *cpu_node);
void dt_init_cpu_topology(void);
+#define cpu_to_core(_cpu) (cpu_topology[_cpu].phys_core_id)
+#define cpu_to_socket(_cpu) (cpu_topology[_cpu].phys_socket_id)
+
#elif CONFIG_DEVICE_TREE_PARSE
static inline void map_cpuid_to_node(unsigned int cpuid, struct dt_device_node
*cpu_node) {}
static inline void dt_init_cpu_topology(void) {}
+#define cpu_to_core(_cpu) (0)
+#define cpu_to_socket(_cpu) (0)
+
#endif /* CONFIG_DEVICE_TREE_PARSE */
#endif /* XEN_CPU_TOPOLOGY_H */
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |