CHAPTER 08
8. DMA 오류 복구, PTP와 teardown 순서를 끝까지 검증한다
fatal bus error, TX timeout, ring reset, timestamp pending, close, unbind와 suspend에서 새 work 차단, IRQ/NAPI quiesce, DMA stop, mapping 해제의 역순 계약을 확인합니다.
복구 범위
channel만 재시작할지 MAC/DMA 전체 reset할지에 따라 다른 queue와 PTP clock 영향이 달라집니다.
quiesce
새 xmit과 RX refill을 막고 IRQ를 disable한 뒤 NAPI와 work를 동기화해야 descriptor를 안전하게 해제할 수 있습니다.
PTP
timestamp descriptor와 skb 대기 queue, PHC register lifetime이 일반 completion보다 길 수 있습니다.
resume
ring memory가 유지돼도 controller context와 tail pointer가 유실될 수 있습니다. restore 순서를 cold open과 비교합니다.
레지스터와 관측값을 함께 읽는 표
| 항목 | 소유 블록 | 설정 또는 의미 | 정상 증거 | 실패 해석 |
|---|---|---|---|---|
| DMA fatal bus status | DMA channel | read/write/descriptor/data fault | 정상 0, 오류 시 주소와 함께 기록 | AXI/IOMMU/mapping |
| channel process state | DMA channel | stopped/suspended/running | stop 요청 뒤 제한시간 내 stopped | outstanding transaction |
| MAC/DMA reset | global DMA | software reset self-clear | clock 존재 시 완료 | clock/reset domain 정지 |
| PTP timestamp status | MAC timestamp | Tx/Rx pending/overflow | 요청 packet과 대응 | timestamp queue lifetime |
| IRQ/NAPI state | driver/net core | disabled와 synchronize 완료 | free 전 callback 0 | use-after-free |
| mapping/page count | DMA API/page_pool | inflight buffer | teardown 후 0 또는 의도된 pool | leak/stale DMA |
증상에서 첫 실패 경계를 찾는 표
| 관측 증상 | 직전 통과 증거 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| TX timeout 후 영구 정지 | timeout 검출 | recovery가 tail/base를 재설정했는지 | reset 전후 register diff | 복구 초기화 누락 |
| 복구 중 다른 queue 손실 | 한 channel만 fault | reset 범위와 shared block | queue별 sequence 비교 | 전역 reset 영향 |
| unbind에서 crash | traffic 중 unbind | NAPI/work/IRQ synchronize 순서 | KASAN/lockdep trace | object lifetime |
| suspend/resume 후 DMA fault | resume clock/link 정상 | ring base/IOMMU restore | cold open과 resume snapshot diff | context restore |
| PTP skb leak | 일반 Tx completion 정상 | timestamp pending timeout | timestamp request/complete ledger | 추가 lifetime |
| 반복 open/close 메모리 증가 | 기능은 매번 성공 | page_pool/ring/work allocation | 1000 cycle slab/page diff | resource leak |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | 의도적으로 잘못된 DMA 또는 timeout을 주입해 recovery event를 기록합니다. | fault→quiesce→restart 순서 | 실제 복구 경로 검증 |
| 2 | traffic 중 unbind/open-close를 반복하며 callback과 free를 trace합니다. | free 뒤 접근 0 | 수명 검증 |
| 3 | suspend 전후 모든 base/tail/mask와 PHY link를 diff합니다. | 복원 누락 register | resume 경계 확인 |
| 4 | PTP on/off에서 pending skb와 timestamp overflow를 비교합니다. | 추가 queue가 정상 drain | timestamp lifetime 검증 |
주의DMA reset은 descriptor ownership을 자동으로 Linux에 돌려준다는 뜻이 아닙니다. outstanding mapping과 skb를 driver가 일관되게 회수해야 합니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 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