← PCIe 상세 목차DUJINLABS.COM

Hardware · PCIe detailed manual 09 · Linux v6.18.37

9. 오류 복구와 teardown을 역순 수명으로 검증한다

PCIe는 probe 성공보다 remove, reset, suspend/resume와 AER recovery에서 resource lifetime 문제가 더 잘 드러납니다. device가 새 DMA/MSI를 만들지 않는다는 증거를 얻은 뒤 mapping과 vector를 반환해야 합니다.

상세 표
3
검증 행
26
절차
4 checkpoints
기준
PCIe · Linux v6.18.37

CHAPTER 09

9. 오류 복구와 teardown을 역순 수명으로 검증한다

PCIe는 probe 성공보다 remove, reset, suspend/resume와 AER recovery에서 resource lifetime 문제가 더 잘 드러납니다. device가 새 DMA/MSI를 만들지 않는다는 증거를 얻은 뒤 mapping과 vector를 반환해야 합니다.

driver teardown의 권장 역순

순서행동완료 증거먼저 해제하면 생기는 문제
1upper layer에서 새 I/O 차단queue submit count 고정새 request가 teardown 중 유입
2device queue/engine stopidle/status와 producer 정지free memory로 DMA 지속
3PCI bus master disable 필요 여부새 Memory TLP 없음late DMA
4interrupt maskdevice vector generation 중지IRQ storm
5synchronize_irq진행 중 handler 종료handler가 freed ring 접근
6free_irq/vectorirqdomain mapping 반환stale virq
7DMA unmap/freeIOMMU mapping 제거device가 unmapped IOVA 접근
8BAR unmap/releaseMMIO 접근자 없음worker가 unmapped BAR 접근
9device disable/power downCommand/D-state/reset순서 역전으로 register 접근 실패

DWC host init 오류 경로

실패 지점정리 label/행동반드시 반환할 자원
host resource/initerr_free_ecamECAM mapping
MSI initerr_deinit_hostplatform host state
preset/ECAM iATUerr_free_msiinternal MSI domain
eDMA detect/setup_rcerr_remove_edmaeDMA resources
pci_host_probeerr_stop_linklink, eDMA, MSI, host init, ECAM
normal deinitdw_pcie_host_deinitdebugfs, root bus, link, eDMA, MSI, platform state, ECAM

runtime failure에서 보존할 snapshot

그룹필수 값이유
LinkLNKSTA, LTSSM, current speed/widthlink loss와 transaction 오류 분리
AERUE/CE/Root status와 source IDfirst error source 보존
iATUactive region raw dumprecovery가 reprogram하기 전 상태
PCI headerCommand, BAR, bridge windowsdecode/master/resource 변경 확인
DMA/IOMMUqueue index, descriptor, RID/IOVA faultlate/stale DMA 확인
MSImessage, mask/status, virq countcompletion과 interrupt 경계
PowerD-state, ASPM/L1SS, clocks/resetsruntime PM 복귀 문제
그림 1. 9. 오류 복구와 teardown을 역순 수명으로 검증한다의 실행 순서왼쪽에서 오른쪽으로 실제 소유권과 관찰 지점이 이동합니다.
01 새 I/O 차단
02 device idle
03 DMA stop 확인
04 IRQ mask
05 synchronize_irq
06 vector 해제
07 DMA mapping 해제
08 BAR 해제
09 link/power down

실제 검증 절차

순서실행남길 증거판정 목적
1unbind/bind 100회에서 IOVA, vector, resource owner 수를 기록합니다.누적 증가 없음leak와 stale mapping 탐지
2I/O 중 hot reset/AER recovery를 반복합니다.queue abort와 재초기화가 deterministicerror unwind race 확인
3suspend/resume 후 이전 DMA address/vector가 재사용되는지 추적합니다.새 lifetime과 old lifetime 분리stale device state 발견
4late DMA를 IOMMU fault와 poison pattern으로 감시합니다.free 뒤 write 없음completion log만 믿지 않고 실제 정지 증명

주의IRQ count가 더 이상 증가하지 않는 것만으로 DMA engine이 멈췄다고 판단하지 않습니다. MSI가 mask된 채 posted Memory Write가 계속될 수 있습니다.

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

공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.