Re: [PATCH v2] arch_topology: Introduce nr_possible_packages

From: Sudeep Holla

Date: Wed Jul 22 2026 - 04:45:05 EST


On Tue, Jul 14, 2026 at 01:43:17PM +0800, Feng Tang wrote:
> For multi-sockets platforms kernel or driver code may need the number
> of packages to chose different code directions. Some architecture
> already provides such kind of interface like x86, which is being used
> in its architecture code and drivers.
>
> Add similar interface 'nr_possible_packages' for platforms which can
> get package topology information by parsing ACPI tables in boot phase,
> which was verified to show the correct number of packages on some
> 1-socket and 2-sockets production arm64 servers from different vendors.
>
> It has been used locally by some arm64 PMU driver, and cross-socket
> timer-consistency check code, which are to be posted.
>
> Signed-off-by: Feng Tang <feng.tang@xxxxxxxxxxxxxxxxx>
> ---
> since v1:
> * fix the potential overflow issue for 32b package ID (Sudeep)
> * add real use case in commit log (Sudeep)
>
> since RFC:
> * use EXPORT_SYMBOL_GPL instead of EXPORT_SYMBOL (Greg)
> * change the possible max package ID to 2047 (Greg)
> * remove the CONFIG_ARM64/RISCV limit for 'nr_possible_packages' (Greg)
>
> v1: https://lore.kernel.org/lkml/20260515144435.93035-1-feng.tang@xxxxxxxxxxxxxxxxx/
> RFC: https://lore.kernel.org/lkml/20260512150505.43871-1-feng.tang@xxxxxxxxxxxxxxxxx/
>
>
> drivers/base/arch_topology.c | 26 ++++++++++++++++++++++++++
> include/linux/arch_topology.h | 5 +++++
> 2 files changed, 31 insertions(+)
>
> diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
> index 8c5e47c28d9a..2ee27cc05b6b 100644
> --- a/drivers/base/arch_topology.c
> +++ b/drivers/base/arch_topology.c
> @@ -850,6 +850,29 @@ static bool __init acpi_cpu_is_threaded(int cpu)
> return !!is_threaded;
> }
>
> +unsigned int nr_possible_packages __ro_after_init;
> +EXPORT_SYMBOL(nr_possible_packages);
> +
> +static int package_ids[1 << CONFIG_NODES_SHIFT] __initdata;

Since all you need is just the total number of packages, this whole
array may not be required.

static unsigned int topology_count_packages(const struct cpumask *cpus)
{
unsigned int cpu, prev, count = 0;
int package_id;

for_each_cpu(cpu, cpus) {
package_id = cpu_topology[cpu].package_id;
if (package_id < 0)
continue;

for_each_cpu(prev, cpus) {
if (prev == cpu) {
count++;
break;
}

if (cpu_topology[prev].package_id == package_id)
break;
}
}

return count;
}

Something like this would suffice, no ?

--
Regards,
Sudeep