|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v3 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 | 23 ++++++++----
xen/arch/ppc/include/asm/processor.h | 4 --
xen/arch/riscv/include/asm/processor.h | 4 --
xen/common/device-tree/cpu-topology.c | 51 ++++++++++++++++++++++++++
xen/common/sched/credit2.c | 3 ++
xen/common/sysctl.c | 1 +
xen/drivers/acpi/topology.c | 3 ++
xen/include/xen/cpu-topology.h | 15 ++++++++
9 files changed, 89 insertions(+), 19 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 3a77f1d33e..41cef34194 100644
--- a/xen/arch/arm/smpboot.c
+++ b/xen/arch/arm/smpboot.c
@@ -91,13 +91,22 @@ static int setup_cpu_sibling_map(int cpu)
!zalloc_cpumask_var(&per_cpu(cpu_core_mask, cpu)) )
return -ENOMEM;
- /*
- * 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).
- */
- cpumask_set_cpu(cpu, per_cpu(cpu_sibling_mask, cpu));
- cpumask_copy(per_cpu(cpu_core_mask, cpu), &cpu_possible_map);
+ if ( 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
+ {
+ /*
+ * If CONFIG_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);
+ }
return 0;
}
diff --git a/xen/arch/ppc/include/asm/processor.h
b/xen/arch/ppc/include/asm/processor.h
index 242346cab9..1bf6f6c66c 100644
--- a/xen/arch/ppc/include/asm/processor.h
+++ b/xen/arch/ppc/include/asm/processor.h
@@ -141,10 +141,6 @@
/* Macro to adjust thread priority for hardware multithreading */
#define HMT_very_low() asm volatile ( "or %r31, %r31, %r31" )
-/* TODO: This isn't correct */
-#define cpu_to_core(cpu) (0)
-#define cpu_to_socket(cpu) (0)
-
/*
* User-accessible registers: most of these need to be saved/restored
* for every nested Xen invocation.
diff --git a/xen/arch/riscv/include/asm/processor.h
b/xen/arch/riscv/include/asm/processor.h
index 6b89df4a2d..d478ffb76b 100644
--- a/xen/arch/riscv/include/asm/processor.h
+++ b/xen/arch/riscv/include/asm/processor.h
@@ -54,10 +54,6 @@ struct cpu_user_regs
unsigned long pregs;
};
-/* TODO: need to implement */
-#define cpu_to_core(cpu) 0
-#define cpu_to_socket(cpu) 0
-
static inline void cpu_relax(void)
{
#ifdef __riscv_zihintpause
diff --git a/xen/common/device-tree/cpu-topology.c
b/xen/common/device-tree/cpu-topology.c
index 0409e7b87d..8d502087dd 100644
--- a/xen/common/device-tree/cpu-topology.c
+++ b/xen/common/device-tree/cpu-topology.c
@@ -327,6 +327,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 = 0;
+ unsigned int next_cluster_id = 0;
+ unsigned int next_socket_id = 0;
+
+ 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;
+
+ /* Reuse the calculated core id if clustering is not supported */
+ if ( cpumask_empty(topo->cluster_sibling) )
+ topo->phys_cluster_id = topo->phys_core_id;
+ else
+ {
+ 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,6 +388,8 @@ 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..6ecc19cc4d 100644
--- a/xen/common/sched/credit2.c
+++ b/xen/common/sched/credit2.c
@@ -9,6 +9,7 @@
* Based on an earlier verson by Emmanuel Ackaouy.
*/
+#include <xen/cpu-topology.h>
#include <xen/errno.h>
#include <xen/init.h>
#include <xen/lib.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 defined(CONFIG_CPU_TOPOLOGY)
+ return cpu_topology ? cpu_topology[cpu].num_siblings : 1;
#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/drivers/acpi/topology.c b/xen/drivers/acpi/topology.c
index 6bd2d96ebb..9155edc0be 100644
--- a/xen/drivers/acpi/topology.c
+++ b/xen/drivers/acpi/topology.c
@@ -22,6 +22,9 @@ void __init acpi_init_cpu_topology(void)
{
struct cpu_topology *topo = &cpu_topology[cpu];
+ topo->phys_core_id = cpu;
+ topo->num_siblings = 1;
+
cpumask_set_cpu(cpu, topo->thread_sibling);
cpumask_copy(topo->core_sibling, &cpu_possible_map);
}
diff --git a/xen/include/xen/cpu-topology.h b/xen/include/xen/cpu-topology.h
index 698d148def..1cd73b7ee9 100644
--- a/xen/include/xen/cpu-topology.h
+++ b/xen/include/xen/cpu-topology.h
@@ -9,6 +9,10 @@ struct cpu_topology {
cpumask_var_t thread_sibling;
cpumask_var_t core_sibling;
cpumask_var_t cluster_sibling;
+ unsigned int phys_core_id;
+ unsigned int phys_cluster_id;
+ unsigned int phys_socket_id;
+ unsigned int num_siblings;
};
#ifdef CONFIG_CPU_TOPOLOGY
@@ -16,11 +20,22 @@ struct cpu_topology {
extern struct cpu_topology *cpu_topology;
void init_cpu_topology(void);
+#define cpu_to_core(cpu) (cpu_topology ? cpu_topology[cpu].phys_core_id : 0)
+#define cpu_to_socket(cpu) (cpu_topology ? cpu_topology[cpu].phys_socket_id :
0)
+
#else /* CONFIG_CPU_TOPOLOGY */
#define cpu_topology ((struct cpu_topology *)NULL)
static inline void init_cpu_topology(void) {}
+#ifndef cpu_to_core
+#define cpu_to_core(cpu) (0)
+#endif
+
+#ifndef cpu_to_socket
+#define cpu_to_socket(cpu) (0)
+#endif
+
#endif /* CONFIG_CPU_TOPOLOGY */
#endif /* XEN_CPU_TOPOLOGY_H */
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |