virtualization / knowledge
vfio-pci가 amdgpu보다 먼저 장치를 잡게 하기
vfio.conf 에 id를 적었다고 끝이 아니다. 부팅할 때 amdgpu 가 먼저 올라와서 GPU를 잡아버리면 vfio-pci 는 남은 걸 못 가져간다. 순서를 강제해야 한다.
지금 누가 잡고 있는지 확인
$ lspci -nnk
75:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Raphael [1002:164e] (rev c5)
Subsystem: ASRock Incorporation Raphael [1849:364e]
Kernel driver in use: amdgpu
75:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Rembrandt Radeon High Definition Audio Controller [1002:1640]
Kernel driver in use: snd_hda_intel
Kernel driver in use 가 봐야 할 줄이다. 지금은 amdgpu 와 snd_hda_intel 이 잡고 있다. 두 장치의 드라이버가 다르므로 둘 다 처리해야 한다.
softdep
$ echo "softdep amdgpu pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
$ echo "softdep snd_hda_intel pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
softdep ... pre: 는 그 모듈을 올리기 전에 앞의 모듈을 먼저 올리라는 뜻이다. amdgpu 가 로드될 때쯤이면 vfio-pci 가 이미 해당 id의 장치를 가져간 뒤라 amdgpu 는 건드릴 게 없다.
반영
$ update-initramfs -u -k all
$ shutdown -r now
initramfs를 다시 만들지 않으면 반영되지 않는다. 이 모듈들은 초기 램디스크 단계에서 로드되므로 /etc/modules 와 /etc/modprobe.d/ 를 고쳐도 initramfs 안의 사본이 그대로면 소용없다. -k all 은 설치된 모든 커널 버전에 적용한다.
확인
$ dmesg | grep -e DMAR -e IOMMU
IOMMU가 켜졌는지 본다.
$ lspci -nnk
아까 그 두 장치의 Kernel driver in use 가 vfio-pci 로 바뀌었으면 됐다. 여전히 amdgpu 면 softdep이나 initramfs 쪽을 다시 봐야 한다.