* [PATCH RFC] arch_topology: Introduce nr_possible_packages @ 2026-05-12 15:05 Feng Tang 2026-05-12 15:51 ` Greg Kroah-Hartman 0 siblings, 1 reply; 4+ messages in thread From: Feng Tang @ 2026-05-12 15:05 UTC (permalink / raw) To: Sudeep Holla, Greg Kroah-Hartman, rafael, Danilo Krummrich Cc: Catalin Marinas, Will Deacon, David Hildenbrand, linux-kernel, driver-core, Feng Tang In multi-sockets platform, kernel or driver code may need the number of packages for chosing different code directions. Some architecture already provide such kind of interface like x86, which is being used in some 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. Signed-off-by: Feng Tang <feng.tang@linux.alibaba.com> --- drivers/base/arch_topology.c | 21 +++++++++++++++++++++ include/linux/arch_topology.h | 5 +++++ 2 files changed, 26 insertions(+) diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c index 8c5e47c28d9a..796d8a7aceea 100644 --- a/drivers/base/arch_topology.c +++ b/drivers/base/arch_topology.c @@ -850,6 +850,16 @@ static bool __init acpi_cpu_is_threaded(int cpu) return !!is_threaded; } +unsigned int nr_possible_packages __ro_after_init = 1; +EXPORT_SYMBOL(nr_possible_packages); + +/* + * Assuming silicon has a sane package ID decoding method to not have + * an ID bigger than 255 (1 byte). + */ +#define MAX_PACKAGE_ID 255 +DECLARE_BITMAP(package_id_mask, MAX_PACKAGE_ID + 1); + /* * Propagate the topology information of the processor_topology_node tree to the * cpu_topology array. @@ -912,6 +922,13 @@ __weak int __init parse_acpi_topology(void) cpu_topology[cpu].cluster_id = topology_id; topology_id = find_acpi_cpu_topology_package(cpu); cpu_topology[cpu].package_id = topology_id; + + + if (topology_id >= 0 && topology_id <= MAX_PACKAGE_ID) + bitmap_set(package_id_mask, topology_id, 1); + else + pr_warn("ACPI: abnormal package ID: %d !\n", + topology_id); } /* @@ -927,6 +944,10 @@ __weak int __init parse_acpi_topology(void) cpu_smt_set_num_threads(max_smt_thread_num, max_smt_thread_num); xa_destroy(&hetero_cpu); + + /* Count the number of possible packages in system */ + nr_possible_packages = bitmap_weight(package_id_mask, MAX_PACKAGE_ID + 1); + pr_info("ACPI: System has %u Package(s) detected\n", nr_possible_packages); return 0; } diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h index ebd7f8935f96..dee076cc9c7a 100644 --- a/include/linux/arch_topology.h +++ b/include/linux/arch_topology.h @@ -111,4 +111,9 @@ static inline bool topology_core_has_smt(int cpu) { return false; } #endif /* CONFIG_GENERIC_ARCH_TOPOLOGY */ + +#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV) +extern unsigned int nr_possible_packages; +#endif + #endif /* _LINUX_ARCH_TOPOLOGY_H_ */ base-commit: 50897c955902c93ae71c38698abb910525ebdc89 -- 2.39.5 (Apple Git-154) ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH RFC] arch_topology: Introduce nr_possible_packages 2026-05-12 15:05 [PATCH RFC] arch_topology: Introduce nr_possible_packages Feng Tang @ 2026-05-12 15:51 ` Greg Kroah-Hartman 2026-05-13 1:35 ` Feng Tang 0 siblings, 1 reply; 4+ messages in thread From: Greg Kroah-Hartman @ 2026-05-12 15:51 UTC (permalink / raw) To: Feng Tang Cc: Sudeep Holla, rafael, Danilo Krummrich, Catalin Marinas, Will Deacon, David Hildenbrand, linux-kernel, driver-core On Tue, May 12, 2026 at 11:05:05PM +0800, Feng Tang wrote: > In multi-sockets platform, kernel or driver code may need the number > of packages for chosing different code directions. Some architecture > already provide such kind of interface like x86, which is being used > in some 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. > > Signed-off-by: Feng Tang <feng.tang@linux.alibaba.com> > --- > drivers/base/arch_topology.c | 21 +++++++++++++++++++++ > include/linux/arch_topology.h | 5 +++++ > 2 files changed, 26 insertions(+) > > diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c > index 8c5e47c28d9a..796d8a7aceea 100644 > --- a/drivers/base/arch_topology.c > +++ b/drivers/base/arch_topology.c > @@ -850,6 +850,16 @@ static bool __init acpi_cpu_is_threaded(int cpu) > return !!is_threaded; > } > > +unsigned int nr_possible_packages __ro_after_init = 1; > +EXPORT_SYMBOL(nr_possible_packages); EXPORT_SYMBOL_GPL() please? And you don't have a user for this, so we can't verify how it actually works :( thanks, greg k-h > +/* > + * Assuming silicon has a sane package ID decoding method to not have > + * an ID bigger than 255 (1 byte). Is that a valid assumption? What about packages bigger than 255? Don't we have those today? > + */ > +#define MAX_PACKAGE_ID 255 > +DECLARE_BITMAP(package_id_mask, MAX_PACKAGE_ID + 1); > + > /* > * Propagate the topology information of the processor_topology_node tree to the > * cpu_topology array. > @@ -912,6 +922,13 @@ __weak int __init parse_acpi_topology(void) > cpu_topology[cpu].cluster_id = topology_id; > topology_id = find_acpi_cpu_topology_package(cpu); > cpu_topology[cpu].package_id = topology_id; > + > + > + if (topology_id >= 0 && topology_id <= MAX_PACKAGE_ID) > + bitmap_set(package_id_mask, topology_id, 1); > + else > + pr_warn("ACPI: abnormal package ID: %d !\n", > + topology_id); > } > > /* > @@ -927,6 +944,10 @@ __weak int __init parse_acpi_topology(void) > > cpu_smt_set_num_threads(max_smt_thread_num, max_smt_thread_num); > xa_destroy(&hetero_cpu); > + > + /* Count the number of possible packages in system */ > + nr_possible_packages = bitmap_weight(package_id_mask, MAX_PACKAGE_ID + 1); > + pr_info("ACPI: System has %u Package(s) detected\n", nr_possible_packages); Why "P" and not "p"? > return 0; > } > > diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h > index ebd7f8935f96..dee076cc9c7a 100644 > --- a/include/linux/arch_topology.h > +++ b/include/linux/arch_topology.h > @@ -111,4 +111,9 @@ static inline bool topology_core_has_smt(int cpu) { return false; } > > #endif /* CONFIG_GENERIC_ARCH_TOPOLOGY */ > > + > +#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV) > +extern unsigned int nr_possible_packages; > +#endif Why the ifdef? thanks, greg k-h ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH RFC] arch_topology: Introduce nr_possible_packages 2026-05-12 15:51 ` Greg Kroah-Hartman @ 2026-05-13 1:35 ` Feng Tang 2026-05-13 9:46 ` Feng Tang 0 siblings, 1 reply; 4+ messages in thread From: Feng Tang @ 2026-05-13 1:35 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Sudeep Holla, rafael, Danilo Krummrich, Catalin Marinas, Will Deacon, David Hildenbrand, linux-kernel, driver-core Hi Greg, Thanks for the review! On Tue, May 12, 2026 at 05:51:25PM +0200, Greg Kroah-Hartman wrote: > On Tue, May 12, 2026 at 11:05:05PM +0800, Feng Tang wrote: > > In multi-sockets platform, kernel or driver code may need the number > > of packages for chosing different code directions. Some architecture > > already provide such kind of interface like x86, which is being used > > in some 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. > > > > Signed-off-by: Feng Tang <feng.tang@linux.alibaba.com> > > --- > > drivers/base/arch_topology.c | 21 +++++++++++++++++++++ > > include/linux/arch_topology.h | 5 +++++ > > 2 files changed, 26 insertions(+) > > > > diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c > > index 8c5e47c28d9a..796d8a7aceea 100644 > > --- a/drivers/base/arch_topology.c > > +++ b/drivers/base/arch_topology.c > > @@ -850,6 +850,16 @@ static bool __init acpi_cpu_is_threaded(int cpu) > > return !!is_threaded; > > } > > > > +unsigned int nr_possible_packages __ro_after_init = 1; > > +EXPORT_SYMBOL(nr_possible_packages); > > EXPORT_SYMBOL_GPL() please? Will change. > And you don't have a user for this, so we can't verify how it actually > works :( Good point. Internally we have some PMU driver using this, but the HW is not public and the drive hasn't been posted yet. As for validation, we tested on production 1P platform, internal 2P platform, and QEMU's multi-socket case. I checked a production arm64 2P platform 'Kunpeng 920', and from the output of "cat /sys/devices/system/cpu/cpu*/topology/physical_package_id", the patch should work fine. I don't have root right of it yet, will try to really run the patch on it. > thanks, > > greg k-h > > > +/* > > + * Assuming silicon has a sane package ID decoding method to not have > > + * an ID bigger than 255 (1 byte). > > Is that a valid assumption? What about packages bigger than 255? Don't > we have those today? Myself have only touched 8P (16P) HW, which may limit my imagination :) We can change it to 1024 or 2048, though I'm curious how the cross-socket latency and coherency could be maintained for huge platforms. > > > + */ > > +#define MAX_PACKAGE_ID 255 > > +DECLARE_BITMAP(package_id_mask, MAX_PACKAGE_ID + 1); > > + > > /* > > * Propagate the topology information of the processor_topology_node tree to the > > * cpu_topology array. > > @@ -912,6 +922,13 @@ __weak int __init parse_acpi_topology(void) > > cpu_topology[cpu].cluster_id = topology_id; > > topology_id = find_acpi_cpu_topology_package(cpu); > > cpu_topology[cpu].package_id = topology_id; > > + > > + > > + if (topology_id >= 0 && topology_id <= MAX_PACKAGE_ID) > > + bitmap_set(package_id_mask, topology_id, 1); > > + else > > + pr_warn("ACPI: abnormal package ID: %d !\n", > > + topology_id); > > } > > > > /* > > @@ -927,6 +944,10 @@ __weak int __init parse_acpi_topology(void) > > > > cpu_smt_set_num_threads(max_smt_thread_num, max_smt_thread_num); > > xa_destroy(&hetero_cpu); > > + > > + /* Count the number of possible packages in system */ > > + nr_possible_packages = bitmap_weight(package_id_mask, MAX_PACKAGE_ID + 1); > > + pr_info("ACPI: System has %u Package(s) detected\n", nr_possible_packages); > > Why "P" and not "p"? :) will change. > > > return 0; > > } > > > > diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h > > index ebd7f8935f96..dee076cc9c7a 100644 > > --- a/include/linux/arch_topology.h > > +++ b/include/linux/arch_topology.h > > @@ -111,4 +111,9 @@ static inline bool topology_core_has_smt(int cpu) { return false; } > > > > #endif /* CONFIG_GENERIC_ARCH_TOPOLOGY */ > > > > + > > +#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV) > > +extern unsigned int nr_possible_packages; > > +#endif > > Why the ifdef? Aha, initial version of patch doesn't have it, as I think many architectures may need this. It was added later as the 'parse_acpi_topology()' function is under this 'ifdef'. I can move the 'nr_possible_packages' for future expandability if no objection. Thanks, Feng > thanks, > > greg k-h ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH RFC] arch_topology: Introduce nr_possible_packages 2026-05-13 1:35 ` Feng Tang @ 2026-05-13 9:46 ` Feng Tang 0 siblings, 0 replies; 4+ messages in thread From: Feng Tang @ 2026-05-13 9:46 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Sudeep Holla, rafael, Danilo Krummrich, Catalin Marinas, Will Deacon, David Hildenbrand, linux-kernel, driver-core On Wed, May 13, 2026 at 09:35:30AM +0800, Feng Tang wrote: [...] > > And you don't have a user for this, so we can't verify how it actually > > works :( > > Good point. Internally we have some PMU driver using this, but the HW is > not public and the drive hasn't been posted yet. > > As for validation, we tested on production 1P platform, internal 2P > platform, and QEMU's multi-socket case. > > I checked a production arm64 2P platform 'Kunpeng 920', and from the > output of "cat /sys/devices/system/cpu/cpu*/topology/physical_package_id", > the patch should work fine. I don't have root right of it yet, will try > to really run the patch on it. Just tried 7.1-rc3 + this patch on the 2P arm64 'Kunpeng 920' server, and it showed the correct package number: "[ 0.011284] ACPI: System has 2 Package(s) detected" Thanks, Feng ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-05-13 9:46 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-05-12 15:05 [PATCH RFC] arch_topology: Introduce nr_possible_packages Feng Tang 2026-05-12 15:51 ` Greg Kroah-Hartman 2026-05-13 1:35 ` Feng Tang 2026-05-13 9:46 ` Feng Tang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox