CHAPTER 07
7. affinity, CPU power와 interrupt latency 상한을 검증한다
route 변경, CPU hotplug, idle state, redistributor sleep과 wake, priority masking 구간을 latency histogram과 함께 수집합니다. 평균이 아니라 가장 긴 지연의 원인을 실행 context까지 찾습니다.
affinity migration
old target quiesce, route write와 new target 활성화 사이에 loss/duplicate가 없어야 합니다.
idle wake
CPU 저전력 상태에서 redistributor와 CPU interface가 interrupt wake를 보존해야 합니다.
mask latency
local_irq_disable, priority mask, hard IRQ nesting과 handler critical section이 latency 상한에 기여합니다.
storm control
장치 mask와 GIC disable, source clear 순서를 구분해 다른 CPU로 storm이 이동하지 않게 합니다.
레지스터·번호·소유권 대조
| 항목 | 소유자 | 값의 의미 | 정상 증거 | 오류 해석 |
|---|---|---|---|---|
| IROUTER | GICD | 현재 target affinity | online CPU와 일치 | offline target |
| GICR_WAKER | GICR | CPU redistributor sleep | idle/hotplug 상태와 일치 | wake handshake |
| ICC_PMR/RPR | CPU interface | mask와 running priority | 지연 시점 해석 가능 | priority inversion |
| DAIF | CPU | IRQ mask 상태 | critical section과 trace 일치 | 긴 local IRQ disable |
| irq affinity/count | Linux | target CPU와 delivery count | migration 후 새 CPU만 증가 | stale route |
실패 경계 판정
| 증상 | 직전 통과 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| affinity 이동 중 1개 손실 | 평상시 정상 | route update/active state | 고정 rate sequence로 반복 | migration race |
| deep idle에서만 지연 | idle off 정상 | WAKER/CPU wake latency | idle state별 histogram | power 경계 |
| 특정 CPU만 긴 tail | route 정상 | DAIF/PMR/softirq load | CPU별 irqsoff trace | local masking |
| storm이 CPU를 바꾸며 지속 | route 변경 동작 | device level source clear | device mask 후 GIC 상태 비교 | 장치 원인 |
| hotplug 후 IRQ 사라짐 | CPU online 성공 | route migration/GICR restore | offline 전후 ledger | hotplug lifecycle |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | hardware timestamp 가능한 source로 고정 주기 interrupt를 만듭니다. | 발생/entry timestamp | 지연 측정 |
| 2 | affinity, idle state, load를 직교 행렬로 반복합니다. | 조건별 max/p99 | 민감 축 확인 |
| 3 | 최장 지연 구간의 DAIF/PMR/WAKER와 irqsoff trace를 맞춥니다. | 원인 구간 | 상한 설명 |
| 4 | CPU hotplug 중 sequence count를 검증합니다. | loss/duplicate 0 | migration 완료 |
주의측정용 printk는 interrupt latency를 크게 바꿉니다. trace buffer와 hardware timestamp를 사용하고 출력은 시험 후에 합니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.
Arm GICv3/v4 overview
GICD, GICR, CPU interface, interrupt state와 routing
Linux GICv3 driver
GIC 초기화, irqdomain, handle_irq와 affinity
Linux GICv3 ITS driver
LPI와 MSI DeviceID/EventID translation
Linux IRQ domain
firmware hwirq와 Linux virq mapping