Hello,
This patch series introduces Device-Tree based CPU topology support
for ARM Xen.
This version incorporates the feedback received from Jan on the v3
submission. The main focus of this update includes transitioning
towards a generic Kconfig structure, untangling header dependencies
and various code cleanups.
Future Work:
- Support for the "credit2_runqueue=cluster" option.
- CPU topology support for RISC-V and PPC (once SMP support is available).
- Topology information generation from the ACPI PPTT.
Changes in v4:
- Only display the CPU topology configuration prompt in common/Kconfig
if the architecture defines HAS_GENERIC_CPU_TOPOLOGY.
- Move the definition of the global 'cpu_topology' pointer to
common/cpu-topology.c.
- Update the Makefile to explicitly build objects as .init.o when all
functions and data within a file are annotated with __init/__initdata,
ensuring their memory is reclaimed after system initialization.
- Add an error log in the CPU-to-node mapping function for out-of-bounds
cases.
- Use ARRAY_SIZE() instead of raw macros when guarding array accesses.
- Rename variables and functions to avoid ambiguous or misleading terms:
- Avoid 'cpuid' to prevent confusion with x86 CPUID features/instructions.
- Avoid 'node' where it could be confused with a NUMA node, explicitly
renaming them to clarify they refer to a Device Tree node.
- Move local variable declarations into the narrowest possible scope.
- Replace the unsupported "%pOF" printk format specifier with "%s" and
explicit node name retrieval.
- Remove #include <dt-cpu-topology.h> from cpu-topology.h, and ensure
the header directly includes only what its definitions require.
- Remove #include <xen/device_tree.h> from dt-cpu-topology.h, replacing
it with a forward declaration of 'struct dt_device_node'.
- Use 'const' qualifiers for pointer declarations where the pointed-to
structure is not modified.
- Explicitly #include <asm/processor.h> in cpu-topology.h to guarantee
that arch-specific definitions of cpu_to_core() and cpu_to_socket()
take precedence over the generic fallbacks.
- Introduce inline initialization functions for cpu_sibling_mask and
cpu_core_mask in cpu-topology.h, providing separate variants for both
when CONFIG_GENERIC_CPU_TOPOLOGY is enabled and disabled.
Changes in v3:
- Use (nr_cpu_ids - 1) as the maximum CPU ID here. The fix for the sparse
map mismatch issue on ARM Xen has been split out into a separate patch.
- Switch topology sibling masks to cpumask_var_t for dynamic allocation.
- Allow the system to keep running with a degraded fallback even if
the topology table allocation fails.
- Remove the temporary definitions of cpu_to_core() and cpu_to_socket()
from RISC-V and PPC processor.h.
- Minimize the use of #ifdef blocks, leveraging compiler Dead Code
Elimination (DCE) where possible.
- Clean up the code to follow the Xen coding style. Please let me know
if I missed any style nits!
- Verify successful builds across x86, RISC-V, and PPC environments.
Changes in v2:
- Generate topology information even when ACPI is enabled. Note that
this is a temporary implementation and doesn't yet parse the PPTT
(Processor Properties Topology Table).
- Added support for cpu-map node in Device Tree that doesn't contain
explicit cluster node definitions.
Changes in v1 from the previous series "Introduce Device Tree based NUMA
support for ARM Xen":
1. Optimized Memory Allocation:
The series now allocates only the minimum required memory area to manage
the essential data for the CPUs.
2. Flexible Device Tree Parsing:
The parsing logic no longer depends on the definition order of the 'cpu'
nodes and 'cpu-map' nodes in the Device Tree. They can now be read
correctly even if their orders do not match.
3. CPU Hotplug Readiness:
To support future CPU hotplug, the system assumes that inactive CPUs are
also described in the Device Tree. Xen will pre-load and generate the
topology information for these inactive CPUs during the boot phase so
it stays available in memory.
Thank you,
Hirokazu Takahashi
Hirokazu Takahashi (3):
xen/device-tree: Parse 'cpu-map' node for CPU topology exploration
xen/sched: Link CPU topology to scheduler
xen/sched: Make cpu_nr_siblings() architecture-specific
xen/arch/arm/Kconfig | 1 +
xen/arch/arm/include/asm/processor.h | 4 -
xen/arch/arm/smpboot.c | 15 +-
xen/arch/ppc/include/asm/processor.h | 4 -
xen/arch/riscv/include/asm/processor.h | 4 -
xen/arch/x86/include/asm/processor.h | 1 +
xen/common/Kconfig | 18 ++
xen/common/Makefile | 1 +
xen/common/cpu-topology.c | 62 ++++
xen/common/device-tree/Makefile | 1 +
xen/common/device-tree/cpu-topology.c | 406 +++++++++++++++++++++++++
xen/common/sched/credit2.c | 21 +-
xen/common/sysctl.c | 1 +
xen/drivers/acpi/Kconfig | 3 +
xen/drivers/acpi/Makefile | 1 +
xen/drivers/acpi/topology.c | 41 +++
xen/include/xen/acpi.h | 2 +
xen/include/xen/cpu-topology.h | 83 +++++
xen/include/xen/dt-cpu-topology.h | 29 ++
19 files changed, 662 insertions(+), 36 deletions(-)
create mode 100644 xen/common/cpu-topology.c
create mode 100644 xen/common/device-tree/cpu-topology.c
create mode 100644 xen/drivers/acpi/topology.c
create mode 100644 xen/include/xen/cpu-topology.h
create mode 100644 xen/include/xen/dt-cpu-topology.h
--
2.43.0