LINUX.ORG.RU
ФорумAdmin

Проброс видеокарты через pci-assign без перезагрузки в qemu-kvm

 , , ,


4

4

Обнаружил интересную вещь, с которой получается пробрасывать видюху через pci-assign без перезагрузки хоста, даже запуская гостевую систему, которая НЕ умеет выключать устройство (видюху) без перезагрузки.
Как это получилось. Сначала возился с vfio, и естесно, ничего не получилось, точнее, получилось, но всё кроме, собственно, работы драйвера с видеокартой. Имеем и факт проброса и драйвер устанавливается и на седьмой оффтопик и на 8.1, но работать с ним отказывается, вываливается в BSOD, однако со стандартным vga драйвером оффтопика изображение выводится. Первый раз плюнул на это дело и решил через pci-assign. В принципе ничего плохого в выключении устройстава перед завершением работы гостя, но всё же 8.1 хоть ты тресни не нравится. Решил ещё раз опробовать vfio, опять та же история, но перейдя после этой попытки обратно к pci-assign решил ещё раз ради прикола посмотреть как моя система повиснет (первый раз повисла так, что и хард резет не срабатывал, пришлось шнур питания вытащить на несколько минут), но она к моему изумлению не повисла, мало того, BSOD не вылез и я увидел наполнившийся красками стандарной обоины 8.1 второй монитор, не поверил, ещё раз перезапустил - работает, с полным ускорением и без просадки производительности.
Получается тем, у кого не срослось с vfio вполне можно как-то обойтись и с pci-assign без всяких перезагрузок и отключений видюх. Вопрос ко всем - встречал ли кто подобное у себя? Цель - найти способ сбрасывать видюху с помощью vfio без обязательного предварительного фейлового запуска виртуалки с vfio.

Набор железа (vt-d/iommu совместимое):

CPU: Intel Core i7-4765T
MB: Gigabyte GA-Z87X-UD3H (bios F8)
RAM: 32 ГБ
Видео для проброса: Radeon HD 4850
Видео на хосте: встроенка в процессор (Intel HD Graphics 4600) с опенсорсным драйвером от intel

Обращаю внимание на материнскую плату, в сети её упоминания с виртуалками не видел, поэтому констатирую факт, что vt-d/iommu РАБОТАЕТ ПОЛНОСТЬЮ. Уверен, аналогично работает и в других материнках Gigabyte на Z87 (упоминание в официальных pdf манах о наличии опции vt-d у них тоже есть). Перепрошивал в своей биос с F3 на F8, впрочем и на старом vt-d работает.

Насчёт видюхи - официально самими AMD тестировалась в xen и заявлена там как пробрасываемая (пробовал сам в xen - работает), но по части vfio+HD4ххх никаких историй в сети не обнаружил, вот только с pci-assign завелась.

Пробовал резет видюхи без перезагрузки вот таким способом:

$ echo "1" > /sys/bus/pci/devices/0000:01:00.0/reset

но дохлый номер, не срабатывает.

Конфиг qemu q35+vfio:

