[PATCH v1] arch_topology: Introduce nr_possible_packages

Feng Tang posted 1 patch 1 week, 2 days ago
drivers/base/arch_topology.c  | 21 +++++++++++++++++++++
include/linux/arch_topology.h |  1 +
2 files changed, 22 insertions(+)
[PATCH v1] arch_topology: Introduce nr_possible_packages
Posted by Feng Tang 1 week, 2 days ago
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,
which was verified to show the correct number of packages on some
1-socket and 2-sockets production arm64 servers from different vendors.

Signed-off-by: Feng Tang <feng.tang@linux.alibaba.com>
---
Changelog:

  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)
	
  RFC: https://lore.kernel.org/lkml/20260512150505.43871-1-feng.tang@linux.alibaba.com/ 

 drivers/base/arch_topology.c  | 21 +++++++++++++++++++++
 include/linux/arch_topology.h |  1 +
 2 files changed, 22 insertions(+)

diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
index 8c5e47c28d9a..d799ba808b43 100644
--- a/drivers/base/arch_topology.c
+++ b/drivers/base/arch_topology.c
@@ -830,6 +830,16 @@ void remove_cpu_topology(unsigned int cpu)
 	clear_cpu_topology(cpu);
 }
 
+unsigned int nr_possible_packages __ro_after_init = 1;
+EXPORT_SYMBOL_GPL(nr_possible_packages);
+
+/*
+ * Assuming silicon has a sane package ID decoding method to not have
+ * an ID bigger than 2047
+ */
+#define MAX_PACKAGE_ID	2047
+DECLARE_BITMAP(package_id_mask, MAX_PACKAGE_ID + 1);
+
 #if defined(CONFIG_ARM64) || defined(CONFIG_RISCV)
 struct cpu_smt_info {
 	unsigned int thread_num;
@@ -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..960045e6ac05 100644
--- a/include/linux/arch_topology.h
+++ b/include/linux/arch_topology.h
@@ -105,6 +105,7 @@ static inline bool topology_core_has_smt(int cpu)
 	return cpu_topology[cpu].thread_id != -1;
 }
 
+extern unsigned int nr_possible_packages;
 #else
 
 static inline bool topology_core_has_smt(int cpu) { return false; }
-- 
2.39.5 (Apple Git-154)
Re: [PATCH v1] arch_topology: Introduce nr_possible_packages
Posted by kernel test robot 1 week, 1 day ago
Hi Feng,

kernel test robot noticed the following build warnings:

[auto build test WARNING on driver-core/driver-core-testing]
[also build test WARNING on driver-core/driver-core-next driver-core/driver-core-linus linus/master v7.1-rc3 next-20260508]
[cannot apply to linux-review/Feng-Tang/arch_topology-Introduce-nr_possible_packages/20260514-094659]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Feng-Tang/arch_topology-Introduce-nr_possible_packages/20260515-230156
base:   driver-core/driver-core-testing
patch link:    https://lore.kernel.org/r/20260515144435.93035-1-feng.tang%40linux.alibaba.com
patch subject: [PATCH v1] arch_topology: Introduce nr_possible_packages
config: parisc-randconfig-r122-20260516 (https://download.01.org/0day-ci/archive/20260516/202605161935.1SnObrFu-lkp@intel.com/config)
compiler: hppa-linux-gcc (GCC) 13.4.0
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260516/202605161935.1SnObrFu-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202605161935.1SnObrFu-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
>> drivers/base/arch_topology.c:841:1: sparse: sparse: symbol 'package_id_mask' was not declared. Should it be static?

vim +/package_id_mask +841 drivers/base/arch_topology.c

   835	
   836	/*
   837	 * Assuming silicon has a sane package ID decoding method to not have
   838	 * an ID bigger than 2047
   839	 */
   840	#define MAX_PACKAGE_ID	2047
 > 841	DECLARE_BITMAP(package_id_mask, MAX_PACKAGE_ID + 1);
   842	

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki