요약·해설, 영어 원문, 전체 번역을 구분해 실었습니다. API 이름, 코드 심벌, 소스 경로는 원문 표기를 유지합니다.
1. 요약·해설
원문의 핵심 내용을 정리하고 커널 프로그래밍에 필요한 설명을 덧붙였습니다. 아래의 전체 번역과는 별도로 작성한 해설입니다.
System-wide CPU mask
cputopology.rst:53-101`kernel_max`, `offline`, `online`, `possible`, `present`의 source mask와 `NR_CPUS`, `possible_cpus` 예시를 설명합니다.
Topology와 CPU 상태 마스크
cputopology.rst:53-101Topology는 CPU의 package·die·cluster·core 등 하드웨어 관계를 나타내며, 지금 사용할 수 있는 CPU 집합과 같지 않습니다. Linux v6.18.37의 cpu_possible_mask는 이번 부팅에서 존재할 수 있는 CPU ID 집합, cpu_present_mask는 현재 존재하는 CPU 집합, cpu_online_mask는 스케줄러에 사용 가능한 CPU 집합입니다. cpu_active_mask는 작업 이동(migration)에 사용 가능한 CPU를 나타냅니다. CPU hotplug가 켜진 구성에서는 online과 active를 같은 집합이라고 가정하지 말고 전환 단계와 동기화 조건을 함께 확인해야 합니다.
DT와 ACPI의 열거 경로
cputopology.rst:53-101arm64의 smp_init_cpus()는 acpi_disabled 값에 따라 Device Tree의 CPU 노드를 읽는 경로와 ACPI 경로 중 하나를 선택합니다. 따라서 CPU 정보가 항상 Device Tree에서 온다고 일반화하지 않습니다. 논리 CPU 번호와 MPIDR의 대응을 만든 사실도 해당 CPU가 online 또는 migration 가능한 상태가 되었다는 뜻은 아닙니다. 실제 동작을 확인할 때는 부팅 구성과 CPU 상태가 변하는 시점을 구분해 기록합니다.
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. 한국어 전문 번역
영어 원문의 문단 순서와 의미에 맞춰 전체 내용을 번역했습니다. 코드, 함수명, 코드 심벌, 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합니다.