CHAPTER 04
4. ndo_start_xmit에서 TX completion과 BQL까지 추적한다
skb queue 선택, descriptor 수 계산, DMA mapping, checksum/TSO/context 설정, OWN publish, tail write, completion reclaim과 netdev queue wake를 packet ID 하나로 연결합니다.
queue selection
skb queue_mapping이 DMA channel/MTL queue로 어떻게 바뀌는지 확인합니다. traffic class와 실제 hardware queue 번호가 다를 수 있습니다.
stop/wake
남은 descriptor가 부족하면 subqueue를 멈추고 completion reclaim 뒤 깨웁니다. stop 전 재검사와 memory ordering이 중요합니다.
BQL
전송한 byte와 completion byte를 accounting해 software queue를 제한합니다. descriptor free count와 별도 제어입니다.
TX timestamp
hardware timestamp 요청 packet은 completion과 timestamp availability 수명이 추가됩니다.
레지스터와 관측값을 함께 읽는 표
| 항목 | 소유 블록 | 설정 또는 의미 | 정상 증거 | 실패 해석 |
|---|---|---|---|---|
| TX ring base/length | DMA channel | queue별 descriptor ring | software queue와 일치 | channel mapping 오류 |
| TX tail/current | DMA channel | producer 공개와 fetch 위치 | traffic에 따라 진행 | doorbell/descriptor fetch 정지 |
| TX descriptor status | descriptor | OWN, error, last segment | completion 후 OWN clear/error 0 | underflow/jabber/bus error |
| MTL TX queue status | MTL | FIFO fill, read/write state | traffic과 함께 변동 | MAC backpressure/underflow |
| DMA interrupt | DMA channel | TX complete/abnormal | coalescing 정책대로 발생 | mask 또는 status ack |
| BQL counters | netdev core | sent/completed bytes | 장기적으로 수렴 | completion accounting 누락 |
증상에서 첫 실패 경계를 찾는 표
| 관측 증상 | 직전 통과 증거 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| xmit 호출, tail 불변 | qdisc dequeue 성공 | mapping/descriptor 부족 | xmit return과 ring index trace | driver enqueue 경계 |
| tail 진행, current 고정 | descriptor OWN set | DMA fetch/base/bus | DMA status와 IOMMU fault | device fetch 경계 |
| current 진행, wire 없음 | DMA가 descriptor 소비 | MTL/MAC Tx enable | FIFO status와 MAC counters | DMA-MAC 경계 |
| wire 전송, completion 없음 | 상대 capture 성공 | TX status/IRQ mask | poll reclaim 강제와 status read | completion 전달 경계 |
| queue 영구 stop | descriptor가 실제 free | wake/BQL accounting | stop/wake trace | queue lifecycle |
| TSO에서만 packet 오류 | normal skb 성공 | context descriptor/MSS/checksum | TSO off 비교 | offload descriptor |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | skb sequence와 queue_mapping, descriptor start/count를 기록합니다. | packet→ring ledger | queue 경로 고정 |
| 2 | tail/current/MTL status를 TX 직전과 timeout에서 비교합니다. | 처음 멈춘 block | DMA와 MAC 분리 |
| 3 | completion에서 unmap, skb free, BQL complete 순서를 trace합니다. | 동일 packet ID | 수명/회계 검증 |
| 4 | linear, fragmented, checksum, TSO packet을 따로 시험합니다. | 형식별 pass/fail | descriptor path 격리 |
주의`NETDEV_TX_BUSY`를 반환한 경로에서 skb ownership과 mapping을 이미 소비했는지 반드시 확인합니다. 잘못된 ownership은 재전송 시 이중 해제로 이어집니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 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