[PATCH v9 0/4] xen/acpi,device-tree: Introduce generic CPU topology support for ACPI and DT
Hirokazu Takahashi <[email protected]>
| Newsgroups | org.xenproject.lists.xen-devel |
|---|---|
| Message-ID | <[email protected]> |
Hello,
This patch series integrates CPU topology discovery into the Xen hypervisor
for both ACPI and Device Tree platforms.
Changes in v9:
- Add bounds checking for the number of private resources in the PPTT
processor table.
- Verify the validity of entries when indexing into the map_cpu_acpiid table.
- Coding style adjustments (following Xen standards):
* Place logical operators ('||', '&&') at the end of lines when splitting
multi-line conditions.
* Place arithmetic operators ('+', '-') at the end of lines when wrapping
long assignment statements.
* Enclose bitwise operations in parentheses within conditional expressions
that combine logical operators.
* Combine variable declaration and initialization where applicable.
Changes in v8:
- PPTT Table Validation & Hardening:
* Relaxed processor node length check to allow
proc->header.length >= table_size.
* Treated root nodes (nodes with parent == 0) as equivalent to
ACPI_PPTT_PHYSICAL_PACKAGE nodes.
- Build & Kconfig Adjustments:
* Removed leftovers of ACPI_CPU_TOPOLOGY definition from
xen/drivers/acpi/Kconfig.
- Code Cleanups & Style Conformance:
* Moved INVALID_ACPIID definition to xen/acpi.h to make it available
cross-architecture.
* Removed ARM-specific references from comments in
architecture-agnostic code.
* Added explicit parentheses around bitwise operations in logical
expressions.
* Placed binary logical operators (||, &&) at the end of lines when
splitting conditional statements.
* Combined variable declarations and initializations where appropriate.
* Removed trailing full stops ('.') from printk log messages.
* Fixed printk format specifier mix-up.
* Explicitly included <xen/cpu-topology.h> in xen/common/cpu.c.
Changes in v7:
- PPTT Table Validation & Hardening:
* find_pptt_node(): Added leaf node verification (ACPI 6.3+).
* acpi_init_cpu_topology(): Added bounds checks to ensure proc->parent
validly references memory strictly inside the PPTT table bounds.
* Factored out shared table checking helper functions used by both
find_pptt_node() and acpi_init_cpu_topology().
* Added subtable alignment checks and strengthened processor structure
size validation.
- Graceful Fallback & Allocation:
* Treated missing topology definitions as benign conditions.
* Used xvzalloc_array() for temporary memory allocations during
initialization.
- Build & Kconfig Adjustments:
* Updated Kconfig to use "depends on UNSUPPORTED" instead of "if UNSUPPORTED".
- Code Cleanups & Style Conformance:
* Used designated initializers for structure data initializations.
* Consolidated topology helpers with IS_ENABLED().
* Removed redundant error checks and reduced unnecessary pointer casts.
* Switched type-based sizeof(type) to variable-based sizeof(*var).
* Added leading spaces before labels ( out:)
Changes in v6:
- Renamed the series subject from "xen/arm: Device Tree based CPU topology
support" to reflect the inclusion of generic ACPI PPTT topology parsing.
- Infrastructure & Kconfig:
* Updated Kconfig to make both DT_CPU_TOPOLOGY and ACPI_CPU_TOPOLOGY
select GENERIC_CPU_TOPOLOGY.
* Ensured that if topology parsing from either DT or ACPI PPTT fails, the
CPU topology table is freed to fall back to the non-topology behavior.
* Moved the `cpu_topology` definition to `cpu.c` so that variables and
functions in `cpu-topology.c` can be completely freed after Xen init.
- Topology Logic (DT / ACPI):
* Set the cluster ID to 0 when the cluster definition is missing from the
Device Tree `cpu-map` node.
* Handled cases where cluster info is missing upon reaching a physical
package in the PPTT parser by assuming one cluster per socket.
* Split out the import of ACPI PPTT definitions from the Linux kernel
(including unused definitions) into a separate standalone patch.
- Robustness & Safety:
* Avoided assuming `np` becomes NULL after exiting `dt_for_each_child_node()`;
explicitly return NULL instead.
* Added bounds-checking `ASSERT`s for values returned by `cpumask_first()`.
* Added explicit braces `{}` to nested `if` statements to clarify `else`
scoping and maintain style symmetry.
* Enforced an upper limit on the PPTT parsing loop iterations to prevent
infinite loops on corrupted tables.
* Treat the absence of a physical package node definition in PPTT as a
parsing error.
- Optimization & Efficiency:
* Optimized `setup_siblings_masks()` to eliminate redundant loop iterations.
* Dynamically allocate the temporary data storage used during ACPI PPTT
parsing.
- Code Cleanup & Refactoring:
* Replaced the `invalid_topo_id` constant with the `INVALID_TOPO_ID` macro.
* Initialized all members of the `cpu_map` array with `INVALID_TOPO_ID`.
* Added a blank line between `<xen/...>` and `<asm/...>` header groups.
* Reordered `#ifdef` blocks to prioritize generic logic over architecture-
specific ones.
* Corrected code indentation.
* Applied the `static` specifier to file-local data structures and functions.
* Minimized the use of fixed-width `uint32_t` types, restricting its use only
where strictly required by the 32-bit ACPI ID specification.
* Declared `map_cpu_acpiid[]` as static and introduced the helper function
`acpi_map_cpu_acpiid()` for managed access.
* Renamed local variables to more intuitive names.
* Simplified the implementation of `get_logical_id()`.
* Refactored PPTT parsing to reduce type casting by using `container_of()`
and switching from `char *` to `void *` pointers.
* Removed redundant error checks.
* Cleaned up unused variables and eliminated debug print statements.
Changes in v5:
- Extracted CPU topology information from the ACPI PPTT.
- Corrected the erroneous use of CONFIG_CPU_TOPOLOGY to
CONFIG_GENERIC_CPU_TOPOLOGY.
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 (4):
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/acpi: Parse PPTT to initialize CPU topology
xen/arch/arm/Kconfig | 1 +
xen/arch/arm/acpi/boot.c | 2 +
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/acpi.h | 2 -
xen/arch/x86/include/asm/processor.h | 1 +
xen/common/Kconfig | 22 ++
xen/common/Makefile | 1 +
xen/common/cpu-topology.c | 62 ++++
xen/common/cpu.c | 5 +
xen/common/device-tree/Makefile | 1 +
xen/common/device-tree/cpu-topology.c | 409 +++++++++++++++++++++++++
xen/common/sched/credit2.c | 21 +-
xen/common/sysctl.c | 1 +
xen/drivers/acpi/Makefile | 1 +
xen/drivers/acpi/topology.c | 341 +++++++++++++++++++++
xen/include/xen/acpi.h | 17 +
xen/include/xen/cpu-topology.h | 76 +++++
xen/include/xen/dt-cpu-topology.h | 35 +++
21 files changed, 987 insertions(+), 38 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