Linux 无法在带有自定义(桥接)tap设备的QEMU VM内加载XDP程序

Linux 无法在带有自定义(桥接)tap设备的QEMU VM内加载XDP程序,linux,qemu,xdp-bpf,tun-tap,Linux,Qemu,Xdp Bpf,Tun Tap,我最近尝试在QEMU虚拟机中加载XDP程序(使用virtio net pci作为NIC驱动程序,并将设备作为后端)。这样做似乎要求我的NIC具有队列的vCPU*2,这可以通过在QEMU启动命令(…-netdev tap,queues=…)中声明它来实现。如果我没有声明具有足够数量队列的NIC并尝试加载XDP程序,则会收到以下内核消息和错误: [ 8.663795] virtio_net virtio0 eth0: request 2 queues but max is 1 RTNETLIN

我最近尝试在QEMU虚拟机中加载XDP程序(使用
virtio net pci
作为NIC驱动程序,并将设备作为后端)。这样做似乎要求我的NIC具有队列的vCPU*2,这可以通过在QEMU启动命令(
…-netdev tap,queues=…
)中声明它来实现。如果我没有声明具有足够数量队列的NIC并尝试加载XDP程序,则会收到以下内核消息和错误:

[    8.663795] virtio_net virtio0 eth0: request 2 queues but max is 1
RTNETLINK answers: Cannot allocate memory
到目前为止,这完全不是问题,尽管idk解释了为什么需要这样做(我已经在我的主机上成功地加载了相同的XDP程序,它只有一个队列)

但我的目标是让QEMU使用我的定制tap设备,该设备已连接到主机上的网桥。而不是让QEMU为我创建一个新的

为了使用自定义tap设备,我使用以下命令启动VM:

sudo qemu-system-x86_64 -hda output/images/node_rootfs.ext2  -enable-kvm -echr 2 --nographic \
 -netdev tap,script=no,downscript=no,id=xcxc,ifname=tap0,queues=4 -device virtio-net-pci,netdev=xcxc,mq=on \
 -cpu host \
 -smp 2 \
 -m 512 \
 -kernel output/images/bzImage -append "root=/dev/sda rw nokaslr"
其中
tap0
是所谓的自定义tap设备

上述QEMU命令不会启动VM,错误消息为:

qemu-system-x86_64: could not configure /dev/net/tun (tap0): Invalid argument
通过删除选项
ifname=tap0
queues=4
,它将正常引导

它似乎在告诉我,我不能同时声明一个具有多队列和桥接tap设备的NIC。但令人尴尬的是,我需要在桥接tap设备上执行XDP程序

有人知道为什么桥接tap设备不能与支持多队列的NIC共存吗

附加说明:内核版本:
5.4.33
QEMU版本:
4.2.0(Debian 1:4.2-3ubuntu6.2)


谢谢你阅读我的问题

结果表明,QEMU不允许直接在选项中指定
ifname
。相反,这应该通过脚本来完成(选项
script=/path/to/script
downscript=/path/to/script

注意,应该在脚本中配置tap设备,而不是手动创建一个并使用选项
ifname
传递它