Hi Stefano, Julien, Bertrand and Michal,
When you have a moment, could you please taka a look at the following
series and give me your feedbak.
Link to v9 series: https://old-list-archives.xenproject.org/archives/html/xen-devel/2026-07/msg01208.html
Thanks,
Hirokazu Takahashi.
> -----Original Message-----
> From: Hirokazu Takahashi <taka@valinux.co.jp>
> Sent: Tuesday, July 28, 2026 2:07 PM
> To: xen-devel@lists.xenproject.org
> Cc: Mykyta_Poturai@epam.com; Hirokazu Takahashi <taka@valinux.co.jp>
> Subject: [PATCH v9 0/4] xen/acpi,device-tree: Introduce generic CPU topology
> support for ACPI and DT
>
> 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
© 2016 - 2026 Red Hat, Inc.