CHAPTER 09
9. 오류 복구와 teardown을 역순 수명으로 검증한다
PCIe는 probe 성공보다 remove, reset, suspend/resume와 AER recovery에서 resource lifetime 문제가 더 잘 드러납니다. device가 새 DMA/MSI를 만들지 않는다는 증거를 얻은 뒤 mapping과 vector를 반환해야 합니다.
driver teardown의 권장 역순
| 순서 | 행동 | 완료 증거 | 먼저 해제하면 생기는 문제 |
|---|---|---|---|
| 1 | upper layer에서 새 I/O 차단 | queue submit count 고정 | 새 request가 teardown 중 유입 |
| 2 | device queue/engine stop | idle/status와 producer 정지 | free memory로 DMA 지속 |
| 3 | PCI bus master disable 필요 여부 | 새 Memory TLP 없음 | late DMA |
| 4 | interrupt mask | device vector generation 중지 | IRQ storm |
| 5 | synchronize_irq | 진행 중 handler 종료 | handler가 freed ring 접근 |
| 6 | free_irq/vector | irqdomain mapping 반환 | stale virq |
| 7 | DMA unmap/free | IOMMU mapping 제거 | device가 unmapped IOVA 접근 |
| 8 | BAR unmap/release | MMIO 접근자 없음 | worker가 unmapped BAR 접근 |
| 9 | device disable/power down | Command/D-state/reset | 순서 역전으로 register 접근 실패 |
DWC host init 오류 경로
| 실패 지점 | 정리 label/행동 | 반드시 반환할 자원 |
|---|---|---|
| host resource/init | err_free_ecam | ECAM mapping |
| MSI init | err_deinit_host | platform host state |
| preset/ECAM iATU | err_free_msi | internal MSI domain |
| eDMA detect/setup_rc | err_remove_edma | eDMA resources |
| pci_host_probe | err_stop_link | link, eDMA, MSI, host init, ECAM |
| normal deinit | dw_pcie_host_deinit | debugfs, root bus, link, eDMA, MSI, platform state, ECAM |
runtime failure에서 보존할 snapshot
| 그룹 | 필수 값 | 이유 |
|---|---|---|
| Link | LNKSTA, LTSSM, current speed/width | link loss와 transaction 오류 분리 |
| AER | UE/CE/Root status와 source ID | first error source 보존 |
| iATU | active region raw dump | recovery가 reprogram하기 전 상태 |
| PCI header | Command, BAR, bridge windows | decode/master/resource 변경 확인 |
| DMA/IOMMU | queue index, descriptor, RID/IOVA fault | late/stale DMA 확인 |
| MSI | message, mask/status, virq count | completion과 interrupt 경계 |
| Power | D-state, ASPM/L1SS, clocks/resets | runtime PM 복귀 문제 |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | unbind/bind 100회에서 IOVA, vector, resource owner 수를 기록합니다. | 누적 증가 없음 | leak와 stale mapping 탐지 |
| 2 | I/O 중 hot reset/AER recovery를 반복합니다. | queue abort와 재초기화가 deterministic | error unwind race 확인 |
| 3 | suspend/resume 후 이전 DMA address/vector가 재사용되는지 추적합니다. | 새 lifetime과 old lifetime 분리 | stale device state 발견 |
| 4 | late 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 원본에서 다시 확인할 수 있는 범위만 사용했습니다.
Linux v6.18.37 DWC common source
iATU programming, version/capability와 eDMA detection
Linux v6.18.37 DWC host source
ECAM/CFG access, Root Port setup, MSI irqdomain와 host lifecycle
Linux v6.18.37 PCI probe
Vendor ID read, pci_dev 생성, BAR sizing와 bridge scan
Linux v6.18.37 PCI resource assignment
bridge window와 endpoint BAR resource 배치
Linux DWC Devicetree binding
reg/ranges, iATU window 수, lane/speed와 MSI/IOMMU 연결