QEMU_AUDIO_DRV=alsa \
qemu-system-x86_64 \
-boot menu=on \
-enable-kvm \
-M q35 \
-m 8192 \
-cpu host \
-rtc base=localtime \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/qemu/bios.bin \
-drive file="image",id=disk,format=raw -device ide-hd,bus=ide.0,drive=disk \
-drive file="win-8.1-amd64-ru.iso",id=isocd0 -device ide-cd,bus=ide.1,drive=isocd0 \
-drive file="virtio-win-0.1-74.iso",id=isocd1 -device ide-cd,bus=ide.2,drive=isocd1 \
-drive file="13-1-legacy_vista_win7_win8_64_dd_ccc.iso",id=isocd2 -device ide-cd,bus=ide.3,drive=isocd2 \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \
-device vfio-pci,host=01:00.1,bus=root.1,addr=00.1 \
-usb -usbdevice host:09da:9090 -usbdevice host:1c4f:0002 \
-device ich9-intel-hda,bus=pcie.0,addr=1b.0,id=sound0 \
-device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 
Конфиг qemu pc-1.3+pci-assign:
QEMU_AUDIO_DRV=alsa \
qemu-system-x86_64 \
-boot menu=on \
-enable-kvm \
-M pc-1.3 \
-m 8192 \
-cpu host \
-rtc base=localtime \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/qemu/bios.bin \
-drive file="windows7-amd64-0",if=ide,media=disk \
-drive file='virtio-win-0.1-74.iso',if=ide,media=cdrom \
-drive file='win-8.1-amd64-ru.iso',if=ide,media=cdrom \
-drive file='13-1-legacy_vista_win7_win8_64_dd_ccc.iso',if=ide,media=cdrom \
-device pci-assign,host=01:00.0,id=hostpci0 \
-device pci-assign,host=01:00.1 \
-usb -usbdevice host:09da:9090 -usbdevice host:1c4f:0002 \
-fsdev local,id=host0,path=/data/0,security_model=passthrough -device virtio-9p-pci,fsdev=host0,mount_tag=v_tmp \
-soundhw hda \
-net nic,model=virtio

Софт (всё из реп):

Дистр Arch Linux x86_64
ведро 3.13.7-1 (base) qemu 1.7.0-2
seabios 1.7.3.1-2
intel-dri 10.1.0-4
xf86-video-intel 2.99.911-1

параметры бутлоадера (syslinux + UEFI):

LABEL arch
    MENU LABEL Arch Linux
    LINUX ../vmlinuz-linux
    APPEND root=/dev/sda4 rw intel_iommu=on pci-stub.ids=1002:9442,1002:aa30
    INITRD ../initramfs-linux.img
dmesg | grep -e DMAR -e IOMMU:

[    0.000000] ACPI: DMAR 00000000921d38c8 0000B8 (v01 INTEL      HSW  00000001 INTL 00000001)
[    0.000000] Intel-IOMMU: enabled
[    0.166101] dmar: IOMMU 0: reg_base_addr fed90000 ver 1:0 cap c0000020660462 ecap f0101a
[    0.166107] dmar: IOMMU 1: reg_base_addr fed91000 ver 1:0 cap d2008020660462 ecap f010da
[    0.166173] IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
[    0.575987] DMAR: No ATSR found
[    0.576012] IOMMU 0 0xfed90000: using Queued invalidation
[    0.576013] IOMMU 1 0xfed91000: using Queued invalidation
[    0.576015] IOMMU: Setting RMRR:
[    0.576025] IOMMU: Setting identity map for device 0000:00:02.0 [0x93800000 - 0xaf9fffff]
[    0.578857] IOMMU: Setting identity map for device 0000:00:1d.0 [0x9207b000 - 0x92087fff]
[    0.578883] IOMMU: Setting identity map for device 0000:00:1a.0 [0x9207b000 - 0x92087fff]
[    0.578904] IOMMU: Setting identity map for device 0000:00:14.0 [0x9207b000 - 0x92087fff]
[    0.578920] IOMMU: Prepare 0-16MiB unity mapping for LPC
[    0.578927] IOMMU: Setting identity map for device 0000:00:1f.0 [0x0 - 0xffffff]
lspci -nn | grep AMD

01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] RV770 [Radeon HD 4850] [1002:9442]
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] RV770 HDMI Audio [Radeon HD 4850/4870] [1002:aa30]
dmesg | grep pci-stub

[    0.000000] Command line: BOOT_IMAGE=../vmlinuz-linux root=/dev/sda4 rw intel_iommu=on pci-stub.ids=1002:9442,1002:aa30 initrd=../initramfs-linux.img
[    0.000000] Kernel command line: BOOT_IMAGE=../vmlinuz-linux root=/dev/sda4 rw intel_iommu=on pci-stub.ids=1002:9442,1002:aa30 initrd=../initramfs-linux.img
[    0.913037] pci-stub: add 1002:9442 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    0.913045] pci-stub 0000:01:00.0: claimed by stub
[    0.913051] pci-stub: add 1002:AA30 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    0.913057] pci-stub 0000:01:00.1: claimed by stub
/etc/modprobe.d/kvm.conf:
options kvm ignore_msrs=1
/etc/modprobe.d/vfio_iommu_type1.conf:
options vfio_iommu_type1 allow_unsafe_interrupts=1
/etc/mkinitcpio.conf:
...
MODULES="i915 pci_stub vfio vfio_pci vfio_iommu_type1 kvm kvm_intel"
...

да вопрос интересный, я так понял что запуск через vfio спасает от зависона после перезагрузки гостя с pci stub? Сам я эту проблему решил скриптом который отключает видюху при выключении или перезагрузке на госте.

Novell-ch ★★★★★
()
Ответ на: комментарий от Novell-ch

Ага, vfio резетит видюху, токо надо между запусками варианта с pci-assign запускать вариант с vfio, шоб он сбросил видюху. Достаточно даже просто запуска варианта с vfio на первой секунде, до появления букв seabios можно валить процесс qemu, а затем уже запускать вариант с pci-assign. Плюс к этому обнаружил, что если видюху «извлечь» как флэху из системного лотка винды, то она будет готова для следующего запуска, т.е. в теории если в семёрке можно скриптом по выключении извлекать видюху, то в принципе это уже панацея. А по первому варианту с промежуточным запуском vfio можно создать скрипт, который сначала запускает конфиг с vfio, через секунду (когда видюха зарезетилась) валит его и запускает нормальный конфиг с pci-assign.

Пробовал валить виртуалку с работающей семёркой, изображение при этом оставалось застывшим на проброшенной видюхе, но vfio легко с этим справился, резетнул видюху и без перезагрузки хоста я снова удачно запустил вариант с pci-assign.

Отмечу, что у меня с опциями -vga none и nographic вариант с pci-assign не работает совсем, даже при первом запуске после загрузки хоста, возможно проблема только у меня и хрен бы с ней, но если нет иксов то засада.

В общем осталось выяснить, возможно ли более цивильным способом как-то резетить видюху с помощью vfio, без промежуточного запуска.

Setcolor
() автор топика

ОП у меня к тебе вопрос, мало ли вдруг знаешь. После того как я отдал карточку на pci-stub:

echo «1002 6719» > /sys/bus/pci/drivers/pci-stub/new_id
echo «0000:01:00.0» > /sys/bus/pci/devices/0000\:01\:00.0/driver/unbind
echo «0000:01:00.0» > /sys/bus/pci/drivers/pci-stub/bind
echo «1002 6719» > /sys/bus/pci/drivers/pci-stub/remove_id

В виртуалке она вообще не была. Как бы её корректно вернуть драйверу radeon и чтобы это добро не повесило хост?
qiomi
()

Видео на хосте: встроенка в процессор (Intel HD Graphics 4600) с опенсорсным драйвером от intel

И вот ещё какой вопрос, у тебя когда дискретка проброшена через vfio на хосте работает 3D?

qiomi
()
Ответ на: комментарий от Setcolor
#include <sys/types.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <string.h> /* strcat */
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h> /* exit */
#include <unistd.h> /* getopt */
#include <inttypes.h>
#include <stdbool.h>
#include <linux/vfio.h>

int 
main(int argc, char *argv[])
{
    int opt;
    char group_file[255] = "/dev/vfio/";
    char dev_bdf[255];
    int container, group, device, rc;

    struct vfio_group_status group_status = {
        .argsz = sizeof(group_status) };

    typedef struct {
        struct vfio_pci_hot_reset hotr;
        __s32 group_fd;
    } __attribute__((packed)) vfio_rst_data;

    vfio_rst_data hot_rst;

    while((opt = getopt(argc, argv, "g:s:")) != -1) {
        switch(opt) {
            case 'g':
                strcat(group_file, optarg);
                printf("group dev: %s\n", group_file);
                break;
            case 's':
                strcpy(dev_bdf, optarg);
                printf("device bdf: %s\n", dev_bdf);
                break;
            default:
                fprintf(stderr, "Unknown option: %s\n", optarg);
                exit(EXIT_FAILURE);
        }
    }

    /* Open new container*/
    container = open("/dev/vfio/vfio", O_RDWR);

    rc = ioctl(container, VFIO_GET_API_VERSION);
    printf("VFIO_GET_API_VERSION returned 0x%x, VFIO_API_VERSION = %d\n",
           rc, VFIO_API_VERSION);

    rc = ioctl(container, VFIO_CHECK_EXTENSION, VFIO_TYPE1_IOMMU);
    printf("VFIO_CHECK_EXTENSION returned 0x%x, VFIO_TYPE1_IOMMU = %d\n",
           rc, VFIO_TYPE1_IOMMU);

    /* Open group */
    group = open(group_file, O_RDWR);

    /* Test group */
    ioctl(group, VFIO_GROUP_GET_STATUS, &group_status);
    printf("iommu_group %s status: argsz=0x%x, flags=0x%x\n",
           group_file, group_status.argsz, group_status.flags);

    /* Add group to the container */
    ioctl(group, VFIO_GROUP_SET_CONTAINER, &container);

    /* Enable IOMMU */
    ioctl(container, VFIO_SET_IOMMU, VFIO_TYPE1_IOMMU);

    /* Get a file descriptor for the device */
    device = ioctl(group, VFIO_GROUP_GET_DEVICE_FD, dev_bdf);

    hot_rst.hotr.argsz = sizeof(vfio_rst_data);
    hot_rst.hotr.flags = 0;
    hot_rst.hotr.count = 1;
    hot_rst.group_fd = group;
    /* Bus hot reset */
    ioctl(device, VFIO_DEVICE_PCI_HOT_RESET, &hot_rst);
    
    /* reset device */
    printf("Device reset.\n");
    ioctl(device, VFIO_DEVICE_RESET);

    printf("IOMMU group unset container.\n");
    ioctl(group, VFIO_GROUP_UNSET_CONTAINER, &container);

    close(group);
    close(container);
    return 0;
}

потом нужно
gcc text.c -o vfio_reset
$ readlink /sys/bus/pci/devices/0000:01:00.0/iommu_group
(тут узнается число iommu group)

и потом
sudo ./vfio_reset -g 8 -s 0000:01:00.0

где 8 то самое число

этот конечный вариант не тестировал
от старого варианта остались всякие левые инклуды

главное это VFIO_DEVICE_PCI_HOT_RESET
проверь vfio.h на системе, чтобы он был
p.s. нужно ещё забайндить девайсы на vfio-pci драйвер
dimon555 ★★★★★
()
Последнее исправление: dimon555 (всего исправлений: 1)
Ответ на: комментарий от qiomi

И вот ещё какой вопрос, у тебя когда дискретка проброшена через vfio на хосте работает 3D?

работает, только что проверил, запускал одновременно две игры, в госте и хосте

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

ОП у меня к тебе вопрос, мало ли вдруг знаешь. После того как я отдал карточку на pci-stub:

echo «1002 6719» > /sys/bus/pci/drivers/pci-stub/new_id echo «0000:01:00.0» > /sys/bus/pci/devices/0000\:01\:00.0/driver/unbind echo «0000:01:00.0» > /sys/bus/pci/drivers/pci-stub/bind echo «1002 6719» > /sys/bus/pci/drivers/pci-stub/remove_id

В виртуалке она вообще не была. Как бы её корректно вернуть драйверу radeon и чтобы это добро не повесило хост?

Увы, не подскажу. Я попробовал обратный порядок, подставляя remove_id вместо new_id и unbind менял на bind и наоборот, вот так:

echo "1002 9442" > /sys/bus/pci/drivers/vfio-pci/remove_id
echo "1002 aa30" > /sys/bus/pci/drivers/vfio-pci/remove_id
echo 0000:01:00.0 > /sys/bus/pci/drivers/pci-stub/unbind
echo 0000:01:00.1 > /sys/bus/pci/drivers/pci-stub/unbind
echo "1002 9442" > /sys/bus/pci/drivers/pci-stub/remove_id
echo "1002 aa30" > /sys/bus/pci/drivers/pci-stub/remove_id
echo 0000:01:00.0 > /sys/bus/pci/devices/0000:01:00.0/driver/bind
echo 0000:01:00.1 > /sys/bus/pci/devices/0000:01:00.1/driver/bind

vfio и pci-stub отвязались, но radeon и snd_hda_intel не привязались, но хост не повис и вернуть обратно видюху в виртуалку удалось без перезагрузки обратно «прибинживанием» vfio и pci-stub

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

vfio и pci-stub отвязались, но radeon и snd_hda_intel не привязались, но хост не повис и вернуть обратно видюху в виртуалку удалось без перезагрузки обратно «прибинживанием» vfio и pci-stub

Да прибиндить обратно это ерунда, я делал так:

echo "0000:01:00.0" > /sys/bus/pci/devices/0000:01:00.0/driver/unbind
echo "0000:01:00.0" > /sys/bus/pci/drivers/radeon/bind
Оно биндится к драйверу, но вот после перезагрузки X и попытки юзать видеокарту оно вешает мне хост.

Плюс я ещё не понял по какой причине после unbind иногда выходит выгрузить radeon из ядра, а иногда нет.

qiomi
()
Ответ на: комментарий от qiomi

Попробовал, вешает хост как попытка заюзать перевязанную видюху, так и просто отвязать её от radeon.

В принципе с моей HD 4850 драйвер radeon и так очень плохо дружит, 3d ускорения нет, 2d с тормозами, разрешение только до 1024х768, с годами (с 2009) так ничего и не изменилось, а сейчас вообще искаропки даже Х не может запустить без вылизанного до нанометра xorg.conf, только с весой или с каталистом. Конфиг этот прошляпил и решил забить связываться, найдя лучшее применение быть проброшенной в дружелюбный оффтопик.

Хотя очень редко и встречал форумные посты, что HD 4ххх заводится норм, возможно, это другие ревизии и/или перепрошитые.

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

Пока довольствуюсь следующим вариантом:

разделил по файлам:

launch-q35-vfio-reset.sh — сбрасыватель видюхи

#/bin/bash

qemu-system-x86_64 \
-enable-kvm \
-M q35 \
-m 512 \
-cpu host \
-rtc base=localtime \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/qemu/bios.bin \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \
-device vfio-pci,host=01:00.1,bus=root.1,addr=00.1

launch-pc-1.3-windows7.sh — сама виртуалка

#/bin/bash

QEMU_AUDIO_DRV=spice \
qemu-system-x86_64 \
-boot menu=on \
-enable-kvm \
-M pc-1.3 \
-m 8192 \
-cpu host \
-rtc base=localtime \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/qemu/bios.bin \
-drive file="windows7-amd64-0.raw-image",if=ide,media=disk \
-drive file='virtio-win-0.1-74.iso',if=ide,media=cdrom \
-device pci-assign,host=01:00.0,id=hostpci0 \
-device pci-assign,host=01:00.1 \
-device usb-ehci,id=usb \
-device usb-host,vendorid=0x04b8,productid=0x002a,id=hostdev0 \
-usb \
-usbdevice host:09da:9090 \
-usbdevice host:1c4f:0002 \
-spice port=5900,addr=127.0.0.1,disable-ticketing \
-soundhw hda \
-net nic -net user,smb=/data/0

launch-pc-1.3-windows7-vfio-reset.sh — запускатель с предварительным сбросом

#/bin/bash

timeout 3 sh launch-q35-vfio-reset.sh
sh launch-pc-1.3-windows7.sh & spicec -h 127.0.0.1 -p 5900

Однако говоря, через SPICE звук работает отлично, никаких извращений с пробросом звуковух и выводом с проброшенной видюхи не нужно.

Прожку в перспективе попробую, спасибо.

Setcolor
() автор топика

Да кстати, а ты вот с такой ошибкой не сталкивался?

qemu-system-x86_64: -device pci-assign,host=01:00.0,id=hostpci0: pci-assign: Cannot read from host /sys/bus/pci/devices/0000:01:00.0/rom
Device option ROM contents are probably invalid (check dmesg).
Skip option ROM probe with rombar=0, or load from file with romfile=

