Control virtqueue is used by networking device for accepting various commands from the driver. It's a must to support multiqueue and other configurations.
Shadow VirtQueue (SVQ) already makes possible migration of virtqueue states, effectively intercepting them so qemu can track what regions of memory are dirty because device action and needs migration. However, this does not solve networking device state seen by the driver because CVQ messages, like changes on MAC addresses from the driver. To solve that, this series uses SVQ infraestructure proposed at SVQ to intercept networking control messages used by the device. This way, qemu is able to update VirtIONet device model and to migrate it. You can run qemu in two modes after applying this series: only intercepting cvq with x-cvq-svq=on or intercept all the virtqueues adding cmdline x-svq=on: -netdev type=vhost-vdpa,vhostdev=/dev/vhost-vdpa-0,id=vhost-vdpa0,x-cvq-svq=on,x-svq=on The most updated kernel part of ASID is proposed at [1]. Other modes without x-cvq-svq have been not tested with this series. Other vq cmd commands than set mac are not tested. Some details like error control are not 100% tested neither. The firsts 5 patches will be or have already been proposed sepratedly. Patch 6 enables cmdline parameter to shadow all virtqueues. The rest of commits introduce the actual functionality. Comments are welcomed. Changes from rfc v4: * Add missing tracing * Add multiqueue support * Use already sent version for replacing g_memdup * Care with memory management Changes from rfc v3: * Fix bad returning of descriptors to SVQ list. Changes from rfc v2: * Fix use-after-free. Changes from rfc v1: * Rebase to latest master. * Configure ASID instead of assuming cvq asid != data vqs asid. * Update device model so (MAC) state can be migrated too. [1] https://lkml.kernel.org/kvm/20220224212314.1326-1-gda...@xilinx.com/ Eugenio Pérez (22): vdpa: Add missing tracing to batch mapping functions vdpa: Fix bad index calculus at vhost_vdpa_get_vring_base util: Return void on iova_tree_remove vhost: Fix bad return of descriptors to SVQ vdpa: Add x-svq to NetdevVhostVDPAOptions vhost: move descriptor translation to vhost_svq_vring_write_descs vdpa: Fix index calculus at vhost_vdpa_svqs_start virtio-net: Expose ctrl virtqueue logic vdpa: Extract get features part from vhost_vdpa_get_max_queue_pairs virtio: Make virtqueue_alloc_element non-static vhost: Add SVQElement vhost: Add custom used buffer callback vdpa: control virtqueue support on shadow virtqueue vhost: Add vhost_iova_tree_find vdpa: Add map/unmap operation callback to SVQ vhost: Add vhost_svq_inject vdpa: add NetClientState->start() callback vdpa: Add vhost_vdpa_start_control_svq vhost: Update kernel headers vhost: Make possible to check for device exclusive vq group vdpa: Add asid attribute to vdpa device vdpa: Add x-cvq-svq Philippe Mathieu-Daudé (1): hw/virtio: Replace g_memdup() by g_memdup2() qapi/net.json | 13 +- hw/virtio/vhost-iova-tree.h | 2 + hw/virtio/vhost-shadow-virtqueue.h | 46 ++- include/hw/virtio/vhost-vdpa.h | 4 + include/hw/virtio/vhost.h | 4 + include/hw/virtio/virtio-net.h | 3 + include/hw/virtio/virtio.h | 1 + include/net/net.h | 2 + include/qemu/iova-tree.h | 4 +- include/standard-headers/linux/vhost_types.h | 11 +- linux-headers/linux/vhost.h | 25 +- hw/net/vhost_net.c | 9 +- hw/net/virtio-net.c | 82 +++-- hw/virtio/vhost-iova-tree.c | 14 + hw/virtio/vhost-shadow-virtqueue.c | 255 ++++++++++++--- hw/virtio/vhost-vdpa.c | 201 ++++++++++-- hw/virtio/virtio-crypto.c | 6 +- hw/virtio/virtio.c | 2 +- net/vhost-vdpa.c | 308 +++++++++++++++++-- util/iova-tree.c | 4 +- hw/virtio/trace-events | 8 +- 21 files changed, 864 insertions(+), 140 deletions(-) -- 2.27.0