CHAPTER 05
5. RX descriptor에서 page_pool과 skb까지 buffer 수명을 추적한다
driver가 빈 buffer를 map해 RX ring에 공급하고, device가 frame을 기록한 뒤 NAPI가 length/status를 검사해 skb로 넘기고 새 buffer로 refill하는 과정을 분리합니다.
refill 선행
RX는 packet이 오기 전에 충분한 buffer가 device ownership으로 준비돼야 합니다. refill 실패는 이후 DMA overflow로 나타날 수 있습니다.
multi-buffer frame
jumbo 또는 작은 buffer 설정에서는 한 frame이 여러 descriptor를 차지합니다. first/last와 누적 length가 필요합니다.
page_pool
page recycling과 DMA mapping 비용을 줄이지만 page가 skb, XDP 또는 ring 중 누구에게 있는지 lifetime을 엄격히 관리합니다.
metadata
checksum, VLAN, RSS hash, timestamp와 error status를 skb에 옮길 때 descriptor format에 맞는 field를 사용합니다.
레지스터와 관측값을 함께 읽는 표
| 항목 | 소유 블록 | 설정 또는 의미 | 정상 증거 | 실패 해석 |
|---|---|---|---|---|
| RX ring base/length | DMA channel | buffer 공급 ring | 모든 entry에 유효 DMA address | 빈/잘못된 ring |
| RX tail/current | DMA channel | refill 공개와 consume 위치 | 부하에서 함께 진행 | tail update 누락 |
| RX descriptor status | descriptor | OWN, first/last, length, error | CPU 회수 시 일관된 frame | partial/multi-buffer 조립 |
| DMA missed/overflow | DMA channel | buffer 부족/FIFO overflow | 정상 부하에서 증가 없음 | refill/NAPI/MTL 병목 |
| MAC RX counters | MAC | good/error/filter frame | descriptor count와 대응 | DMA 전 drop 분리 |
| page_pool stats | page_pool/driver | alloc/recycle/release | steady state에서 재활용 | page leak 또는 premature recycle |
증상에서 첫 실패 경계를 찾는 표
| 관측 증상 | 직전 통과 증거 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| MAC good, descriptor 없음 | MAC filter 통과 | RX enable/ring/tail | DMA channel status와 base readback | MAC-DMA 경계 |
| 처음만 받고 멈춤 | 초기 ring 정상 | refill과 tail update | free entry 수 trace | buffer 공급 경계 |
| jumbo만 drop | MTU frame 정상 | multi-descriptor와 buffer size | MTU/BUF_SIZE 조합 sweep | frame 조립 |
| checksum error 표시만 이상 | payload capture 정상 | descriptor checksum field decode | RX checksum off 비교 | metadata 해석 |
| page leak | packet 전달 정상 | skb release/page_pool recycle | 장시간 page count와 ref trace | buffer lifetime |
| non-coherent에서 payload 깨짐 | length/status 정상 | DMA sync for CPU | cache maintenance instrumentation | cache ownership |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | ring 초기화 후 모든 buffer DMA address와 OWN을 검사합니다. | refill completeness | 입력 조건 확인 |
| 2 | frame sequence와 descriptor first/last/length를 연결합니다. | frame 조립표 | multi-buffer 검증 |
| 3 | MAC good, DMA complete, netdev RX를 같은 packet 수로 비교합니다. | counter ladder | drop 경계 찾기 |
| 4 | 장시간 부하 후 page_pool inflight/recycle과 memory 사용량을 확인합니다. | steady-state 수명 | leak 검출 |
주의RX descriptor가 CPU ownership으로 돌아왔어도 streaming DMA buffer는 CPU 접근 전 sync가 필요할 수 있습니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 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