요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
======================================================
HiSilicon SoC uncore Performance Monitoring Unit (PMU)
======================================================
The HiSilicon SoC chip includes various independent system device PMUs
such as L3 cache (L3C), Hydra Home Agent (HHA) and DDRC. These PMUs are
independent and have hardware logic to gather statistics and performance
information.
The HiSilicon SoC encapsulates multiple CPU and IO dies. Each CPU cluster
(CCL) is made up of 4 cpu cores sharing one L3 cache; each CPU die is
called Super CPU cluster (SCCL) and is made up of 6 CCLs. Each SCCL has
two HHAs (0 - 1) and four DDRCs (0 - 3), respectively.
HiSilicon SoC uncore PMU driver
-------------------------------
Each device PMU has separate registers for event counting, control and
interrupt, and the PMU driver shall register perf PMU drivers like L3C,
HHA and DDRC etc. The available events and configuration options shall
be described in the sysfs, see::
/sys/bus/event_source/devices/hisi_sccl{X}_<l3c{Y}/hha{Y}/ddrc{Y}>
The "perf list" command shall list the available events from sysfs.
Each L3C, HHA and DDRC is registered as a separate PMU with perf. The PMU
name will appear in event listing as hisi_sccl<sccl-id>_module<index-id>.
where "sccl-id" is the identifier of the SCCL and "index-id" is the index of
module.
e.g. hisi_sccl3_l3c0/rd_hit_cpipe is READ_HIT_CPIPE event of L3C index #0 in
SCCL ID #3.
e.g. hisi_sccl1_hha0/rx_operations is RX_OPERATIONS event of HHA index #0 in
SCCL ID #1.
The driver also provides a "cpumask" sysfs attribute, which shows the CPU core
ID used to count the uncore PMU event. An "associated_cpus" sysfs attribute is
also provided to show the CPUs associated with this PMU. The "cpumask" indicates
the CPUs to open the events, usually as a hint for userspaces tools like perf.
It only contains one associated CPU from the "associated_cpus".
Example usage of perf::
$# perf list
hisi_sccl3_l3c0/rd_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl3_l3c0/wr_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl1_l3c0/rd_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl1_l3c0/wr_hit_cpipe/ [kernel PMU event]
------------------------------------------
$# perf stat -a -e hisi_sccl3_l3c0/rd_hit_cpipe/ sleep 5
$# perf stat -a -e hisi_sccl3_l3c0/config=0x02/ sleep 5
For HiSilicon uncore PMU v2 whose identifier is 0x30, the topology is the same
as PMU v1, but some new functions are added to the hardware.
1. L3C PMU supports filtering by core/thread within the cluster which can be
specified as a bitmap::
$# perf stat -a -e hisi_sccl3_l3c0/config=0x02,tt_core=0x3/ sleep 5
This will only count the operations from core/thread 0 and 1 in this cluster.
User should not use tt_core_deprecated to specify the core/thread filtering.
This option is provided for backward compatiblility and only support 8bit
which may not cover all the core/thread sharing L3C.
2. Tracetag allow the user to chose to count only read, write or atomic
operations via the tt_req parameeter in perf. The default value counts all
operations. tt_req is 3bits, 3'b100 represents read operations, 3'b101
represents write operations, 3'b110 represents atomic store operations and
3'b111 represents atomic non-store operations, other values are reserved::
$# perf stat -a -e hisi_sccl3_l3c0/config=0x02,tt_req=0x4/ sleep 5
This will only count the read operations in this cluster.
3. Datasrc allows the user to check where the data comes from. It is 5 bits.
Some important codes are as follows:
- 5'b00001: comes from L3C in this die;
- 5'b01000: comes from L3C in the cross-die;
- 5'b01001: comes from L3C which is in another socket;
- 5'b01110: comes from the local DDR;
- 5'b01111: comes from the cross-die DDR;
- 5'b10000: comes from cross-socket DDR;
etc, it is mainly helpful to find that the data source is nearest from the CPU
cores. If datasrc_cfg is used in the multi-chips, the datasrc_skt shall be
configured in perf command::
$# perf stat -a -e hisi_sccl3_l3c0/config=0xb9,datasrc_cfg=0xE/,
hisi_sccl3_l3c0/config=0xb9,datasrc_cfg=0xF/ sleep 5
4. Some HiSilicon SoCs encapsulate multiple CPU and IO dies. Each CPU die
contains several Compute Clusters (CCLs). The I/O dies are called Super I/O
clusters (SICL) containing multiple I/O clusters (ICLs). Each CCL/ICL in the
SoC has a unique ID. Each ID is 11bits, include a 6-bit SCCL-ID and 5-bit
CCL/ICL-ID. For I/O die, the ICL-ID is followed by:
- 5'b00000: I/O_MGMT_ICL;
- 5'b00001: Network_ICL;
- 5'b00011: HAC_ICL;
- 5'b10000: PCIe_ICL;
5. uring_channel: UC PMU events 0x47~0x59 supports filtering by tx request
uring channel. It is 2 bits. Some important codes are as follows:
- 2'b11: count the events which sent to the uring_ext (MATA) channel;
- 2'b01: is the same as 2'b11;
- 2'b10: count the events which sent to the uring (non-MATA) channel;
- 2'b00: default value, count the events which sent to both uring and
uring_ext channels;
6. ch: NoC PMU supports filtering the event counts of certain transaction
channel with this option. The current supported channels are as follows:
- 3'b010: Request channel
- 3'b100: Snoop channel
- 3'b110: Response channel
- 3'b111: Data channel
7. tt_en: NoC PMU supports counting only transactions that have tracetag set
if this option is set. See the 2nd list for more information about tracetag.
For HiSilicon uncore PMU v3 whose identifier is 0x40, some uncore PMUs are
further divided into parts for finer granularity of tracing, each part has its
own dedicated PMU, and all such PMUs together cover the monitoring job of events
on particular uncore device. Such PMUs are described in sysfs with name format
slightly changed::
/sys/bus/event_source/devices/hisi_sccl{X}_<l3c{Y}_{Z}/ddrc{Y}_{Z}/noc{Y}_{Z}>
Z is the sub-id, indicating different PMUs for part of hardware device.
Usage of most PMUs with different sub-ids are identical. Specially, L3C PMU
provides ``ext`` option to allow exploration of even finer granual statistics
of L3C PMU. L3C PMU driver uses that as hint of termination when delivering
perf command to hardware:
- ext=0: Default, could be used with event names.
- ext=1 and ext=2: Must be used with event codes, event names are not supported.
An example of perf command could be::
$# perf stat -a -e hisi_sccl0_l3c1_0/rd_spipe/ sleep 5
or::
$# perf stat -a -e hisi_sccl0_l3c1_0/event=0x1,ext=1/ sleep 5
As above, ``hisi_sccl0_l3c1_0`` locates PMU of Super CPU CLuster 0, L3 cache 1
pipe0.
First command locates the first part of L3C since ``ext=0`` is implied by
default. Second command issues the counting on another part of L3C with the
event ``0x1``.
Users could configure IDs to count data come from specific CCL/ICL, by setting
srcid_cmd & srcid_msk, and data desitined for specific CCL/ICL by setting
tgtid_cmd & tgtid_msk. A set bit in srcid_msk/tgtid_msk means the PMU will not
check the bit when matching against the srcid_cmd/tgtid_cmd.
If all of these options are disabled, it can works by the default value that
doesn't distinguish the filter condition and ID information and will return
the total counter values in the PMU counters.
The current driver does not support sampling. So "perf record" is unsupported.
Also attach to a task is unsupported as the events are all uncore.
Note: Please contact the maintainer for a complete list of events supported for
the PMU devices in the SoC and its information if needed.
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
독립 uncore PMU와 SoC topology
1-14HiSilicon SoC chip에는 L3 cache (L3C), Hydra Home Agent (HHA), DDRC처럼 서로 독립적인 system device PMU가 있습니다. 각 PMU는 통계와 성능 정보를 수집하는 자체 hardware logic을 갖습니다.
SoC는 여러 CPU die와 IO die를 포함합니다. 각 CPU cluster (CCL)는 L3 cache 하나를 공유하는 CPU core 4개로 구성되고, Super CPU cluster (SCCL)라고 부르는 CPU die 하나는 CCL 6개로 구성됩니다.
| 구성 요소 | 구조 |
|---|---|
| CCL | 4 CPU core가 L3 cache 하나를 공유하는 CPU cluster |
| SCCL | 6 CCL로 이루어진 CPU die |
| HHA | SCCL마다 2개, index 0-1 |
| DDRC | SCCL마다 4개, index 0-3 |
Perf PMU 등록, CPU affinity, 사용법
15-58각 device PMU에는 event counting, control, interrupt용 register가 따로 있습니다. Driver는 L3C, HHA, DDRC 등을 각각 독립 perf PMU로 등록하고 sysfs에 사용 가능한 event와 configuration option을 설명합니다.
/sys/bus/event_source/devices/hisi_sccl{X}_<l3c{Y}/hha{Y}/ddrc{Y}>
`perf list`는 sysfs에서 event를 읽어 나열합니다. PMU 이름은 `hisi_sccl<sccl-id>_module<index-id>` 형식이며 `sccl-id`는 SCCL 식별자, `index-id`는 module index입니다.
`hisi_sccl3_l3c0/rd_hit_cpipe`는 SCCL ID 3의 L3C index 0에 있는 `READ_HIT_CPIPE` event이고, `hisi_sccl1_hha0/rx_operations`는 SCCL ID 1의 HHA index 0에 있는 `RX_OPERATIONS` event입니다.
| Sysfs 속성 | 역할 |
|---|---|
| `cpumask` | Event를 열 때 사용할 associated CPU 하나 |
| `associated_cpus` | 이 PMU와 연관된 모든 CPU |
`cpumask`는 userspace 도구인 perf가 event를 열 CPU를 고르는 hint이며, `associated_cpus` 중 CPU 하나만 포함합니다.
$# perf list
hisi_sccl3_l3c0/rd_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl3_l3c0/wr_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl1_l3c0/rd_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl1_l3c0/wr_hit_cpipe/ [kernel PMU event]
------------------------------------------
$# perf stat -a -e hisi_sccl3_l3c0/rd_hit_cpipe/ sleep 5
$# perf stat -a -e hisi_sccl3_l3c0/config=0x02/ sleep 5
`perf list`에 나타나는 L3C event alias와 같은 PMU를 system-wide로 세는 두 방식을 구조화했습니다.
PMU v2 core, tracetag, data source filter
59-99`identifier`가 `0x30`인 HiSilicon uncore PMU v2는 PMU v1과 topology는 같지만 hardware 기능이 추가되었습니다.
L3C PMU의 `tt_core` bitmap으로 cluster 안의 core/thread를 고를 수 있습니다. 다음 예제의 `tt_core=0x3`은 core/thread 0과 1에서 온 operation만 셉니다.
$# perf stat -a -e hisi_sccl3_l3c0/config=0x02,tt_core=0x3/ sleep 5
`tt_core_deprecated`는 backward compatibility용이며 8bit만 지원해 L3C를 공유하는 모든 core/thread를 포괄하지 못할 수 있으므로 사용하지 않아야 합니다.
Tracetag의 `tt_req`는 3bits이며 read, write, atomic operation 중 셀 요청 종류를 고릅니다. 기본값은 모든 operation을 셉니다.
| `tt_req` | Operation |
|---|---|
| `3'b100` | Read operations |
| `3'b101` | Write operations |
| `3'b110` | Atomic store operations |
| `3'b111` | Atomic non-store operations |
$# perf stat -a -e hisi_sccl3_l3c0/config=0x02,tt_req=0x4/ sleep 5
`datasrc`는 5 bits로 데이터 출처를 구분하여 CPU core에 가장 가까운 data source를 찾는 데 도움을 줍니다.
| `datasrc` | 데이터 출처 |
|---|---|
| `5'b00001` | 이 die의 L3C |
| `5'b01000` | Cross-die L3C |
| `5'b01001` | 다른 socket의 L3C |
| `5'b01110` | Local DDR |
| `5'b01111` | Cross-die DDR |
| `5'b10000` | Cross-socket DDR |
Multi-chip에서 `datasrc_cfg`를 사용하려면 perf command에 `datasrc_skt`도 설정해야 합니다.
$# perf stat -a -e hisi_sccl3_l3c0/config=0xb9,datasrc_cfg=0xE/,
hisi_sccl3_l3c0/config=0xb9,datasrc_cfg=0xF/ sleep 5
CCL/ICL ID와 channel filter
100-130일부 HiSilicon SoC에는 여러 CPU die와 IO die가 있습니다. CPU die에는 여러 Compute Cluster (CCL)가 있고, Super I/O cluster (SICL)라고 부르는 I/O die에는 여러 I/O cluster (ICL)가 있습니다.
각 CCL/ICL은 6-bit SCCL-ID와 5-bit CCL/ICL-ID를 합친 고유한 11bits ID를 갖습니다. I/O die의 ICL-ID는 다음과 같습니다.
| ICL-ID | I/O cluster |
|---|---|
| `5'b00000` | `I/O_MGMT_ICL` |
| `5'b00001` | `Network_ICL` |
| `5'b00011` | `HAC_ICL` |
| `5'b10000` | `PCIe_ICL` |
`uring_channel`은 UC PMU event `0x47~0x59`가 전송된 tx request uring channel을 2 bits 값으로 거릅니다.
| `uring_channel` | Count 대상 |
|---|---|
| `2'b11` | `uring_ext` (MATA) channel로 전송된 event |
| `2'b01` | `2'b11`과 동일 |
| `2'b10` | `uring` (non-MATA) channel로 전송된 event |
| `2'b00` | 두 channel 모두 count하는 기본값 |
NoC PMU의 `ch` option은 특정 transaction channel의 event count만 선택합니다.
| `ch` | Transaction channel |
|---|---|
| `3'b010` | Request channel |
| `3'b100` | Snoop channel |
| `3'b110` | Response channel |
| `3'b111` | Data channel |
`tt_en`을 설정하면 NoC PMU는 tracetag가 설정된 transaction만 셉니다. Tracetag의 요청 종류는 앞의 두 번째 v2 기능인 `tt_req` 설명을 따릅니다.
Sub-ID, ext, source/target ID filter
131-172`identifier`가 `0x40`인 HiSilicon uncore PMU v3에서는 더 세밀한 tracing을 위해 일부 uncore PMU를 여러 hardware part로 나눕니다. 각 part는 전용 PMU를 가지며, 이 PMU들을 합쳐 특정 uncore device의 event 전체를 감시합니다.
/sys/bus/event_source/devices/hisi_sccl{X}_<l3c{Y}_{Z}/ddrc{Y}_{Z}/noc{Y}_{Z}>
`Z`는 hardware device의 서로 다른 part를 나타내는 sub-ID입니다. 대부분 sub-ID별 PMU 사용법은 같지만 L3C PMU는 더 세밀한 통계를 탐색하도록 `ext` option을 제공합니다.
| `ext` | 사용 규칙 |
|---|---|
| `ext=0` | 기본값; event name 사용 가능 |
| `ext=1` | Event code만 사용 가능 |
| `ext=2` | Event code만 사용 가능 |
Event name을 사용하는 기본 part 예제입니다.
$# perf stat -a -e hisi_sccl0_l3c1_0/rd_spipe/ sleep 5
다른 part에 event code를 전달하는 예제입니다.
$# perf stat -a -e hisi_sccl0_l3c1_0/event=0x1,ext=1/ sleep 5
`hisi_sccl0_l3c1_0`은 Super CPU CLuster 0, L3 cache 1, pipe 0의 PMU를 가리킵니다. 첫 command는 기본 `ext=0`이므로 L3C의 첫 part를 선택하고, 두 번째 command는 `event=0x1,ext=1`로 다른 part에서 event `0x1`을 셉니다.
특정 CCL/ICL에서 온 data는 source ID pair로, 특정 CCL/ICL을 향하는 data는 target ID pair로 거릅니다.
| Option | 역할 |
|---|---|
| `srcid_cmd` | 일치시킬 source CCL/ICL ID |
| `srcid_msk` | Source ID 비교에서 무시할 bit mask |
| `tgtid_cmd` | 일치시킬 destination CCL/ICL ID |
| `tgtid_msk` | Target ID 비교에서 무시할 bit mask |
`srcid_msk` 또는 `tgtid_msk`에서 bit를 1로 설정하면 PMU는 각각 `srcid_cmd` 또는 `tgtid_cmd`와 비교할 때 그 bit를 검사하지 않습니다. 모든 option을 끄면 filter condition과 ID를 구분하지 않는 기본값으로 동작하여 PMU counter의 total counter values를 반환합니다.
Uncore 제약과 event 목록
173-177현재 driver는 sampling을 지원하지 않아 `perf record`를 사용할 수 없습니다. Event가 모두 uncore이므로 task attach도 지원하지 않습니다.
SoC의 PMU device가 지원하는 완전한 event 목록과 추가 정보가 필요하면 maintainer에게 문의해야 합니다.
운영 요약
hisi-pmu.rst:1-177SCCL과 module index로 uncore PMU를 선택하고, v2에서는 core/thread, tracetag, data source, channel을, v3에서는 sub-ID, `ext`, source/target ID를 적용합니다.