[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [PATCH v2 1/3] xen/device-tree: Parse 'cpu-map' node for CPU topology exploration


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Hirokazu Takahashi <taka@xxxxxxxxxxxxx>
  • Date: Wed, 24 Jun 2026 09:05:14 +0000
  • Accept-language: ja-JP, en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Ufy2fOBobuiF16MVIH9M5dCvDvs8ggseKk5ElueCWvw=; b=W7Op0HSvRdYhIDO8th+S5eEn5N1781luH2Itg/m4X8GyJhTER3GZ5sVViDz/kMFI44cpvwXfiyzdTJjb6xbkmj4Ga4hJ7yCDvSwWU9KKNzEi5uYll+cmwurCBti/d0+I4rYUJJ6cIKzCCs9bvNls08vxUFxtPpi/oxXAIAM+NUFcngXeYPopqsvlM3jFe+ctHVpVM5nZvvE7Fq/M9RK5nogffV1mEs0WYxLfioJqv8GrKxsQT7FoGxkw4TuHsyANAKZsJra/L9ZfLCHfNUB3q+Wxg8nGnGYnEPWFeuhqNi5vd4S4pDxHlbuo5NBbR0OZxe1eVV2I4nipnTvrdTQyEw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=TYcyAjzu7O4v5oPwWlsVWEMPv++mrhweVZ2s0iNA1SBCVCuSc5fxY7vrybijS6/3C+xYwbcQhWA54385kTYOf1aitmtYoIw7fVh15PC0mEy7Q3tl2pw+JDF+Ayj+MD3q5fGFFUd9tcRJIED7xOziH2pjyYnLmS1oICgwbHf2amEaXjt6hI2PEN9CZk9b31FNhzfxydeAuFQfnyM9QLbmaYi+zMZWumEnGP5AgzqFU6Hupx1P27D64YP/ogyW8jv0wlhWN2QlbDSrC5rbmwsAjpC4tp04ldKfiTwJRZ5ro5W6MRWby9GBUq/3uBo4G+MpPqVpkO2Pyt4RtBjWaYoxcA==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=valinux.co.jp header.i="@valinux.co.jp" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp;
  • Cc: "Mykyta_Poturai@xxxxxxxx" <Mykyta_Poturai@xxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Wed, 24 Jun 2026 09:05:27 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHc/iieS3lBNqoSEkmC0mA+RhjVELZKgS4AgALq9XA=
  • Thread-topic: [PATCH v2 1/3] xen/device-tree: Parse 'cpu-map' node for CPU topology exploration

Hello,

> > --- /dev/null
> > +++ b/xen/common/cpu-topology.c
> > @@ -0,0 +1,30 @@
> > +/* SPDX-License-Identifier: GPL-2.0-or-later */
> > +
> > +#include <xen/cpumask.h>
> > +#include <xen/cpu-topology.h>
> > +#include <xen/init.h>
> > +#include <xen/acpi.h>
> > +
> > +void __init init_cpu_topology(void)
> > +{
> > +    const unsigned int nr_cpus = cpumask_last(&cpu_possible_map) +
> 1U;
> > +
> > +    cpu_topology = xzalloc_array(struct cpu_topology, nr_cpus);
> 
> cpu_topology exists as a global variable only when DT is in use. I think the
> definition needs to move here (from common/device-tree/cpu-topology.c).

Okay

> As to the size of the array, it's not quite clear to me whether by doing it
> this way (instead of using nr_cpu_ids) we're not setting ourselves up for
> trouble.

On ARM64 Xen, nr_cpu_ids represents the total number of populated/available 
CPUs, but unfortunately it cannot be relied upon as the maximum CPU ID. 

For instance, if a CPU node in the Device Tree has an invalid 'enable-method' 
property, that CPU ID slot is still consumed during the initial parsing, but 
the CPU is not counted towards nr_cpu_ids. This can result in a sparse CPU ID 
allocation where the maximum CPU ID actually exceeds. 

If we were to use nr_cpu_ids as the array size here, we would risk an 
out-of-bounds access under such faulty Device Tree configurations. This is 
why I used "cpumask_last(&cpu_possible_map) + 1U" to ensure the array is 
large enough to cover the highest allocated CPU ID.

Consequently, there might actually be potential bugs in other parts of Xen 
where nr_cpu_ids is incorrectly assumed to be the upper bound for CPU ID 
indexing on ARM.

> > +    if ( !cpu_topology )
> > +        panic("Failed to allocate memory for cpu_topology array\n");
> 
> I question such uses of panic(): Surely we can do without any NUMA info,
> it's only performance which is going to suffer.

Okay, I will replace the panic() with a XENLOG_WARNING printk.

> > +
> > +static struct dt_device_node * __init dt_find_child_node_by_name(struct 
> > dt_device_node *from, const char *name)
> 
> Nit: Overlong line here, and ...

Okay, I will fix it.

> > +static int __init parse_core(struct dt_device_node *core,
> > +                unsigned int package_id, unsigned int cluster_id,
> > +                unsigned int core_id)
> 
> ... bogus indentation e.g. here. Please go though yourself to check style.

Okay.

> > --- /dev/null
> > +++ b/xen/drivers/acpi/topology.c
> > @@ -0,0 +1,38 @@
> > +/* SPDX-License-Identifier: GPL-2.0-or-later */
> > +
> > +#include <xen/cpumask.h>
> > +#include <xen/cpu-topology.h>
> > +#include <xen/init.h>
> > +#include <xen/acpi.h>
> > +
> > +/*
> > + * ToDo: Populate the topology information by scanning the ACPI
> > + *       PPTT (Processor Properties Topology Table).
> 
> Please can this be spelled "TODO:", to stand out more and to be a hit also
> with case sensitive grep for "TODO"?

Okay.

> > --- a/xen/include/xen/acpi.h
> > +++ b/xen/include/xen/acpi.h
> > @@ -101,6 +101,8 @@ void acpi_table_print (struct acpi_table_header
> *header, unsigned long phys_addr
> >  void acpi_table_print_madt_entry (struct acpi_subtable_header *madt);
> >  void acpi_table_print_srat_entry (struct acpi_subtable_header *srat);
> >
> > +void acpi_init_cpu_topology(void);
> > +
> >  /* the following four functions are architecture-dependent */
> >  void acpi_numa_slit_init (struct acpi_table_slit *slit);
> >  void acpi_numa_processor_affinity_init(const struct
> acpi_srat_cpu_affinity *);
> > @@ -133,6 +135,8 @@ static inline int acpi_boot_table_init(void)
> >     return 0;
> >  }
> >
> > +static inline void acpi_init_cpu_topology(void) {}
> 
> This shouldn't be needed. When ACPI=y, acpi_disabled is compile-time true,
> and hence the compiler can and will DCE the call. All it needs to see is a
> declaration, which therefore wants to move outside of the CONFIG_ACPI
> conditional.

okay
 
> > --- /dev/null
> > +++ b/xen/include/xen/cpu-topology.h
> > @@ -0,0 +1,36 @@
> > +/* SPDX-License-Identifier: GPL-2.0-only */
> > +
> > +#ifndef XEN_CPU_TOPOLOGY_H
> > +#define XEN_CPU_TOPOLOGY_H
> > +
> > +#include <xen/types.h>
> > +#include <xen/dt-cpu-topology.h>
> > +
> > +struct cpu_topology {
> > +    cpumask_t thread_sibling;
> > +    cpumask_t core_sibling;
> > +    cpumask_t cluster_sibling;
> > +};
> 
> With huge NR_CPUS this can be pretty large a struct (of which in 
> init_cpu_topology()
> you allocate an array). Imo you want to use cpumask_var_t here, with 
> allocation added
> as needed.

Okay.

> > +
> > +
> 
> Nit: No double blank lines please.

Okay.

Thank you,
Hirokazu Takahashi.

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.