Ch 12: Virtualization I — Pass-through·SR-IOV·VFIO·DPDK·SPDK
#한 줄 요약
“PCIe pass-through는 guest VM·userspace process에 물리 device를 직접 owner로 제공하는 메커니즘입니다.” — SR-IOV가 PF 1개를 N개 VF로 분할하는 hardware partition, VFIO가 Linux kernel의 userspace DMA-safe interface, DPDK·SPDK가 그 위에 응용. ACS가 IOMMU 그룹 분리의 핵심, FLR가 device 격리 reset.
Ch 11 IOMMU에서 IOMMU group·ATS·PRI·PASID를 봤습니다. 이 장은 그 토대 위 hardware virtualization을 본격적으로 분해합니다.
#SR-IOV — PF·VF 모델
*PF (Physical Function)*가 *N개 VF (Virtual Function)*를 광고:
| 객체 | 의미 |
|---|---|
| PF | 원본 device. full configuration·VF 관리 |
| VF | 가벼운 가상 instance. 기본 I/O만 가능·VF 설정은 PF로 |
| NumVFs | PF가 활성화한 VF 수 (펌웨어 max 한계 내) |
| VF BAR | template으로 광고, stride로 매핑 (Ch 4) |
활성화:
# PF에 8개 VF 활성echo 8 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
# VF가 새 BDF로 등록ls /sys/bus/pci/devices/ | grep "01:00"0000:01:00.0 # PF0000:01:10.0 # VF 00000:01:10.1 # VF 1...VF는 별도 driver 가능. Mellanox NIC·Intel 100 GbE가 SR-IOV 채택해 one NIC이 64+ VF로 분할.
#VF Capability·Restrictions
| 항목 | PF | VF |
|---|---|---|
| Configuration Space write | 전부 가능 | 제한적 |
| MSI-X | full table | VF 자체 vector table |
| BAR | 자체 자원 | VF BAR stride로 PF가 할당 |
| Reset | 모든 reset | FLR만 |
| ACS | 자체 | PF의 ACS 정책 적용 |
| Hot-plug | full | 제한적 |
VF가 light-weight인 만큼 대부분 기능을 PF에 의존. NIC driver는 PF driver + VF driver 별도.
#VFIO — Userspace PCI Driver Framework
kernel이 device를 userspace에 넘기는 안전한 방법. 4 계층:
| 계층 | 의미 |
|---|---|
| vfio-pci driver | 일반 PCI driver 대체 |
| container | address space (IOMMU group들의 묶음) |
| group | IOMMU group (분리 단위) |
| device | 실 device |
// Userspace에서 (간략화)int container = open("/dev/vfio/vfio", O_RDWR);int group = open("/dev/vfio/15", O_RDWR);ioctl(group, VFIO_GROUP_SET_CONTAINER, &container);ioctl(container, VFIO_SET_IOMMU, VFIO_TYPE1_IOMMU);int device = ioctl(group, VFIO_GROUP_GET_DEVICE_FD, name);이후 device fd로 BAR mmap·IRQ event·DMA buffer 등록. kernel은 IOMMU·interrupt remapping만 보호, 나머지는 userspace 자유.
#vfio-pci → QEMU 흐름
QEMU process └─ VFIO API 호출 ├─ container (guest address space) ├─ group (IOMMU group) └─ device fd (실 PCIe device) ↓ Kernel VFIO driver ↓ IOMMU (mapping·isolation) ↓ Real PCIe device# QEMUqemu-system-x86_64 \ -device vfio-pci,host=01:00.0 \ ...
# Guest 안에서 그 device가 *그대로* 보임GPU·NIC pass-through가 흔한 사용. Guest driver가 직접 device 제어.
#ACS — Access Control Services
IOMMU 그룹 분리 가능성 결정:
| ACS 비트 | 의미 |
|---|---|
| Source Validation | Source ID 검증 |
| Translation Blocking | 변환 차단 |
| P2P Request Redirect | P2P 차단 |
| Completion Redirect | Completion 차단 |
Switch downstream port가 ACS 활성해야 그 port에 매달린 device가 단독 group. ACS 미지원 switch면 모든 downstream device가 한 group.
lspci -vvv | grep ACS로 확인. ACS override patch로 강제 분리 가능하지만 security 약화.
#DPDK — Userspace NIC Driver
*Poll Mode Driver (PMD)*가 kernel network stack 우회:
| 요소 | 역할 |
|---|---|
| vfio-pci | NIC을 userspace 소유로 |
| PMD | userspace driver, kernel 없이 |
| hugepage | 2 MB·1 GB page, TLB miss 절약 |
| lcore | dedicated CPU core, polling |
| zero-copy | DMA 직접, copy 없음 |
# NIC을 vfio-pci bindingdpdk-devbind.py --bind=vfio-pci 01:00.0
# hugepage 예약echo 4096 > /proc/sys/vm/nr_hugepages
# DPDK app 실행 (lcore 4개)./l3fwd -l 0-3 -n 4 -- -p 0x3 --config="(0,0,0),(1,0,1)"Telco vRAN·UPF·Open vSwitch-DPDK·SmartNIC firmware가 DPDK 토대.
#SPDK — Userspace NVMe Driver
같은 패턴을 NVMe SSD에 적용:
| 요소 | 역할 |
|---|---|
| vfio-pci binding | NVMe controller을 userspace |
| PMD | SQ·CQ doorbell 직접 |
| hugepage | I/O buffer |
| vhost-user-blk | KVM guest에 export 가능 |
NVMe AFA (Lightbits·Pavilion·NetApp) target이 SPDK 기반. latency·throughput에서 kernel block stack 대비 큰 우위.
#VFIO와 DPDK/SPDK 관계
| 역할 | 누가 |
|---|---|
| 인프라 (IOMMU·DMA-safe) | VFIO |
| 응용 (network·storage) | DPDK·SPDK |
| 공유 토대 | IOMMU 활성 + ACS + hugepage |
VFIO는 제공만, 어떻게 쓸지는 userspace. *vfio-user (out-of-process)*도 SPDK가 활발 채택.
#Mediated Devices (mdev)
soft partition — hardware SR-IOV 없을 때 driver가 software로 분할:
| 예 | 의미 |
|---|---|
| NVIDIA vGPU | physical GPU를 driver level partition |
| Intel GVT-g | Intel iGPU virtualization |
hardware partition (SR-IOV) vs software partition (mdev). mdev는 isolation 약함, flexibility 높음.
#Reset 종류 (VFIO 시점)
| Reset | 적용 |
|---|---|
| FLR | VF·function 단위 |
| Secondary Bus Reset | bridge가 secondary bus 전체 reset |
| Hot Reset | 양단 link 강제 reset |
VFIO는 device를 guest에 넘기기 전 reset — 이전 상태 영향 제거. FLR 미지원 device는 secondary bus reset 필요해 같은 bus 다른 device 영향.
#자주 하는 실수
#”SR-IOV NumVFs은 자유”
PF의 펌웨어 max VF까지만. 데이터시트 확인 필요. NumVFs 변경 후 VF 등록 실패면 resource 부족 또는 펌웨어 한계.
#”VFIO bind = userspace 안전”
반드시 IOMMU 활성 + ACS 적절 + group 분리 필요. 미흡하면 user space process가 임의 메모리 corruption 가능. vfio_iommu_type1_dma_map에서 권한 검증.
#”DPDK 쓰면 모든 NIC 빨라진다”
PMD·driver 지원 필수. 지원 안 되는 NIC는 DPDK에서 작동 안 함. NIC capability + driver 매칭 확인.
#”ACS override patch 안전”
같은 group의 device들 사이 cross-DMA 가능. security 명백히 약화. production에서 피해야 함. home lab GPU pass-through에는 흔히 사용.
#”VF는 PF와 독립”
VF의 대부분 설정·reset·hot-plug는 PF 관여. PF 비활성하면 모든 VF 동작 안 함.
#정리
- SR-IOV가 PF 1개 → N개 VF의 hardware partition.
- VF는 light-weight. PF가 대부분 control.
- VFIO가 kernel userspace DMA-safe interface. 4 계층 (container·group·device·vfio-pci).
- ACS가 IOMMU 그룹 분리. switch downstream port의 ACS 활성이 핵심.
- DPDK·SPDK가 VFIO 위 userspace driver framework. PMD·hugepage·lcore.
- *Mediated Devices (mdev)*는 software partition (vGPU 등).
- FLR·Secondary Bus·Hot Reset이 VFIO reset 옵션.
#다음 편
Ch 13: Virtualization II — vIOMMU·Scalable IOV·VirtIO·IDE·TDISP에서 guest 측 vIOMMU·dynamic partition (S-IOV)·VirtIO·Confidential I/O를 본격적으로 분해합니다.
#관련 항목
- Ch 4: BAR & MMIO — VF BAR stride
- Ch 11: DMA·IOMMU — IOMMU group·ATS
- Ch 13: Virtualization II
#시리즈 자료 출처 안내
본 글의 1차 자료·정책은 Ch 1 footer 참고.
PCIe Deep Dive · 12 of 19
- 1Ch 1: PCIe Fundamentals — 계층 구조와 토폴로지
- 2Ch 2: TLP — Transaction Layer Packet
- 3Ch 3: Configuration Space — 4 KB ECAM·Capability Linked List
- 4Ch 4: BAR & MMIO — Device 자원의 호스트 주소 매핑
- 5Ch 5: Interrupts — INTx·MSI·MSI-X·Interrupt Remapping
- 6Ch 6: Power Management — D-state·L-state·ASPM
- 7Ch 7: Error Handling — Correctable·Uncorrectable·AER·DPC
- 8Ch 8: Data Link Layer — DLLP·ACK/NAK·Flow Control·FLIT Mode
- 9Ch 9: Physical Layer — LTSSM·Equalization·SerDes
- 10Ch 10: Linux PCI Basics — Enumeration·Driver Model·sysfs
- 11Ch 11: DMA·IOMMU — Coherent·Streaming·ATS·PRI·PASID·IOMMUFD
- 12Ch 12: Virtualization I — Pass-through·SR-IOV·VFIO·DPDK·SPDK
- 13Ch 13: Virtualization II — vIOMMU·Scalable IOV·VirtIO·IDE·TDISP
- 14Ch 14: Linux Operations — Hot-plug·AER Recovery·DPC·ARI
- 15Ch 15: Tools — lspci·setpci·pcimem·protocol analyzer
- 16Ch 16: Troubleshooting — 실무 시나리오북
- 17Ch 17: Performance — Bandwidth·Latency·Tuning
- 18Ch 18: Register Maps — Config Space·Capability 비트 reference
- 19Ch 19: 고급 기능 — Lane Margining·10-bit Tag·TPH·ACS·L0p
관련 글
Ch 19: 고급 기능 — Lane Margining·10-bit Tag·TPH·ACS·L0p
코어 동작 너머의 PCIe spec 기능들 — Lane Margining(신호 마진 측정)·10-bit Tag(outstanding 확장)·TPH(캐시 주입 힌트)·ACS(격리)·L0p(부분폭 저전력)을 실무 관점에서 정리합니다.
Ch 4: BAR & MMIO — Device 자원의 호스트 주소 매핑
Base Address Register — Memory·I/O·64-bit·Prefetchable·size 결정·ReBAR·SR-IOV VF BAR.
Ch 18: Register Maps — Config Space·Capability 비트 reference
PCIe register reference — Type 0/1 header·PCIe Cap·AER·MSI·MSI-X·SR-IOV·ACS·LTR의 주요 비트 layout.
이 글을 참조하는 글 (5)
- Ch 19: 고급 기능 — Lane Margining·10-bit Tag·TPH·ACS·L0p— PCIe Deep Dive
- Ch 14: Linux Operations — Hot-plug·AER Recovery·DPC·ARI— PCIe Deep Dive
- Ch 13: Virtualization II — vIOMMU·Scalable IOV·VirtIO·IDE·TDISP— PCIe Deep Dive
- Ch 11: DMA·IOMMU — Coherent·Streaming·ATS·PRI·PASID·IOMMUFD— PCIe Deep Dive
- Ch 4: BAR & MMIO — Device 자원의 호스트 주소 매핑— PCIe Deep Dive