본문으로 건너뛰기
PCIe Deep Dive · 12/19

Ch 12: Virtualization I — Pass-through·SR-IOV·VFIO·DPDK·SPDK

· Hawk · 7분 읽기

#한 줄 요약

“PCIe pass-through는 guest VM·userspace process물리 device를 직접 owner로 제공하는 메커니즘입니다.”SR-IOVPF 1개를 N개 VF로 분할하는 hardware partition, VFIOLinux kernel의 userspace DMA-safe interface, DPDK·SPDK그 위에 응용. ACSIOMMU 그룹 분리의 핵심, FLRdevice 격리 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로
NumVFsPF가 활성화한 VF 수 (펌웨어 max 한계 내)
VF BARtemplate으로 광고, stride로 매핑 (Ch 4)

활성화:

Terminal window
# 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 # PF
0000:01:10.0 # VF 0
0000:01:10.1 # VF 1
...

VF는 별도 driver 가능. Mellanox NIC·Intel 100 GbE가 SR-IOV 채택one NIC이 64+ VF로 분할.

#VF Capability·Restrictions

항목PFVF
Configuration Space write전부 가능제한적
MSI-Xfull tableVF 자체 vector table
BAR자체 자원VF BAR stride로 PF가 할당
Reset모든 resetFLR만
ACS자체PF의 ACS 정책 적용
Hot-plugfull제한적

VF가 light-weight인 만큼 대부분 기능을 PF에 의존. NIC driverPF driver + VF driver 별도.

#VFIO — Userspace PCI Driver Framework

kernel이 device를 userspace에 넘기는 안전한 방법. 4 계층:

계층의미
vfio-pci driver일반 PCI driver 대체
containeraddress space (IOMMU group들의 묶음)
groupIOMMU 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
Terminal window
# QEMU
qemu-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 ValidationSource ID 검증
Translation Blocking변환 차단
P2P Request RedirectP2P 차단
Completion RedirectCompletion 차단

Switch downstream portACS 활성해야 그 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-pciNIC을 userspace 소유로
PMDuserspace driver, kernel 없이
hugepage2 MB·1 GB page, TLB miss 절약
lcorededicated CPU core, polling
zero-copyDMA 직접, copy 없음
Terminal window
# NIC을 vfio-pci binding
dpdk-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 bindingNVMe controller을 userspace
PMDSQ·CQ doorbell 직접
hugepageI/O buffer
vhost-user-blkKVM 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 vGPUphysical GPU를 driver level partition
Intel GVT-gIntel iGPU virtualization

hardware partition (SR-IOV) vs software partition (mdev). mdev는 isolation 약함, flexibility 높음.

#Reset 종류 (VFIO 시점)

Reset적용
FLRVF·function 단위
Secondary Bus Resetbridge가 secondary bus 전체 reset
Hot Reset양단 link 강제 reset

VFIO는 device를 guest에 넘기기 전 reset이전 상태 영향 제거. FLR 미지원 devicesecondary 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-plugPF 관여. PF 비활성하면 모든 VF 동작 안 함.

#정리

  • SR-IOVPF 1개 → N개 VFhardware partition.
  • VFlight-weight. PF가 대부분 control.
  • VFIOkernel userspace DMA-safe interface. 4 계층 (container·group·device·vfio-pci).
  • ACSIOMMU 그룹 분리. switch downstream port의 ACS 활성이 핵심.
  • DPDK·SPDKVFIO 위 userspace driver framework. PMD·hugepage·lcore.
  • *Mediated Devices (mdev)*는 software partition (vGPU 등).
  • FLR·Secondary Bus·Hot ResetVFIO reset 옵션.

#다음 편

Ch 13: Virtualization II — vIOMMU·Scalable IOV·VirtIO·IDE·TDISP에서 guest 측 vIOMMU·dynamic partition (S-IOV)·VirtIO·Confidential I/O를 본격적으로 분해합니다.

#관련 항목

#시리즈 자료 출처 안내

본 글의 1차 자료·정책은 Ch 1 footer 참고.