vdpa sim 实验
参考: https://www.redhat.com/en/blog/hands-vdpa-what-do-you-do-when-you-aint-got-hardware-part-1
codex
有三个相关模块:
模块 作用 ━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ vdpa_sim 公共模拟器框架,也就是你正在看的代码 ────────────── ────────────────────────────────────────────────── vdpa_sim_blk 模拟块设备,当前源码使用 128 MiB 内存盘 ────────────── ────────────────────────────────────────────────── vdpa_sim_net 模拟网络设备,把通过过滤的 TX 报文复制到 RX 队列
加载 vdpa_sim_blk 或 vdpa_sim_net 后,先得到的是用于创建设备的 management device;还需要执行 vdpa dev add 才会产生具体设备实例。
最容易体验的是:让宿主机直接使用模拟块设备。
数据路径如下:
宿主机应用读写 /dev/vdX → virtio_blk → virtio_vdpa → vdpasim_config_ops → vdpa_sim_blk → 内存中的磁盘数据
下面以测试环境中尚未加载这些模块、没有 vhost_vdpa 抢先绑定设备为前提。运行内核需要启用对应配置并安装匹配的模块,用户态需要 iproute2 的 vdpa 工具。
# 加载模拟器;batch_mapping=0 用来走你正在看的那张 ops 表
sudo modprobe vdpa_sim batch_mapping=0 use_va=0
sudo modprobe vdpa_sim_blk
# 让宿主机把 vDPA 设备作为 virtio 设备使用
sudo modprobe virtio_vdpa
sudo modprobe virtio_blk
# 查看用于创建设备的管理入口,应包含 vdpasim_blk
sudo vdpa mgmtdev show
# 创建一个模拟块设备实例
sudo vdpa dev add name simblk0 mgmtdev vdpasim_blk
# 查看设备和绑定的驱动
sudo vdpa dev show simblk0
readlink /sys/bus/vdpa/devices/simblk0/driver
# 查找新出现的 128 MiB 磁盘
lsblk -o NAME,SIZE,MODEL
预期绑定驱动是 virtio_vdpa,随后出现一个 /dev/vdX 块设备,具体名称由系统分配。它可以像普通磁盘一样用于文件系统或 I/O 测试,但数据存在内存中,默认情况下 删除设备后就会丢失。
这里 simblk0 是 vDPA 设备名,与块设备名 /dev/vdX 不同。创建逻辑对应 vdpasim_blk_dev_add() (drivers/vdpa/vdpa_sim/vdpa_sim_blk.c:402)。
用完并停止 I/O、卸载文件系统后,删除实例:
sudo vdpa dev del simblk0
上述模块参数只在首次加载时生效;对已经加载的模块再次运行 modprobe 不会更改参数。
另一种方式是:通过 vhost_vdpa 提供给虚拟机。
此时宿主机上的 vDPA 设备绑定 vhost_vdpa,产生 /dev/vhost-vdpa-N 字符设备,供 QEMU 打开:
guest 中的 virtio 驱动 → QEMU 配置设备、建立通知通道 → 宿主机 vhost_vdpa → vdpa_sim → 模拟器处理 virtqueue 请求
以网络设备为例,创建 vdpasim_net 实例并绑定 vhost_vdpa 后,可以向已有 QEMU 启动命令添加类似参数:
-netdev vhost-vdpa,id=net0,vhostdev=/dev/vhost-vdpa-0 -device virtio-net-pci,netdev=net0
路径中的编号要使用实际设备编号;这只是网络参数片段。QEMU 的该后端接口见 官方文档 (https://www.qemu.org/docs/master/system/qemu-manpage.html)。
同一个实例只能绑定 virtio_vdpa、vhost_vdpa 中的一个。另需注意,当前 vdpa_sim_net 实现的是报文回环,创建后不会自动获得通往外部网络的连接。对应代码见 vdpasim_net_work() (drivers/vdpa/vdpa_sim/vdpa_sim_net.c:196)。
如果目的是跟踪前面那张操作表,先使用宿主机内存盘这条路径就能观察到:创建设备时调用特性和队列配置回调,读写磁盘时进入 kick_vq → vdpasim_blk_work,完成后 通过队列回调通知 virtio_blk。
之前的记录
物理机中:
sudo modprobe vdpa
sudo modprobe vhost_vdpa
sudo modprobe vdpa_sim
sudo modprobe vdpa_sim_net
- vdpa mgmtdev show
vdpasim_net:
supported_classes net
max_supported_vqs 3
dev_features MTU MAC STATUS CTRL_VQ CTRL_MAC_ADDR ANY_LAYOUT VERSION_1 ACCESS_PLATFORM
vdpasim_blk:
supported_classes block
max_supported_vqs 0
dev_features
vduse:
supported_classes net block
max_supported_vqs 0
dev_features
sudo vdpa dev add name vdpa0 mgmtdev vdpasim_net mac 00:e8:ca:33:ba:05 sudo vdpa dev show -jp
sudo qemu-kvm \
-drive file=/home/test/L1.qcow2,media=disk,if=virtio \
-net nic,model=virtio \
-net user,hostfwd=tcp::2226-:22 \
-netdev type=vhost-vdpa,vhostdev=/dev/vhost-vdpa-0,id=vhost-vdpa0 \
-device virtio-net-pci,netdev=vhost-vdpa0,bus=pcie.0,addr=0x7 \
disable-modern=off,page-per-vq=on \
-nographic \
-m 4G \
-smp 4 \
-cpu host \
本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。