CHAPTER 06
6. DMA channel interrupt와 moderation을 raw status부터 읽는다
MAC common interrupt, DMA channel normal/abnormal interrupt, MTL과 safety status를 분리하고 ISR에서 무엇을 ack·mask한 뒤 어느 NAPI instance를 schedule하는지 queue별로 추적합니다.
raw와 masked
raw status가 set돼도 mask가 꺼져 CPU IRQ는 오지 않을 수 있습니다. 반대로 shared line은 다른 source 때문에 handler가 실행될 수 있습니다.
ack semantics
W1C status는 읽은 snapshot을 기준으로 필요한 bit만 clear합니다. read-modify-write가 다른 event를 잃게 만들 수 있습니다.
moderation
frame count/timer, RX watchdog와 NAPI를 조합해 IRQ rate를 줄입니다. latency와 throughput tradeoff를 숫자로 봅니다.
queue별 IRQ
여러 channel이 vector를 공유하거나 각각 vector를 가질 수 있습니다. `/proc/interrupts` 한 줄을 queue 하나로 단정하지 않습니다.
레지스터와 관측값을 함께 읽는 표
| 항목 | 소유 블록 | 설정 또는 의미 | 정상 증거 | 실패 해석 |
|---|---|---|---|---|
| DMA_CH_STATUS | DMA channel | normal/abnormal summary와 source | traffic과 source bit 일치 | stale/W1C 처리 오류 |
| DMA_CH_INT_EN | DMA channel | RX/TX/error mask | 운용 policy와 일치 | status 있으나 IRQ 없음 |
| MAC_INT_STATUS/EN | MAC | PMT, LPI, timestamp, PCS | DMA와 별도 해석 | 공통 IRQ source 혼동 |
| RX watchdog/coalescing | DMA/MAC | timer/count threshold | IRQ/packet 비율이 설정과 대응 | 너무 큰 latency 또는 IRQ storm |
| IRQ controller mapping | GIC/APIC/PLIC | hwirq→virq→CPU | affinity와 counter 증가 | controller 전달 경계 |
| NAPI state | Linux | scheduled/disabled와 IRQ mask | schedule 뒤 mask, complete 뒤 unmask | lost interrupt race |
증상에서 첫 실패 경계를 찾는 표
| 관측 증상 | 직전 통과 증거 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| DMA status 있음, CPU IRQ 0 | device completion 확인 | mask와 interrupt controller route | INT_EN과 hwirq pending 비교 | device mask 또는 controller |
| IRQ storm, packet 적음 | IRQ route 정상 | W1C ack와 abnormal source | status snapshot/clear trace | ack 또는 persistent fault |
| IRQ 1회 후 정지 | 첫 NAPI 실행 | complete/unmask 순서 | IRQ mask와 ring pending 동시 capture | lost interrupt race |
| latency spike | packet loss 없음 | coalescing timer/budget | moderation 0과 단계별 비교 | 정책 지연 |
| 한 queue만 IRQ 없음 | 다른 channel 정상 | queue-vector mapping | channel status와 vector affinity 대조 | per-channel 설정 |
| shared IRQ에서 오인 | handler 실행 확인 | 실제 status source | 각 block raw status 저장 | 다른 source가 IRQ를 발생 |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | queue별 raw status, enable과 Linux IRQ 번호 표를 만듭니다. | channel→hwirq→virq ledger | 번호 공간 연결 |
| 2 | ISR 진입 때 raw/masked/ack 값을 한 번에 기록합니다. | W1C 전 snapshot | source 보존 |
| 3 | packet rate를 올리며 IRQ/packet 비율과 p99 latency를 측정합니다. | moderation curve | 정책 조정 근거 |
| 4 | NAPI complete 직전 ring pending과 IRQ mask를 저장합니다. | race window 증거 | lost event 검증 |
주의W1C status를 디버거로 반복 읽고 쓰면 실제 handler의 ack 순서를 바꿀 수 있습니다. 안전한 snapshot helper를 사용합니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.
Linux stmmac driver
Synopsys GMAC/GMAC4/XGMAC, descriptor, NAPI, PTP와 offload 공개 설명
Linux NAPI
schedule, poll budget, completion과 IRQ 재활성화 계약
Linux v6.18.37 stmmac_main.c
open, xmit, RX, ISR와 NAPI poll 원본
Linux v6.18.37 dwmac4_dma.c
DMA channel, ring length, tail pointer와 interrupt enable
Linux v6.18.37 net/core/dev.c
NAPI core, NET_RX_SOFTIRQ와 receive stack 진입
Linux DMA API HOWTO
descriptor와 packet buffer의 CPU/device ownership, mapping과 barrier