Skip to the content.

vfio misc

给设备绑定驱动的方法

new_id 所有的

echo 1e49 0071 | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id
@[
        vfio_pci_probe+5
        local_pci_probe+66
        pci_call_probe+91
        pci_device_probe+149
        really_probe+219
        __driver_probe_device+120
        driver_probe_device+31
        __driver_attach+186
        bus_for_each_dev+139
        new_id_store+266
        kernfs_fop_write_iter+333
        vfs_write+602
        ksys_write+107
        do_syscall_64+132
        entry_SYSCALL_64_after_hwframe+118
]: 1

是的,这个是构建出来了 vfio group

vfio-pci 的作用

static struct pci_driver vfio_pci_driver = {
    .name           = "vfio-pci",
    .id_table       = vfio_pci_table,
    .probe          = vfio_pci_probe,
    .remove         = vfio_pci_remove,
    .sriov_configure    = vfio_pci_sriov_configure,
    .err_handler        = &vfio_pci_core_err_handlers,
    .driver_managed_dma = true,
};

由于 vfio 还有 vfio-platform 的,所以必然可以定义一个基本机制。

vfio_pci_sriov_configure 比较有意思了,

这么操作就可以触发:

vn on  master [$!+] 😸
🧀  cd /sys/devices/pci0000:00/0000:00:06.0/0000:02:00.0
pci0000:00/0000:00:06.0/0000:02:00.0🔒 😸
🧀  echo 1 | sudo tee sriov_numvfs

每次加载 vfio 的时候的内核日志

vfio_init 中

#define DRIVER_DESC	"VFIO - User Level meta-driver"
[68634.075962] VFIO - User Level meta-driver version: 0.3

内核中 arch/um/drivers/vfio_user.c 和 arch/um/drivers/vfio_kern.c

猜测是 uml 下,对于 vfio 机制的模拟,还是有想象力的。

不知道为什么现在直通都是会有报错的

当然,也不影响使用哈:

emu-system-aarch64: qemu_vfio_dma_map(0xfffda1ffd000, 8589934592) failed: VFIO_MAP_DMA failed: Cannot allocate memory
qemu-system-aarch64: qemu_vfio_dma_map(0xfffd97e00000, 67108864) failed: VFIO_MAP_DMA failed: Cannot allocate memory
qemu-system-aarch64: qemu_vfio_dma_map(0xfffd93c00000, 67108864) failed: VFIO_MAP_DMA failed: Cannot allocate memory
qemu-system-aarch64: -device virtio-blk-pci,drive=disk_backend: VFIO_MAP_DMA failed: Cannot allocate memory

完全不知道这个东西的规律是什么

即便是 VFIO_MAP_DMA 映射错误,系统也是可以正常运行的

2024-12

qemu-system-x86_64: warning: Number of hotpluggable cpus requested (128) exceeds the recommended cpus supported by KVM (32)
[martins3:virtio_dummy_instance_init:126] 0x55d4bdd62ef0
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55d4bc5924f0, 0x380000000000, 0x10000000, 0x7fba00000000) = -22 (Invalid argument)
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55d4bc5924f0, 0x380010000000, 0x2000000, 0x7fba1c000000) = -22 (Invalid argument)
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55d4bc5924f0, 0x380000000000, 0x10000000, 0x7fba00000000) = -22 (Invalid argument)
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55d4bc5924f0, 0x380010000000, 0x2000000, 0x7fba1c000000) = -22 (Invalid argument)
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55d4bc5924f0, 0x380000000000, 0x10000000, 0x7fba00000000) = -22 (Invalid argument)
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55d4bc5924f0, 0x380010000000, 0x2000000, 0x7fba1c000000) = -22 (Invalid argument)

原来直通 nvme 的时候也是有 bug 的:

