162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci.. include:: ../disclaimer-zh_CN.rst 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci:Original: Documentation/admin-guide/cputopology.rst 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci:翻译: 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci 唐艺舟 Tang Yizhou <tangyeechou@gmail.com> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci========================== 1162306a36Sopenharmony_ci如何通过sysfs将CPU拓扑导出 1262306a36Sopenharmony_ci========================== 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ciCPU拓扑信息通过sysfs导出。显示的项(属性)和某些架构的/proc/cpuinfo输出相似。它们位于 1562306a36Sopenharmony_ci/sys/devices/system/cpu/cpuX/topology/。请阅读ABI文件: 1662306a36Sopenharmony_ciDocumentation/ABI/stable/sysfs-devices-system-cpu。 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cidrivers/base/topology.c是体系结构中性的,它导出了这些属性。然而,die、cluster、book、 1962306a36Sopenharmony_cidraw这些层次结构相关的文件仅在体系结构提供了下文描述的宏的条件下被创建。 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci对于支持这个特性的体系结构,它必须在include/asm-XXX/topology.h中定义这些宏中的一部分:: 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci #define topology_physical_package_id(cpu) 2462306a36Sopenharmony_ci #define topology_die_id(cpu) 2562306a36Sopenharmony_ci #define topology_cluster_id(cpu) 2662306a36Sopenharmony_ci #define topology_core_id(cpu) 2762306a36Sopenharmony_ci #define topology_book_id(cpu) 2862306a36Sopenharmony_ci #define topology_drawer_id(cpu) 2962306a36Sopenharmony_ci #define topology_sibling_cpumask(cpu) 3062306a36Sopenharmony_ci #define topology_core_cpumask(cpu) 3162306a36Sopenharmony_ci #define topology_cluster_cpumask(cpu) 3262306a36Sopenharmony_ci #define topology_die_cpumask(cpu) 3362306a36Sopenharmony_ci #define topology_book_cpumask(cpu) 3462306a36Sopenharmony_ci #define topology_drawer_cpumask(cpu) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci``**_id macros`` 的类型是int。 3762306a36Sopenharmony_ci``**_cpumask macros`` 的类型是 ``(const) struct cpumask *`` 。后者和恰当的 3862306a36Sopenharmony_ci``**_siblings`` sysfs属性对应(除了topology_sibling_cpumask(),它和thread_siblings 3962306a36Sopenharmony_ci对应)。 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci为了在所有体系结构上保持一致,include/linux/topology.h提供了上述所有宏的默认定义,以防 4262306a36Sopenharmony_ci它们未在include/asm-XXX/topology.h中定义: 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci1) topology_physical_package_id: -1 4562306a36Sopenharmony_ci2) topology_die_id: -1 4662306a36Sopenharmony_ci3) topology_cluster_id: -1 4762306a36Sopenharmony_ci4) topology_core_id: 0 4862306a36Sopenharmony_ci5) topology_book_id: -1 4962306a36Sopenharmony_ci6) topology_drawer_id: -1 5062306a36Sopenharmony_ci7) topology_sibling_cpumask: 仅入参CPU 5162306a36Sopenharmony_ci8) topology_core_cpumask: 仅入参CPU 5262306a36Sopenharmony_ci9) topology_cluster_cpumask: 仅入参CPU 5362306a36Sopenharmony_ci10) topology_die_cpumask: 仅入参CPU 5462306a36Sopenharmony_ci11) topology_book_cpumask: 仅入参CPU 5562306a36Sopenharmony_ci12) topology_drawer_cpumask: 仅入参CPU 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci此外,CPU拓扑信息由/sys/devices/system/cpu提供,包含下述文件。输出对应的内部数据源放在 5862306a36Sopenharmony_ci方括号("[]")中。 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci =========== ================================================================== 6162306a36Sopenharmony_ci kernel_max: 内核配置允许的最大CPU下标值。[NR_CPUS-1] 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci offline: 由于热插拔移除或者超过内核允许的CPU上限(上文描述的kernel_max) 6462306a36Sopenharmony_ci 导致未上线的CPU。[~cpu_online_mask + cpus >= NR_CPUS] 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci online: 在线的CPU,可供调度使用。[cpu_online_mask] 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci possible: 已被分配资源的CPU,如果它们CPU实际存在,可以上线。 6962306a36Sopenharmony_ci [cpu_possible_mask] 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci present: 被系统识别实际存在的CPU。[cpu_present_mask] 7262306a36Sopenharmony_ci =========== ================================================================== 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci上述输出的格式和cpulist_parse()兼容[参见 <linux/cpumask.h>]。下面给些例子。 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci在本例中,系统中有64个CPU,但是CPU 32-63超过了kernel_max值,因为NR_CPUS配置项是32, 7762306a36Sopenharmony_ci取值范围被限制为0..31。此外注意CPU2和4-31未上线,但是可以上线,因为它们同时存在于 7862306a36Sopenharmony_cipresent和possible:: 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci kernel_max: 31 8162306a36Sopenharmony_ci offline: 2,4-31,32-63 8262306a36Sopenharmony_ci online: 0-1,3 8362306a36Sopenharmony_ci possible: 0-31 8462306a36Sopenharmony_ci present: 0-31 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci在本例中,NR_CPUS配置项是128,但内核启动时设置possible_cpus=144。系统中有4个CPU, 8762306a36Sopenharmony_ciCPU2被手动设置下线(也是唯一一个可以上线的CPU):: 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci kernel_max: 127 9062306a36Sopenharmony_ci offline: 2,4-127,128-143 9162306a36Sopenharmony_ci online: 0-1,3 9262306a36Sopenharmony_ci possible: 0-127 9362306a36Sopenharmony_ci present: 0-3 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci阅读Documentation/core-api/cpu_hotplug.rst可了解开机参数possible_cpus=NUM,同时还 9662306a36Sopenharmony_ci可以了解各种cpumask的信息。 97