LINUX.ORG.RU

gpu passthrough ubuntu how to load vfio before radeon?

 ,


0

1

В общем, играюсь тут с пробросом видяхи в виртуалку, загоняю

IOMMU Group 16 02:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii XT [Radeon R9 290X] [1002:67b0]
IOMMU Group 16 02:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii HDMI Audio [1002:aac8]
в принудительное использование vfio
cat /etc/modprobe.d/vfio.conf 
options vfio-pci ids=1002:67b0,1002:aac8

cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with «#» are ignored.

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
kvm
kvm_amd

получаю в выводе dmesg

[    7.685901] VFIO - User Level meta-driver version: 0.3
[    7.701211] vfio_pci: add [1002:67b0[ffff:ffff]] class 0x000000/00000000
[    7.720817] vfio_pci: add [1002:aac8[ffff:ffff]] class 0x000000/00000000
но в выводе lspci почему-то вижу картину

02:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii XT [Radeon R9 290X] (prog-if 00 [VGA controller])
	Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii XT [Radeon R9 290X]
	Kernel driver in use: radeon
	Kernel modules: radeon, amdgpu

02:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii HDMI Audio
	Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii HDMI Audio
	Kernel driver in use: vfio-pci
	Kernel modules: snd_hda_intel

в логе есть такое

[   20.438500] radeon 0000:02:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=none:owns=none
[   20.438501] amdgpu 0000:01:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=none:owns=io+mem

Саму виртуалку еще не поднимал, вопрос возник на стадии подготовки. Что с этим делать? Забить?

PS. Это ВТОРАЯ видяха в системе, не основная. Инициализацию комп проходит на другой карте.

ЗЗЫ. UBUNTU 16.04

★★★★★

Последнее исправление: targitaj (всего исправлений: 7)

вот такая выборка есть

dmesg | grep '0000:02:00.0'
[    0.550798] pci 0000:02:00.0: [1002:67b0] type 00 class 0x030000
[    0.550812] pci 0000:02:00.0: reg 0x10: [mem 0xa0000000-0xafffffff 64bit pref]
[    0.550821] pci 0000:02:00.0: reg 0x18: [mem 0xb0000000-0xb07fffff 64bit pref]
[    0.550826] pci 0000:02:00.0: reg 0x20: [io  0xd000-0xd0ff]
[    0.550832] pci 0000:02:00.0: reg 0x24: [mem 0xfe900000-0xfe93ffff]
[    0.550837] pci 0000:02:00.0: reg 0x30: [mem 0xfe940000-0xfe95ffff pref]
[    0.550889] pci 0000:02:00.0: supports D1 D2
[    0.550890] pci 0000:02:00.0: PME# supported from D1 D2 D3hot
[    0.599678] pci 0000:02:00.0: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[    0.599683] pci 0000:02:00.0: vgaarb: bridge control possible
[    1.435442] iommu: Adding device 0000:02:00.0 to group 16
[    2.140869] radeon 0000:02:00.0: enabling device (0000 -> 0003)
[    2.283327] radeon 0000:02:00.0: VRAM: 4096M 0x0000000000000000 - 0x00000000FFFFFFFF (4096M used)
[    2.283333] radeon 0000:02:00.0: GTT: 2048M 0x0000000100000000 - 0x000000017FFFFFFF
[    2.305166] radeon 0000:02:00.0: WB enabled
[    2.305174] radeon 0000:02:00.0: fence driver on ring 0 use gpu addr 0x0000000100000c00 and cpu addr 0xffff9c920672fc00
[    2.305179] radeon 0000:02:00.0: fence driver on ring 1 use gpu addr 0x0000000100000c04 and cpu addr 0xffff9c920672fc04
[    2.305184] radeon 0000:02:00.0: fence driver on ring 2 use gpu addr 0x0000000100000c08 and cpu addr 0xffff9c920672fc08
[    2.305189] radeon 0000:02:00.0: fence driver on ring 3 use gpu addr 0x0000000100000c0c and cpu addr 0xffff9c920672fc0c
[    2.305194] radeon 0000:02:00.0: fence driver on ring 4 use gpu addr 0x0000000100000c10 and cpu addr 0xffff9c920672fc10
[    2.305935] radeon 0000:02:00.0: fence driver on ring 5 use gpu addr 0x00000000000782b0 and cpu addr 0xffffc123824382b0
[    2.306212] radeon 0000:02:00.0: fence driver on ring 6 use gpu addr 0x0000000100000c18 and cpu addr 0xffff9c920672fc18
[    2.306217] radeon 0000:02:00.0: fence driver on ring 7 use gpu addr 0x0000000100000c1c and cpu addr 0xffff9c920672fc1c
[    2.306265] radeon 0000:02:00.0: radeon: using MSI.
[    4.198032] radeon 0000:02:00.0: fb0: radeondrmfb frame buffer device
[    4.215339] [drm] Initialized radeon 2.49.0 20080528 for 0000:02:00.0 on minor 1
[   20.438500] radeon 0000:02:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=none:owns=none

targitaj ★★★★★
() автор топика

https://www.linuxserver.io/2017/04/28/how-to-setup-vfio-gpu-passthrough-using... - ты что-то забыл сделать, должно быть Kernel driver in use: vfio-pci в видео, :

3.4 PCI Device IDs

Now it's time to select the actual devices you want to passthrough and block them from the host system so it's available for the VMs to use. List your IDs with:

$ lspci -nn|grep -iP «NVIDIA|Radeon» 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK110 [GeForce GTX 780 Rev. 2] [10de:1007] (rev a1) 01:00.1 Audio device [0403]: NVIDIA Corporation GK110 HDMI Audio [10de:0e1a] (rev a1)

In the above example my device IDs are 10de:1007 and 10de:0e1a respectively. Put these values into /etc/modprobe.d/vfio.conf so it looks like this (there might not be anything else in this file - if it doesn't exist, create it):

options vfio-pci ids=10de:1007,10de:0e1a

Save your file and add the following modules to /etc/mkinitcpio.conf, then run mkinitcpio -p linux:

MODULES=«vfio vfio_iommu_type1 vfio_pci vfio_virqfd»

Reboot, then run lspci -k and look for vfio-pci under 'Kernel drive in use'.

01:00.0 VGA compatible controller: NVIDIA Corporation GK110 [GeForce GTX 780 Rev. 2] (rev a1) Subsystem: eVga.com. Corp. Device 3787 Kernel driver in use: vfio-pci Kernel modules: nouveau 01:00.1 Audio device: NVIDIA Corporation GK110 HDMI Audio (rev a1) Subsystem: eVga.com. Corp. Device 3787 Kernel driver in use: vfio-pci Kernel modules: snd_hda_intel

If you see vfio-pci congratulations, you're pretty close now.

Там всё в строке запуска ядра указывается, https://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM и карта должна поддерживать «горячий» сброс, иначе это будет работать только в одну сторону один раз и после проброса любые действия только через перезагрузку, карта залипает намертво, погугли список гарантированно пробрасываемых карт, если твоей нет, то и смысла возиться нет.

Gramozeka ★★
()

Я так понял, что драйвер vfio тупо инициализаруется позже, чем драйвера radeon и amdgpu. Как принудительно установить порядок?

targitaj ★★★★★
() автор топика
Ответ на: комментарий от Gramozeka

я смотрю на доки
https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF
https://ycnrg.org/vga-passthrough-with-ovmf-vfio/
и в доке арчика ясно указано

This, however, does not guarantee that vfio-pci will be loaded before other graphics drivers. To ensure that, we need to statically bind it in the kernel image alongside with its dependencies. That means adding, in this order, vfio, vfio_iommu_type1, vfio_pci and vfio_virqfd to mkinitcpio:

но у меня ubuntu и там нет mkinitcpio

targitaj ★★★★★
() автор топика
Ответ на: комментарий от targitaj

но у меня ubuntu и там нет mkinitcpio

http://manpages.ubuntu.com/manpages/zesty/man8/mkinitramfs.8.html

чтобы успешно пробросить карту, нужно выполнить несколько условий -

карта должна это мочЬ.

процессор и мать должны это уметь по настоящему, а не для «виду»

при старте системы ядро должно сперва загрузить инструменты проброса(эти твои vfio-pci и iommu) (указывается в строке grub'а в опциях ядра.

там же при старте ты должен запретить ядру инициировать пробрасываемое оборудование штатными средствами иначе проброса не получится.(либо так же в грубе, либо через modprobe)

сам initramfs тут нужен для облегчения задачи(↑), когда загружается система оборудование уже подготовлено «до того как».

Вообще это лотерея, не все карты могут - даже вроде радеоны(все в оупенсурсе) не все умеют, а сраная нвидия(палец Торвадса) внезапно может, но желательно какая-нибудь антикварная типа 9800 гт , в общем успехов тебе. Я года полтора назад этим баловался, сейчас уже всего не помню, но общий путь я тебе выше написал.

Gramozeka ★★
()

Во первых то что тебе надо делается так в конфиге загрузки модулей:

softdep radeon pre: vfio-pci

Во вторых если карта не имеет активного монитора, то совершенно не обязательно её отдавать VFIO на загрузке. Вполне можно отцепить её от radeon на горячую вот так:

virsh nodedev-detach pci_0000_00_02_0

Отключение на горячую не сработает если карта используется иксами, но для карты в секции Device указать Ignore в конфге иксов, то все будет нормально даже при активной иксовой сессии и подключенным к карте мониторам.

В третьих про ответы другого комментатора я бы советовал забыть: там 4.2 и устаревшая года на два информация. Сейчас если у тебя мать / проц поддерживают проброс, то пробросить можно почти все что угодно и обойти можно 99% проблем тем или иным образом: где-то нужно ядро новее, где-то надо rom карты обновить или пропатчить на поддержку EFI, где-то заюзать Xen вместо KVM, либо использовать EFI вместо биоса или наоборот в виртуалке.

...

А так информацию лучше всего смотреть тут:

http://reddit.com/r/vfio/

И в местном дискорде.

o-
()
Ответ на: комментарий от targitaj

вот так примерно это выглядит для xen(&& qemu)

grub.cfg(fragment)

### BEGIN /etc/grub.d/20_linux_xen ###
menuentry 'Slackware-14.2 GNU/Linux, с гипервизором Xen' --class slackware-14.2 --class gnu-linux --class gnu --class os --class xen $menuentry_id_option 'xen-gnulinux-simple-052a0c93-81af-439e-952f-9120b11d5344' {
	insmod part_msdos
	insmod ext2
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  052a0c93-81af-439e-952f-9120b11d5344
	else
	  search --no-floppy --fs-uuid --set=root 052a0c93-81af-439e-952f-9120b11d5344
	fi
	echo	'Загружается Xen xen …'
	multiboot	/boot/xen.gz placeholder  dom0_mem=2048M,max:2048M vtd=1 intel_iommu=on
	echo	'Загружается Linux 4.4.38-Xen …'
	module	/boot/vmlinuz-4.4.38-Xen placeholder root=/dev/sda1 ro video=1280x800 xen-pciback.permissive xen-pciback.passthrough=1 xen-pciback.hide=(01:00.0)(01:00.1)(02:00.0)(02:00.1)
}

Gramozeka ★★
()

/etc/modprobe.d/vfio.conf
cat /etc/modules

Добавь vfio в /etc/initramfs-tools/modules и перегенери initrd, если хочешь, чтобы он подхватил карту до radeon.

anonymous
()

получилось

02:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii XT [Radeon R9 290X] [1002:67b0]
	Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii XT [Radeon R9 290X] [1002:0b00]
	Kernel driver in use: vfio-pci
	Kernel modules: radeon, amdgpu
02:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii HDMI Audio [1002:aac8]
	Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii HDMI Audio [1002:aac8]
	Kernel driver in use: vfio-pci
	Kernel modules: snd_hda_intel
через совместное применение опций
cat /etc/modprobe.d/vfio.conf 
options vfio-pci ids=1002:67b0,1002:aac8

cat /etc/modprobe.d/radeon.conf 
softdep radeon pre: vfio-pci

содержимое /etc/initramfs-tools/modules я пробовал трогать, но оно не сыграло.

targitaj ★★★★★
() автор топика
dmesg | grep -i 02:00.0
[    0.556961] pci 0000:02:00.0: [1002:67b0] type 00 class 0x030000
[    0.556973] pci 0000:02:00.0: reg 0x10: [mem 0xa0000000-0xafffffff 64bit pref]
[    0.556980] pci 0000:02:00.0: reg 0x18: [mem 0xb0000000-0xb07fffff 64bit pref]
[    0.556985] pci 0000:02:00.0: reg 0x20: [io  0xd000-0xd0ff]
[    0.556989] pci 0000:02:00.0: reg 0x24: [mem 0xfe900000-0xfe93ffff]
[    0.556994] pci 0000:02:00.0: reg 0x30: [mem 0xfe940000-0xfe95ffff pref]
[    0.557039] pci 0000:02:00.0: supports D1 D2
[    0.557040] pci 0000:02:00.0: PME# supported from D1 D2 D3hot
[    0.605818] pci 0000:02:00.0: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[    0.605823] pci 0000:02:00.0: vgaarb: bridge control possible
[    1.443465] iommu: Adding device 0000:02:00.0 to group 16
[    2.133230] vfio-pci 0000:02:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none
[   19.636994] vfio-pci 0000:02:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none
dmesg | grep -i 02:00.1
[    0.557105] pci 0000:02:00.1: [1002:aac8] type 00 class 0x040300
[    0.557116] pci 0000:02:00.1: reg 0x10: [mem 0xfe960000-0xfe963fff 64bit]
[    0.557171] pci 0000:02:00.1: supports D1 D2
[    1.443489] iommu: Adding device 0000:02:00.1 to group 16
targitaj ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.