← Ethernet 상세 목차DUJINLABS.COM

Hardware · Ethernet detailed manual 03 · Linux v6.18.37

3. ring ownership과 memory barrier를 doorbell 순서로 증명한다

CPU가 buffer payload와 descriptor를 쓴 뒤 device에 보이는 순서, device completion 뒤 CPU가 status와 payload를 읽는 순서를 분리합니다. `writel()` 하나가 모든 coherent/streaming DMA 순서를 자동 보장한다고 가정하지 않습니다.

상세 표
2
검증 행
16
절차
4 checkpoints
기준
Synopsys DWMAC · Linux NAPI · Linux v6.18.37

CHAPTER 03

3. ring ownership과 memory barrier를 doorbell 순서로 증명한다

CPU가 buffer payload와 descriptor를 쓴 뒤 device에 보이는 순서, device completion 뒤 CPU가 status와 payload를 읽는 순서를 분리합니다. `writel()` 하나가 모든 coherent/streaming DMA 순서를 자동 보장한다고 가정하지 않습니다.

publish 순서

payload와 descriptor field가 먼저 보이고 OWN/tail이 마지막에 보여야 device가 완성되지 않은 entry를 읽지 않습니다.

consume 순서

CPU는 OWN 또는 completion을 확인한 뒤 적절한 DMA read barrier와 sync를 거쳐 status/payload를 읽습니다.

coherent의 범위

coherent allocation은 cache coherence를 제공해도 device register doorbell과 descriptor store 사이 ordering까지 모든 architecture에서 대신하지 않습니다.

tail semantics

DWMAC 세대에 따라 tail pointer가 마지막 유효 descriptor 주소 또는 poll demand 역할을 합니다. 현재 ops의 구현을 기준으로 봅니다.

레지스터와 관측값을 함께 읽는 표

항목소유 블록설정 또는 의미정상 증거실패 해석
OWN/statusdescriptorpublish/consume synchronizationfield 준비 뒤 OWN 설정OWN을 먼저 세우면 부분 descriptor
TX/RX tail pointerDMA channel새 work 공개barrier 뒤 writedoorbell이 data보다 먼저 도착
current descriptorDMA channelhardware fetch 위치valid ring 범위 안stale base 또는 wrap 오류
DMA statusDMA channelstopped/suspended/fatal bus정상 running/interruptdescriptor unavailable 또는 bus fault
IOMMU faultSMMU/IOMMUrequester IOVA 접근 실패fault 0unmapped/stale mapping
cache maintenanceDMA APIstreaming buffer 방향 syncCPU/device 전환마다 맞는 APInon-coherent corruption

증상에서 첫 실패 경계를 찾는 표

관측 증상직전 통과 증거우선 확인반증 시험판정
저부하 정상, SMP 부하 실패주소와 format 정상barrier/ownership orderingCPU pinning과 barrier instrumentationmemory ordering
doorbell 후 old descriptor 처리tail write 보임descriptor visibilitycoherent/noncoherent 및 dma_wmb 확인publish 경계
RX payload가 이전 packetcompletion status 정상buffer sync/recyclecache flush/invalidate tracestreaming DMA ownership
descriptor unavailable 반복DMA bus 정상producer와 tail 갱신index ledger와 ring dumpsoftware publish 누락
IOMMU fault가 재사용 주소초기 map 성공unmap 후 device accesscompletion 전 unmap 여부 tracelifetime/order
특정 architecture만 실패동일 driver와 deviceimplicit ordering 의존barrier를 명시한 build 비교architecture memory model
그림 1. 3. ring ownership과 memory barrier를 doorbell 순서로 증명한다의 실행 순서왼쪽에서 오른쪽으로 실제 소유권과 관찰 지점이 이동합니다.
01 CPU payload write
02 dma sync
03 descriptor write
04 dma_wmb
05 OWN/tail
06 device fetch
07 completion
08 dma_rmb/sync
09 CPU consume

실제 검증 절차

순서실행남길 증거판정 목적
1descriptor index마다 map, OWN set, tail write, completion 시간을 기록합니다.단조 사건 ledger순서 확인
2IOMMU fault와 DMA channel status를 같은 timestamp로 합칩니다.주소/권한/시점mapping 문제 분리
3non-coherent 환경에서 sync API를 trace합니다.buffer별 ownership 전환cache 계약 검증
4SMP와 ring wrap 부하로 수백만 회 handoff를 반복합니다.stuck/중복/손실 0희박한 ordering 오류 검출

주의debug 목적으로 OWN bit를 강제로 되돌리거나 tail pointer를 임의로 쓰면 원래 race를 파괴합니다. 관측 코드는 read-only로 시작합니다.

공개적으로 다시 확인할 수 있는 자료

공개되지 않은 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 재활성화 계약