요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
System-wide CPU mask
cputopology.rst:53-101`kernel_max`, `offline`, `online`, `possible`, `present`의 source mask와 `NR_CPUS`, `possible_cpus` 예를 설명합니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
===========================================
How CPU topology info is exported via sysfs
===========================================
CPU topology info is exported via sysfs. Items (attributes) are similar
to /proc/cpuinfo output of some architectures. They reside in
/sys/devices/system/cpu/cpuX/topology/. Please refer to the ABI file:
Documentation/ABI/stable/sysfs-devices-system-cpu.
Architecture-neutral, drivers/base/topology.c, exports these attributes.
However the die, cluster, book, and drawer hierarchy related sysfs files will
only be created if an architecture provides the related macros as described
below.
For an architecture to support this feature, it must define some of
these macros in include/asm-XXX/topology.h::
#define topology_physical_package_id(cpu)
#define topology_die_id(cpu)
#define topology_cluster_id(cpu)
#define topology_core_id(cpu)
#define topology_book_id(cpu)
#define topology_drawer_id(cpu)
#define topology_sibling_cpumask(cpu)
#define topology_core_cpumask(cpu)
#define topology_cluster_cpumask(cpu)
#define topology_die_cpumask(cpu)
#define topology_book_cpumask(cpu)
#define topology_drawer_cpumask(cpu)
The type of ``**_id macros`` is int.
The type of ``**_cpumask macros`` is ``(const) struct cpumask *``. The latter
correspond with appropriate ``**_siblings`` sysfs attributes (except for
topology_sibling_cpumask() which corresponds with thread_siblings).
To be consistent on all architectures, include/linux/topology.h
provides default definitions for any of the above macros that are
not defined by include/asm-XXX/topology.h:
1) topology_physical_package_id: -1
2) topology_die_id: -1
3) topology_cluster_id: -1
4) topology_core_id: 0
5) topology_book_id: -1
6) topology_drawer_id: -1
7) topology_sibling_cpumask: just the given CPU
8) topology_core_cpumask: just the given CPU
9) topology_cluster_cpumask: just the given CPU
10) topology_die_cpumask: just the given CPU
11) topology_book_cpumask: just the given CPU
12) topology_drawer_cpumask: just the given CPU
Additionally, CPU topology information is provided under
/sys/devices/system/cpu and includes these files. The internal
source for the output is in brackets ("[]").
=========== ==========================================================
kernel_max: the maximum CPU index allowed by the kernel configuration.
[NR_CPUS-1]
offline: CPUs that are not online because they have been
HOTPLUGGED off or exceed the limit of CPUs allowed by the
kernel configuration (kernel_max above).
[~cpu_online_mask + cpus >= NR_CPUS]
online: CPUs that are online and being scheduled [cpu_online_mask]
possible: CPUs that have been allocated resources and can be
brought online if they are present. [cpu_possible_mask]
present: CPUs that have been identified as being present in the
system. [cpu_present_mask]
=========== ==========================================================
The format for the above output is compatible with cpulist_parse()
[see <linux/cpumask.h>]. Some examples follow.
In this example, there are 64 CPUs in the system but cpus 32-63 exceed
the kernel max which is limited to 0..31 by the NR_CPUS config option
being 32. Note also that CPUs 2 and 4-31 are not online but could be
brought online as they are both present and possible::
kernel_max: 31
offline: 2,4-31,32-63
online: 0-1,3
possible: 0-31
present: 0-31
In this example, the NR_CPUS config option is 128, but the kernel was
started with possible_cpus=144. There are 4 CPUs in the system and cpu2
was manually taken offline (and is the only CPU that can be brought
online.)::
kernel_max: 127
offline: 2,4-127,128-143
online: 0-1,3
possible: 0-127
present: 0-3
See Documentation/core-api/cpu_hotplug.rst for the possible_cpus=NUM
kernel start parameter as well as more information on the various cpumasks.
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
Sysfs topology export
1-14CPU topology 정보는 sysfs로 export됩니다. Attribute는 일부 architecture의 `/proc/cpuinfo` 출력과 비슷하며 `/sys/devices/system/cpu/cpuX/topology/`에 있습니다. ABI 정의는 `Documentation/ABI/stable/sysfs-devices-system-cpu`를 참조하십시오.
Architecture-neutral code인 `drivers/base/topology.c`가 이 attribute를 export합니다. 다만 die, cluster, book, drawer hierarchy 관련 sysfs file은 architecture가 아래의 대응 macro를 제공할 때만 생성됩니다.
Architecture macro가 generic topology code를 거쳐 CPU별 sysfs attribute가 됩니다.
Architecture topology macro 계약
15-35Architecture가 이 기능을 지원하려면 `include/asm-XXX/topology.h`에 다음 macro 중 일부를 정의해야 합니다.
#define topology_physical_package_id(cpu)
#define topology_die_id(cpu)
#define topology_cluster_id(cpu)
#define topology_core_id(cpu)
#define topology_book_id(cpu)
#define topology_drawer_id(cpu)
#define topology_sibling_cpumask(cpu)
#define topology_core_cpumask(cpu)
#define topology_cluster_cpumask(cpu)
#define topology_die_cpumask(cpu)
#define topology_book_cpumask(cpu)
#define topology_drawer_cpumask(cpu)
`**_id` macro의 type은 `int`입니다. `**_cpumask` macro의 type은 `(const) struct cpumask *`이며 대응하는 `**_siblings` sysfs attribute와 연결됩니다. 예외적으로 `topology_sibling_cpumask()`는 `thread_siblings`에 대응합니다.
Architecture-neutral default
36-52모든 architecture에서 일관된 동작을 제공하기 위해 `include/asm-XXX/topology.h`가 정의하지 않은 macro에는 `include/linux/topology.h`가 기본값을 제공합니다.
ID는 hierarchy 부재를 나타내고 cpumask는 해당 CPU 하나만 포함합니다.
System-wide CPU mask file
53-76CPU topology 정보는 `/sys/devices/system/cpu` 아래의 system-wide file로도 제공됩니다. 원문의 대괄호는 출력의 internal source를 나타냅니다.
Source의 reStructuredText 표를 field, 의미, kernel source로 보존했습니다.
위 출력 형식은 `cpulist_parse()`와 호환됩니다. 자세한 선언은 `<linux/cpumask.h>`를 참조하십시오.
NR_CPUS와 possible_cpus 예
77-101첫 번째 예는 system에 CPU 64개가 있지만 `NR_CPUS=32`라 kernel max가 0..31로 제한된 경우입니다. CPU 32-63은 kernel max를 넘고, CPU 2와 4-31은 현재 online이 아니지만 present이면서 possible이므로 online으로 전환할 수 있습니다.
kernel_max: 31
offline: 2,4-31,32-63
online: 0-1,3
possible: 0-31
present: 0-31
두 번째 예는 `NR_CPUS=128`이지만 kernel을 `possible_cpus=144`로 시작한 경우입니다. System에는 CPU 4개가 있고 CPU2는 수동으로 offline됐으며, 실제로 다시 online으로 전환할 수 있는 유일한 CPU입니다.
kernel_max: 127
offline: 2,4-127,128-143
online: 0-1,3
possible: 0-127
present: 0-3
Configured CPU limit, boot parameter와 실제 hardware presence의 차이를 보여 줍니다.
`possible_cpus=NUM` kernel start parameter와 여러 cpumask에 관한 자세한 내용은 `Documentation/core-api/cpu_hotplug.rst`를 참조하십시오.
Architecture macro와 CPU별 topology
cputopology.rst:1-52`drivers/base/topology.c`, architecture macro type과 generic default를 통해 package, die, cluster, core, book, drawer hierarchy를 export합니다.