[martins3:virtio_dummy_instance_init:126] 0x55a8c89411b0
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55a8c7683870, 0x3800000000
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55a8c7683870, 0x3800000000
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55a8c7683870, 0x3800000000
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55a8c7683870, 0x3800000000
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55a8c7683870, 0x3800000000
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55a8c7683870, 0x3800000000
qemu-system-x86_64: VFIO_MAP_DMA failed: Invalid argument
qemu-system-x86_64: vfio_container_dma_map(0x55a8c7683870, 0x3800000000

可以发现都是在映射一个地方的时候会出现错误,所以认为应该是一个 mmio 空间的问题了。

这个可以用切换内核到 stable 版本看看,也许过一段时间就没有这些问题了。

的确,到了 2025-12-20 的时候,还是之前的硬件,就没有问题 内核 : 6.17.7-00001-gfd23f075a322 QEMU : version 10.1.91 (v10.2.0-rc1-78-g9ef49528b528-dirty)

2026-01-11 发现还是有问题,触发原因未知。

和 option rom 的关系

为什么直通的时候,还需要管 option rom ?

qemu 日志:

Device option ROM contents are probably invalid (check dmesg).
Skip option ROM probe with rombar=0, or load from file with romfile=

内核日志:

[3189152.966714] vfio-pci 0000:02:00.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xffff

[ ] 这个报错是什么意思

4.19 内核独享的报错吗?

[6644841.291571] vfio_cap_init: 0000:98:00.0 pci config conflict @0x78, was cap 0x0 now cap 0x10
[6644841.303496] vfio_cap_init: 0000:98:00.0 pci config conflict @0x79, was cap 0x0 now cap 0x10
[6644841.315363] vfio_cap_init: 0000:98:00.0 pci config conflict @0x7a, was cap 0x0 now cap 0x10
[6644841.327169] vfio_cap_init: 0000:98:00.0 pci config conflict @0x7b, was cap 0x0 now cap 0x10
[6644841.338848] vfio_cap_init: 0000:98:00.0 pci config conflict @0x7c, was cap 0x0 now cap 0x10
[6644841.350513] vfio_cap_init: 0000:98:00.0 pci config conflict @0x7d, was cap 0x0 now cap 0x10
[6644841.362170] vfio_cap_init: 0000:98:00.0 pci config conflict @0x7e, was cap 0x0 now cap 0x10
[6644841.373703] vfio_cap_init: 0000:98:00.0 pci config conflict @0x7f, was cap 0x0 now cap 0x10
[6644841.385206] vfio_cap_init: 0000:98:00.0 pci config conflict @0x80, was cap 0x0 now cap 0x10
[6644841.396605] vfio_cap_init: 0000:98:00.0 pci config conflict @0x81, was cap 0x0 now cap 0x10
[6644841.407903] vfio_cap_init: 0000:98:00.0 pci config conflict @0x82, was cap 0x0 now cap 0x10
[6644841.419143] vfio_cap_init: 0000:98:00.0 pci config conflict @0x83, was cap 0x0 now cap 0x10
[6644841.430310] vfio_cap_init: 0000:98:00.0 pci config conflict @0x84, was cap 0x0 now cap 0x10
[6644841.441416] vfio_cap_init: 0000:98:00.0 pci config conflict @0x85, was cap 0x0 now cap 0x10
[6644841.452515] vfio_cap_init: 0000:98:00.0 pci config conflict @0x86, was cap 0x0 now cap 0x10
[6644841.463549] vfio_cap_init: 0000:98:00.0 pci config conflict @0x87, was cap 0x0 now cap 0x10
[6644841.474521] vfio_cap_init: 0000:98:00.0 pci config conflict @0x88, was cap 0x0 now cap 0x10
[6644841.485496] vfio_cap_init: 0000:98:00.0 pci config conflict @0x89, was cap 0x0 now cap 0x10
[6644841.496398] vfio_cap_init: 0000:98:00.0 pci config conflict @0x8a, was cap 0x0 now cap 0x10
[6644841.507295] vfio_cap_init: 0000:98:00.0 pci config conflict @0x8b, was cap 0x0 now cap 0x10
[6644841.518129] vfio_cap_init: 0000:98:00.0 pci config conflict @0x8c, was cap 0x0 now cap 0x10
[6644841.528966] vfio_cap_init: 0000:98:00.0 pci config conflict @0x8d, was cap 0x0 now cap 0x10
[6644841.539796] vfio_cap_init: 0000:98:00.0 pci config conflict @0x8e, was cap 0x0 now cap 0x10
[6644841.550646] vfio_cap_init: 0000:98:00.0 pci config conflict @0x8f, was cap 0x0 now cap 0x10
[6644841.561487] vfio_cap_init: 0000:98:00.0 pci config conflict @0x90, was cap 0x0 now cap 0x10
[6644841.572319] vfio_cap_init: 0000:98:00.0 pci config conflict @0x91, was cap 0x0 now cap 0x10
[6644841.583038] vfio_cap_init: 0000:98:00.0 pci config conflict @0x92, was cap 0x0 now cap 0x10
[6644841.593638] vfio_cap_init: 0000:98:00.0 pci config conflict @0x93, was cap 0x0 now cap 0x10
[6644841.604235] vfio_cap_init: 0000:98:00.0 pci config conflict @0x94, was cap 0x0 now cap 0x10
[6644841.614724] vfio_cap_init: 0000:98:00.0 pci config conflict @0x95, was cap 0x0 now cap 0x10
[6644841.625091] vfio_cap_init: 0000:98:00.0 pci config conflict @0x96, was cap 0x0 now cap 0x10
[6644841.635344] vfio_cap_init: 0000:98:00.0 pci config conflict @0x97, was cap 0x0 now cap 0x10
[6644841.645564] vfio_cap_init: 0000:98:00.0 pci config conflict @0x98, was cap 0x0 now cap 0x10
[6644841.655673] vfio_cap_init: 0000:98:00.0 pci config conflict @0x99, was cap 0x0 now cap 0x10
[6644841.665786] vfio_cap_init: 0000:98:00.0 pci config conflict @0x9a, was cap 0x0 now cap 0x10
[6644841.675847] vfio_cap_init: 0000:98:00.0 pci config conflict @0x9b, was cap 0x0 now cap 0x10
[6644841.685796] vfio_cap_init: 0000:98:00.0 pci config conflict @0x9c, was cap 0x0 now cap 0x10
[6644841.695668] vfio_cap_init: 0000:98:00.0 pci config conflict @0x9d, was cap 0x0 now cap 0x10
[6644841.705481] vfio_cap_init: 0000:98:00.0 pci config conflict @0x9e, was cap 0x0 now cap 0x10
[6644841.715235] vfio_cap_init: 0000:98:00.0 pci config conflict @0x9f, was cap 0x0 now cap 0x10
[6644841.724925] vfio_cap_init: 0000:98:00.0 pci config conflict @0xa0, was cap 0x0 now cap 0x10
[6644841.734559] vfio_cap_init: 0000:98:00.0 pci config conflict @0xa1, was cap 0x0 now cap 0x10
[6644841.744131] vfio_cap_init: 0000:98:00.0 pci config conflict @0xa2, was cap 0x0 now cap 0x10
[6644841.753652] vfio_cap_init: 0000:98:00.0 pci config conflict @0xa3, was cap 0x0 now cap 0x10
[6644841.763111] vfio_cap_init: 0000:98:00.0 pci config conflict @0xa4, was cap 0x0 now cap 0x10
[6644841.772513] vfio_cap_init: 0000:98:00.0 pci config conflict @0xa5, was cap 0x0 now cap 0x10
[6644841.781853] vfio_cap_init: 0000:98:00.0 pci config conflict @0xa6, was cap 0x0 now cap 0x10
[6644841.791138] vfio_cap_init: 0000:98:00.0 pci config conflict @0xa7, was cap 0x0 now cap 0x10

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。