А то у меня после vfio-pci нехочет pci assign работать и ресет не помогает. :(

qiomi
()
Ответ на: комментарий от qiomi

(check dmesg).

чего пишет?

#echo 1 >> /sys/bus/pci/devices/0000:01:00.0/rom
#cat /sys/bus/pci/devices/0000:01:00.0/rom > ~/tst_rom.bin

а так работает?

возможно drivers/pci/rom.c где-то тупит

можешь попробовать считать ром в файл через vfio и потом его подсовывать. vfio не проверяет всякие сигнатуры и чек суммы, а просто считавает байты.

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

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

чего пишет?

Там было:

pci-stub 0000:01:00.0: Invalid ROM contents
Ничего толкового я не нагуглил в итоге.

а так работает?

Пробовал делать «echo 1 | tee rom» и оно возвращало 2 байта.

Когда я карту перебиндил на vfio-pci оно вообще отдавало I/O error.

можешь попробовать считать ром в файл через vfio и потом его подсовывать. vfio не проверяет всякие сигнатуры и чек суммы, а просто считавает байты.

Я загрузил виртуалку с бубунтой и каталистом с vfio-pci, считал ROM и выключил её. Далее подсунул её варианту с pci-assign вот так:

-device pci-assign,host=01:00.0,romfile=/opt/vrt/vbios_fglrx.rom,id=hostpci0
Но оно всё равно не стартануло.

В итоге перезагрузил хост - работает. Самое обидное, что я так и не понял в какой момент и как все поломал. :(

qiomi
()
Ответ на: комментарий от qiomi

pci-stub 0000:01:00.0: Invalid ROM contents

видимо вместо рома считалось что-то не то, а это случилось видимо из-за pci-stub драйвера... когда тот подгрузился вместо графического драйвера.

http://lxr.free-electrons.com/source/drivers/pci/rom.c

 77                 if (readb(image) != 0x55) {
 78                         dev_err(&pdev->dev, "Invalid ROM contents\n");
 79                         break;
dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

видимо вместо рома считалось что-то не то, а это случилось видимо из-за pci-stub драйвера...

Любопытно почему в остальное время работало корректно. Т.е сейчас у меня дискретка точно так же использует pci-stub и QEMU не ругается на ROM.

Кстати раз ты немного разбираешься в данной области позволю задать один вопрос. Не знаешь, реально ли вообще «на ходу» подгрузить radeon и отдать ему дискретку, чтобы она при этом корректно работала (пусть и после перезагрузки иксов)?

Просто с другим ядром я успешно забирал дискретку у radeon и она работала в виртуалке, а вот наоборот судя по всему никак.

qiomi
()
Ответ на: комментарий от qiomi

Не знаешь, реально ли вообще «на ходу» подгрузить radeon и отдать ему дискретку, чтобы она при этом корректно работала (пусть и после перезагрузки иксов)?

что-то я не понимаю твой вопрос. radeon это как бы и есть отдельная она же дискретная карта. Ты хочешь например intel hd graphics прокинуть?

встроенные от интела, всё что с core i3/5/7 сложно прокинуть, есть ли истории успеха для qemu не знаю.

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

что-то я не понимаю твой вопрос. radeon это как бы и есть отдельная она же дискретная карта. Ты хочешь например intel hd graphics прокинуть?

Да не, я имел ввиду модуль «radeon». Хочу без перезагрузки хоста по очереди использовать дискретку на хосте (через PRIME) и в виртуалках.

Уже сам немного разобрался и с загрузкой модуля проблем нет:

  • Запустил хост с «blacklist radeon»
  • Логин в иксы, тут нормально работает Intel.
  • Использовал дискретку в виртуалках без проблем.
  • Далее reset дискретки вышеописанным кустарным методом.
  • Отбиндил дискретку от драйверов.
  • Выход из сессии и переход на tty.
  • Далее уже в терминале остановка GUI «service lightdm stop».
  • Далее просто modprobe radeon, старт GUI.
  • После захода «DRI_PRIME=1 glxinfo» показывает корректную информацию и шестерёнки крутятся.

А вот если после использования на на хосте попытаться модуль radeon выгрузить, то после повторной загрузки он вешает хост. :(

Т.е получается загрузить radeon можно только один раз, хотя я вероятно неправильно его выгружаю.

qiomi
()
Ответ на: комментарий от qiomi

А вот если после использования на на хосте попытаться модуль radeon выгрузить, то после повторной загрузки он вешает хост. :(

т.е. ты так же с blacklist radeon загружаешь, используешь на хосте, а потом пытаешься в виртуалке и всё виснет?

там есть такая проблема, что DRM грузится очень рано, чтобы начать рисовать консоль и это мешает последующей инициализации iommu для этого устройства, но может быть это и для специфичных карт.

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

т.е. ты так же с blacklist radeon загружаешь, используешь на хосте, а потом пытаешься в виртуалке и всё виснет?

Нет. Я гружусь с «blacklist radeon», юзаю карту в виртуалке нормально, потом на хосте гружу модуль нормально и он отлично работает. Даже могу могу выгрузить модуль (с выключенными иксами) и опять успешно юзать карту в виртуалке.

Но вот если я пытаюсь второй раз загрузить radeon у меня все виснет как только я переключаюсь на GUI.

qiomi
()
Ответ на: комментарий от dimon555

В общем смог повторить проблему.

Если сначала запустить карту с radeon, отбиндить её, поюзать через vfio-pci, то после этого «Invalid ROM» в dmesg и при считывании «cp: error reading ‘rom’: Input/output error».

Такой вопрос. А есть способ как-то залить другой ROM на девайс или переинициализировать его как-то?

qiomi
()
Ответ на: комментарий от qiomi

Если что, при этом используя vfio-pci девайс пробрасывается корректно, а вот pci-assign уже не работает даже если подсунуть корректный ROM через «romfile».

qiomi
()
Ответ на: комментарий от qiomi

даже если подсунуть корректный ROM через «romfile».

а ты как получил корректный ROM?

у него такой же размер, как и lspci определяет?

у меня через sysfs дампится только 64 КБ.

# lspci -s 01:00.0 -v
01:00.0 VGA compatible controller: Advanced Micro Devices [AMD] nee ATI Cape Verde XT [Radeon HD 7770 GHz Edition] (prog-if 00 [VGA controller])
	Subsystem: PC Partner Limited Device e244
	Flags: bus master, fast devsel, latency 0, IRQ 48
	Memory at e0000000 (64-bit, prefetchable) [size=256M]
	Memory at f0000000 (64-bit, non-prefetchable) [size=256K]
	I/O ports at e000 [size=256]
	Expansion ROM at f0040000 [disabled] [size=128K]
	Capabilities: [48] Vendor Specific Information: Len=08 <?>
	Capabilities: [50] Power Management version 3
	Capabilities: [58] Express Legacy Endpoint, MSI 00
	Capabilities: [a0] MSI: Enable+ Count=1/1 Maskable- 64bit+
	Capabilities: [100] Vendor Specific Information: ID=0001 Rev=1 Len=010 <?>
	Capabilities: [150] Advanced Error Reporting
	Capabilities: [270] #19
	Kernel driver in use: fglrx_pci


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

а ты как получил корректный ROM?

Ну я думал, что он корректный.

у него такой же размер, как и lspci определяет?
у меня через sysfs дампится только 64 КБ.

Тоже самое и у меня. Не важно какой драйвер загружен, считывается всегда 64КБ.

qiomi
()
10 декабря 2014 г.
Ответ на: комментарий от Setcolor

Работает отлично, спасибо.

Причем этот reset уменьшает до самого тихого уровень скорости вентелей видеокарты, и это уже после того как они были уменьшены до минимального при загрузке гостя с драйвером при предыдущем запуске vm.

Вот только я нигде в скрипте не вижу /etc/init.d/vfio-assign start или типа того, ну где биндятся id устройств для vfio.

Ну это так, мелочи.

vim
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.