qapi/net.json | 20 + hw/virtio/vhost-iova-tree.h | 27 + hw/virtio/vhost-shadow-virtqueue.h | 44 ++ hw/virtio/virtio-pci.h | 1 + include/hw/virtio/vhost-vdpa.h | 12 + include/hw/virtio/virtio.h | 4 +- include/qemu/iova-tree.h | 25 +- .../standard-headers/linux/virtio_config.h | 5 + include/standard-headers/linux/virtio_pci.h | 2 + hw/i386/intel_iommu.c | 2 +- hw/net/vhost_net.c | 2 +- hw/net/virtio-net.c | 6 +- hw/virtio/vhost-iova-tree.c | 157 ++++ hw/virtio/vhost-shadow-virtqueue.c | 746 ++++++++++++++++++ hw/virtio/vhost-vdpa.c | 437 +++++++++- hw/virtio/virtio-pci.c | 16 +- net/vhost-vdpa.c | 28 + util/iova-tree.c | 151 +++- hw/virtio/meson.build | 2 +- 19 files changed, 1664 insertions(+), 23 deletions(-) create mode 100644 hw/virtio/vhost-iova-tree.h create mode 100644 hw/virtio/vhost-shadow-virtqueue.h create mode 100644 hw/virtio/vhost-iova-tree.c create mode 100644 hw/virtio/vhost-shadow-virtqueue.c
This series enable shadow virtqueue (SVQ) for vhost-vdpa devices. This
is intended as a new method of tracking the memory the devices touch
during a migration process: Instead of relay on vhost device's dirty
logging capability, SVQ intercepts the VQ dataplane forwarding the
descriptors between VM and device. This way qemu is the effective
writer of guests memory, like in qemu's virtio device operation.
When SVQ is enabled qemu offers a new virtual address space to the
device to read and write into, and it maps new vrings and the guest
memory in it. SVQ also intercepts kicks and calls between the device
and the guest. Used buffers relay would cause dirty memory being
tracked, but at this RFC SVQ is not enabled on migration automatically.
Thanks of being a buffers relay system, SVQ can be used also to
communicate devices and drivers with different capabilities, like
devices that only supports packed vring and not split and old guest
with no driver packed support.
It is based on the ideas of DPDK SW assisted LM, in the series of
DPDK's https://patchwork.dpdk.org/cover/48370/ . However, these does
not map the shadow vq in guest's VA, but in qemu's.
For qemu to use shadow virtqueues the guest virtio driver must not use
features like event_idx.
SVQ needs to be enabled with QMP command:
{ "execute": "x-vhost-set-shadow-vq",
"arguments": { "name": "vhost-vdpa0", "enable": true } }
This series includes some patches to delete in the final version that
helps with its testing. The first two of the series have been sent
sepparately but they haven't been included in qemu main branch.
The two after them adds the feature to stop the device and be able to
set and get its status. It's intended to be used with vp_vpda driver in
a nested environment, so they are also external to this series. The
vp_vdpa driver also need modifications to forward the new status bit,
they will be proposed sepparately
Patches 5-12 prepares the SVQ and QMP command to support guest to host
notifications forwarding. If the SVQ is enabled with these ones
applied and the device supports it, that part can be tested in
isolation (for example, with networking), hopping through SVQ.
Same thing is true with patches 13-17, but with device to guest
notifications.
Based on them, patches from 18 to 22 implement the actual buffer
forwarding, using some features already introduced in previous.
However, they will need a host device with no iommu, something that
is not available at the moment.
The last part of the series uses properly the host iommu, so the driver
can access this new virtual address space created.
Comments are welcome.
TODO:
* Event, indirect, packed, and others features of virtio.
* To sepparate buffers forwarding in its own AIO context, so we can
throw more threads to that task and we don't need to stop the main
event loop.
* Support multiqueue virtio-net vdpa.
* Proper documentation.
Changes from v4 RFC:
* Support of allocating / freeing iova ranges in IOVA tree. Extending
already present iova-tree for that.
* Proper validation of guest features. Now SVQ can negotiate a
different set of features with the device when enabled.
* Support of host notifiers memory regions
* Handling of SVQ full queue in case guest's descriptors span to
different memory regions (qemu's VA chunks).
* Flush pending used buffers at end of SVQ operation.
* QMP command now looks by NetClientState name. Other devices will need
to implement it's way to enable vdpa.
* Rename QMP command to set, so it looks more like a way of working
* Better use of qemu error system
* Make a few assertions proper error-handling paths.
* Add more documentation
* Less coupling of virtio / vhost, that could cause friction on changes
* Addressed many other small comments and small fixes.
Changes from v3 RFC:
* Move everything to vhost-vdpa backend. A big change, this allowed
some cleanup but more code has been added in other places.
* More use of glib utilities, especially to manage memory.
v3 link:
https://lists.nongnu.org/archive/html/qemu-devel/2021-05/msg06032.html
Changes from v2 RFC:
* Adding vhost-vdpa devices support
* Fixed some memory leaks pointed by different comments
v2 link:
https://lists.nongnu.org/archive/html/qemu-devel/2021-03/msg05600.html
Changes from v1 RFC:
* Use QMP instead of migration to start SVQ mode.
* Only accepting IOMMU devices, closer behavior with target devices
(vDPA)
* Fix invalid masking/unmasking of vhost call fd.
* Use of proper methods for synchronization.
* No need to modify VirtIO device code, all of the changes are
contained in vhost code.
* Delete superfluous code.
* An intermediate RFC was sent with only the notifications forwarding
changes. It can be seen in
https://patchew.org/QEMU/20210129205415.876290-1-eperezma@redhat.com/
v1 link:
https://lists.gnu.org/archive/html/qemu-devel/2020-11/msg05372.html
Eugenio Pérez (20):
virtio: Add VIRTIO_F_QUEUE_STATE
virtio-net: Honor VIRTIO_CONFIG_S_DEVICE_STOPPED
virtio: Add virtio_queue_is_host_notifier_enabled
vhost: Make vhost_virtqueue_{start,stop} public
vhost: Add x-vhost-enable-shadow-vq qmp
vhost: Add VhostShadowVirtqueue
vdpa: Register vdpa devices in a list
vhost: Route guest->host notification through shadow virtqueue
Add vhost_svq_get_svq_call_notifier
Add vhost_svq_set_guest_call_notifier
vdpa: Save call_fd in vhost-vdpa
vhost-vdpa: Take into account SVQ in vhost_vdpa_set_vring_call
vhost: Route host->guest notification through shadow virtqueue
virtio: Add vhost_shadow_vq_get_vring_addr
vdpa: Save host and guest features
vhost: Add vhost_svq_valid_device_features to shadow vq
vhost: Shadow virtqueue buffers forwarding
vhost: Add VhostIOVATree
vhost: Use a tree to store memory mappings
vdpa: Add custom IOTLB translations to SVQ
Eugenio Pérez (26):
util: Make some iova_tree parameters const
vhost: Fix last queue index of devices with no cvq
virtio: Add VIRTIO_F_QUEUE_STATE
virtio-net: Honor VIRTIO_CONFIG_S_DEVICE_STOPPED
vhost: Add x-vhost-set-shadow-vq qmp
vhost: Add VhostShadowVirtqueue
vdpa: Save kick_fd in vhost-vdpa
vdpa: Add vhost_svq_get_dev_kick_notifier
vdpa: Add vhost_svq_set_svq_kick_fd
vhost: Add Shadow VirtQueue kick forwarding capabilities
vhost: Handle host notifiers in SVQ
vhost: Route guest->host notification through shadow virtqueue
Add vhost_svq_get_svq_call_notifier
Add vhost_svq_set_guest_call_notifier
vdpa: Save call_fd in vhost-vdpa
vhost-vdpa: Take into account SVQ in vhost_vdpa_set_vring_call
vhost: Route host->guest notification through shadow virtqueue
virtio: Add vhost_shadow_vq_get_vring_addr
vdpa: ack VIRTIO_F_QUEUE_STATE if device supports it
vhost: Add vhost_svq_valid_device_features to shadow vq
vhost: Add vhost_svq_valid_guest_features to shadow vq
vhost: Shadow virtqueue buffers forwarding
util: Add iova_tree_alloc
vhost: Add VhostIOVATree
vhost: Use a tree to store memory mappings
vdpa: Add custom IOTLB translations to SVQ
qapi/net.json | 20 +
hw/virtio/vhost-iova-tree.h | 27 +
hw/virtio/vhost-shadow-virtqueue.h | 44 ++
hw/virtio/virtio-pci.h | 1 +
include/hw/virtio/vhost-vdpa.h | 12 +
include/hw/virtio/virtio.h | 4 +-
include/qemu/iova-tree.h | 25 +-
.../standard-headers/linux/virtio_config.h | 5 +
include/standard-headers/linux/virtio_pci.h | 2 +
hw/i386/intel_iommu.c | 2 +-
hw/net/vhost_net.c | 2 +-
hw/net/virtio-net.c | 6 +-
hw/virtio/vhost-iova-tree.c | 157 ++++
hw/virtio/vhost-shadow-virtqueue.c | 746 ++++++++++++++++++
hw/virtio/vhost-vdpa.c | 437 +++++++++-
hw/virtio/virtio-pci.c | 16 +-
net/vhost-vdpa.c | 28 +
util/iova-tree.c | 151 +++-
hw/virtio/meson.build | 2 +-
19 files changed, 1664 insertions(+), 23 deletions(-)
create mode 100644 hw/virtio/vhost-iova-tree.h
create mode 100644 hw/virtio/vhost-shadow-virtqueue.h
create mode 100644 hw/virtio/vhost-iova-tree.c
create mode 100644 hw/virtio/vhost-shadow-virtqueue.c
--
2.27.0
On Fri, Oct 29, 2021 at 8:41 PM Eugenio Pérez <eperezma@redhat.com> wrote:
>
> This series enable shadow virtqueue (SVQ) for vhost-vdpa devices. This
> is intended as a new method of tracking the memory the devices touch
> during a migration process: Instead of relay on vhost device's dirty
> logging capability, SVQ intercepts the VQ dataplane forwarding the
> descriptors between VM and device. This way qemu is the effective
> writer of guests memory, like in qemu's virtio device operation.
>
> When SVQ is enabled qemu offers a new virtual address space to the
> device to read and write into, and it maps new vrings and the guest
> memory in it. SVQ also intercepts kicks and calls between the device
> and the guest. Used buffers relay would cause dirty memory being
> tracked, but at this RFC SVQ is not enabled on migration automatically.
>
> Thanks of being a buffers relay system, SVQ can be used also to
> communicate devices and drivers with different capabilities, like
> devices that only supports packed vring and not split and old guest
> with no driver packed support.
>
> It is based on the ideas of DPDK SW assisted LM, in the series of
> DPDK's https://patchwork.dpdk.org/cover/48370/ . However, these does
> not map the shadow vq in guest's VA, but in qemu's.
>
> For qemu to use shadow virtqueues the guest virtio driver must not use
> features like event_idx.
>
> SVQ needs to be enabled with QMP command:
>
> { "execute": "x-vhost-set-shadow-vq",
> "arguments": { "name": "vhost-vdpa0", "enable": true } }
>
> This series includes some patches to delete in the final version that
> helps with its testing. The first two of the series have been sent
> sepparately but they haven't been included in qemu main branch.
>
> The two after them adds the feature to stop the device and be able to
> set and get its status. It's intended to be used with vp_vpda driver in
> a nested environment, so they are also external to this series. The
> vp_vdpa driver also need modifications to forward the new status bit,
> they will be proposed sepparately
>
> Patches 5-12 prepares the SVQ and QMP command to support guest to host
> notifications forwarding. If the SVQ is enabled with these ones
> applied and the device supports it, that part can be tested in
> isolation (for example, with networking), hopping through SVQ.
>
> Same thing is true with patches 13-17, but with device to guest
> notifications.
>
> Based on them, patches from 18 to 22 implement the actual buffer
> forwarding, using some features already introduced in previous.
> However, they will need a host device with no iommu, something that
> is not available at the moment.
>
> The last part of the series uses properly the host iommu, so the driver
> can access this new virtual address space created.
>
> Comments are welcome.
>
> TODO:
> * Event, indirect, packed, and others features of virtio.
> * To sepparate buffers forwarding in its own AIO context, so we can
> throw more threads to that task and we don't need to stop the main
> event loop.
> * Support multiqueue virtio-net vdpa.
> * Proper documentation.
>
> Changes from v4 RFC:
> * Support of allocating / freeing iova ranges in IOVA tree. Extending
> already present iova-tree for that.
> * Proper validation of guest features. Now SVQ can negotiate a
> different set of features with the device when enabled.
> * Support of host notifiers memory regions
> * Handling of SVQ full queue in case guest's descriptors span to
> different memory regions (qemu's VA chunks).
> * Flush pending used buffers at end of SVQ operation.
> * QMP command now looks by NetClientState name. Other devices will need
> to implement it's way to enable vdpa.
> * Rename QMP command to set, so it looks more like a way of working
> * Better use of qemu error system
> * Make a few assertions proper error-handling paths.
> * Add more documentation
> * Less coupling of virtio / vhost, that could cause friction on changes
> * Addressed many other small comments and small fixes.
>
> Changes from v3 RFC:
> * Move everything to vhost-vdpa backend. A big change, this allowed
> some cleanup but more code has been added in other places.
> * More use of glib utilities, especially to manage memory.
> v3 link:
> https://lists.nongnu.org/archive/html/qemu-devel/2021-05/msg06032.html
>
> Changes from v2 RFC:
> * Adding vhost-vdpa devices support
> * Fixed some memory leaks pointed by different comments
> v2 link:
> https://lists.nongnu.org/archive/html/qemu-devel/2021-03/msg05600.html
>
> Changes from v1 RFC:
> * Use QMP instead of migration to start SVQ mode.
> * Only accepting IOMMU devices, closer behavior with target devices
> (vDPA)
> * Fix invalid masking/unmasking of vhost call fd.
> * Use of proper methods for synchronization.
> * No need to modify VirtIO device code, all of the changes are
> contained in vhost code.
> * Delete superfluous code.
> * An intermediate RFC was sent with only the notifications forwarding
> changes. It can be seen in
> https://patchew.org/QEMU/20210129205415.876290-1-eperezma@redhat.com/
> v1 link:
> https://lists.gnu.org/archive/html/qemu-devel/2020-11/msg05372.html
>
> Eugenio Pérez (20):
> virtio: Add VIRTIO_F_QUEUE_STATE
> virtio-net: Honor VIRTIO_CONFIG_S_DEVICE_STOPPED
> virtio: Add virtio_queue_is_host_notifier_enabled
> vhost: Make vhost_virtqueue_{start,stop} public
> vhost: Add x-vhost-enable-shadow-vq qmp
> vhost: Add VhostShadowVirtqueue
> vdpa: Register vdpa devices in a list
> vhost: Route guest->host notification through shadow virtqueue
> Add vhost_svq_get_svq_call_notifier
> Add vhost_svq_set_guest_call_notifier
> vdpa: Save call_fd in vhost-vdpa
> vhost-vdpa: Take into account SVQ in vhost_vdpa_set_vring_call
> vhost: Route host->guest notification through shadow virtqueue
> virtio: Add vhost_shadow_vq_get_vring_addr
> vdpa: Save host and guest features
> vhost: Add vhost_svq_valid_device_features to shadow vq
> vhost: Shadow virtqueue buffers forwarding
> vhost: Add VhostIOVATree
> vhost: Use a tree to store memory mappings
> vdpa: Add custom IOTLB translations to SVQ
>
> Eugenio Pérez (26):
> util: Make some iova_tree parameters const
> vhost: Fix last queue index of devices with no cvq
> virtio: Add VIRTIO_F_QUEUE_STATE
> virtio-net: Honor VIRTIO_CONFIG_S_DEVICE_STOPPED
> vhost: Add x-vhost-set-shadow-vq qmp
> vhost: Add VhostShadowVirtqueue
> vdpa: Save kick_fd in vhost-vdpa
> vdpa: Add vhost_svq_get_dev_kick_notifier
> vdpa: Add vhost_svq_set_svq_kick_fd
> vhost: Add Shadow VirtQueue kick forwarding capabilities
> vhost: Handle host notifiers in SVQ
> vhost: Route guest->host notification through shadow virtqueue
> Add vhost_svq_get_svq_call_notifier
> Add vhost_svq_set_guest_call_notifier
> vdpa: Save call_fd in vhost-vdpa
> vhost-vdpa: Take into account SVQ in vhost_vdpa_set_vring_call
> vhost: Route host->guest notification through shadow virtqueue
> virtio: Add vhost_shadow_vq_get_vring_addr
> vdpa: ack VIRTIO_F_QUEUE_STATE if device supports it
> vhost: Add vhost_svq_valid_device_features to shadow vq
> vhost: Add vhost_svq_valid_guest_features to shadow vq
> vhost: Shadow virtqueue buffers forwarding
> util: Add iova_tree_alloc
> vhost: Add VhostIOVATree
> vhost: Use a tree to store memory mappings
> vdpa: Add custom IOTLB translations to SVQ
>
> qapi/net.json | 20 +
> hw/virtio/vhost-iova-tree.h | 27 +
> hw/virtio/vhost-shadow-virtqueue.h | 44 ++
> hw/virtio/virtio-pci.h | 1 +
> include/hw/virtio/vhost-vdpa.h | 12 +
> include/hw/virtio/virtio.h | 4 +-
> include/qemu/iova-tree.h | 25 +-
> .../standard-headers/linux/virtio_config.h | 5 +
> include/standard-headers/linux/virtio_pci.h | 2 +
> hw/i386/intel_iommu.c | 2 +-
> hw/net/vhost_net.c | 2 +-
> hw/net/virtio-net.c | 6 +-
> hw/virtio/vhost-iova-tree.c | 157 ++++
> hw/virtio/vhost-shadow-virtqueue.c | 746 ++++++++++++++++++
> hw/virtio/vhost-vdpa.c | 437 +++++++++-
> hw/virtio/virtio-pci.c | 16 +-
> net/vhost-vdpa.c | 28 +
> util/iova-tree.c | 151 +++-
> hw/virtio/meson.build | 2 +-
> 19 files changed, 1664 insertions(+), 23 deletions(-)
> create mode 100644 hw/virtio/vhost-iova-tree.h
> create mode 100644 hw/virtio/vhost-shadow-virtqueue.h
> create mode 100644 hw/virtio/vhost-iova-tree.c
> create mode 100644 hw/virtio/vhost-shadow-virtqueue.c
>
> --
> 2.27.0
>
>
>
To make the review easier, this tree is also at [1].
Thanks!
[1] https://github.com/eugpermar/qemu/tree/vdpa_sw_live_migration.d/vdpa-v5
在 2021/10/30 上午2:34, Eugenio Pérez 写道:
> This series enable shadow virtqueue (SVQ) for vhost-vdpa devices. This
> is intended as a new method of tracking the memory the devices touch
> during a migration process: Instead of relay on vhost device's dirty
> logging capability, SVQ intercepts the VQ dataplane forwarding the
> descriptors between VM and device. This way qemu is the effective
> writer of guests memory, like in qemu's virtio device operation.
>
> When SVQ is enabled qemu offers a new virtual address space to the
> device to read and write into, and it maps new vrings and the guest
> memory in it. SVQ also intercepts kicks and calls between the device
> and the guest. Used buffers relay would cause dirty memory being
> tracked, but at this RFC SVQ is not enabled on migration automatically.
>
> Thanks of being a buffers relay system, SVQ can be used also to
> communicate devices and drivers with different capabilities, like
> devices that only supports packed vring and not split and old guest
> with no driver packed support.
>
> It is based on the ideas of DPDK SW assisted LM, in the series of
> DPDK's https://patchwork.dpdk.org/cover/48370/ . However, these does
> not map the shadow vq in guest's VA, but in qemu's.
>
> For qemu to use shadow virtqueues the guest virtio driver must not use
> features like event_idx.
>
> SVQ needs to be enabled with QMP command:
>
> { "execute": "x-vhost-set-shadow-vq",
> "arguments": { "name": "vhost-vdpa0", "enable": true } }
>
> This series includes some patches to delete in the final version that
> helps with its testing. The first two of the series have been sent
> sepparately but they haven't been included in qemu main branch.
>
> The two after them adds the feature to stop the device and be able to
> set and get its status. It's intended to be used with vp_vpda driver in
> a nested environment, so they are also external to this series. The
> vp_vdpa driver also need modifications to forward the new status bit,
> they will be proposed sepparately
>
> Patches 5-12 prepares the SVQ and QMP command to support guest to host
> notifications forwarding. If the SVQ is enabled with these ones
> applied and the device supports it, that part can be tested in
> isolation (for example, with networking), hopping through SVQ.
>
> Same thing is true with patches 13-17, but with device to guest
> notifications.
>
> Based on them, patches from 18 to 22 implement the actual buffer
> forwarding, using some features already introduced in previous.
> However, they will need a host device with no iommu, something that
> is not available at the moment.
>
> The last part of the series uses properly the host iommu, so the driver
> can access this new virtual address space created.
>
> Comments are welcome.
I think we need do some benchmark to see the performance impact.
Thanks
>
> TODO:
> * Event, indirect, packed, and others features of virtio.
> * To sepparate buffers forwarding in its own AIO context, so we can
> throw more threads to that task and we don't need to stop the main
> event loop.
> * Support multiqueue virtio-net vdpa.
> * Proper documentation.
>
> Changes from v4 RFC:
> * Support of allocating / freeing iova ranges in IOVA tree. Extending
> already present iova-tree for that.
> * Proper validation of guest features. Now SVQ can negotiate a
> different set of features with the device when enabled.
> * Support of host notifiers memory regions
> * Handling of SVQ full queue in case guest's descriptors span to
> different memory regions (qemu's VA chunks).
> * Flush pending used buffers at end of SVQ operation.
> * QMP command now looks by NetClientState name. Other devices will need
> to implement it's way to enable vdpa.
> * Rename QMP command to set, so it looks more like a way of working
> * Better use of qemu error system
> * Make a few assertions proper error-handling paths.
> * Add more documentation
> * Less coupling of virtio / vhost, that could cause friction on changes
> * Addressed many other small comments and small fixes.
>
> Changes from v3 RFC:
> * Move everything to vhost-vdpa backend. A big change, this allowed
> some cleanup but more code has been added in other places.
> * More use of glib utilities, especially to manage memory.
> v3 link:
> https://lists.nongnu.org/archive/html/qemu-devel/2021-05/msg06032.html
>
> Changes from v2 RFC:
> * Adding vhost-vdpa devices support
> * Fixed some memory leaks pointed by different comments
> v2 link:
> https://lists.nongnu.org/archive/html/qemu-devel/2021-03/msg05600.html
>
> Changes from v1 RFC:
> * Use QMP instead of migration to start SVQ mode.
> * Only accepting IOMMU devices, closer behavior with target devices
> (vDPA)
> * Fix invalid masking/unmasking of vhost call fd.
> * Use of proper methods for synchronization.
> * No need to modify VirtIO device code, all of the changes are
> contained in vhost code.
> * Delete superfluous code.
> * An intermediate RFC was sent with only the notifications forwarding
> changes. It can be seen in
> https://patchew.org/QEMU/20210129205415.876290-1-eperezma@redhat.com/
> v1 link:
> https://lists.gnu.org/archive/html/qemu-devel/2020-11/msg05372.html
>
> Eugenio Pérez (20):
> virtio: Add VIRTIO_F_QUEUE_STATE
> virtio-net: Honor VIRTIO_CONFIG_S_DEVICE_STOPPED
> virtio: Add virtio_queue_is_host_notifier_enabled
> vhost: Make vhost_virtqueue_{start,stop} public
> vhost: Add x-vhost-enable-shadow-vq qmp
> vhost: Add VhostShadowVirtqueue
> vdpa: Register vdpa devices in a list
> vhost: Route guest->host notification through shadow virtqueue
> Add vhost_svq_get_svq_call_notifier
> Add vhost_svq_set_guest_call_notifier
> vdpa: Save call_fd in vhost-vdpa
> vhost-vdpa: Take into account SVQ in vhost_vdpa_set_vring_call
> vhost: Route host->guest notification through shadow virtqueue
> virtio: Add vhost_shadow_vq_get_vring_addr
> vdpa: Save host and guest features
> vhost: Add vhost_svq_valid_device_features to shadow vq
> vhost: Shadow virtqueue buffers forwarding
> vhost: Add VhostIOVATree
> vhost: Use a tree to store memory mappings
> vdpa: Add custom IOTLB translations to SVQ
>
> Eugenio Pérez (26):
> util: Make some iova_tree parameters const
> vhost: Fix last queue index of devices with no cvq
> virtio: Add VIRTIO_F_QUEUE_STATE
> virtio-net: Honor VIRTIO_CONFIG_S_DEVICE_STOPPED
> vhost: Add x-vhost-set-shadow-vq qmp
> vhost: Add VhostShadowVirtqueue
> vdpa: Save kick_fd in vhost-vdpa
> vdpa: Add vhost_svq_get_dev_kick_notifier
> vdpa: Add vhost_svq_set_svq_kick_fd
> vhost: Add Shadow VirtQueue kick forwarding capabilities
> vhost: Handle host notifiers in SVQ
> vhost: Route guest->host notification through shadow virtqueue
> Add vhost_svq_get_svq_call_notifier
> Add vhost_svq_set_guest_call_notifier
> vdpa: Save call_fd in vhost-vdpa
> vhost-vdpa: Take into account SVQ in vhost_vdpa_set_vring_call
> vhost: Route host->guest notification through shadow virtqueue
> virtio: Add vhost_shadow_vq_get_vring_addr
> vdpa: ack VIRTIO_F_QUEUE_STATE if device supports it
> vhost: Add vhost_svq_valid_device_features to shadow vq
> vhost: Add vhost_svq_valid_guest_features to shadow vq
> vhost: Shadow virtqueue buffers forwarding
> util: Add iova_tree_alloc
> vhost: Add VhostIOVATree
> vhost: Use a tree to store memory mappings
> vdpa: Add custom IOTLB translations to SVQ
>
> qapi/net.json | 20 +
> hw/virtio/vhost-iova-tree.h | 27 +
> hw/virtio/vhost-shadow-virtqueue.h | 44 ++
> hw/virtio/virtio-pci.h | 1 +
> include/hw/virtio/vhost-vdpa.h | 12 +
> include/hw/virtio/virtio.h | 4 +-
> include/qemu/iova-tree.h | 25 +-
> .../standard-headers/linux/virtio_config.h | 5 +
> include/standard-headers/linux/virtio_pci.h | 2 +
> hw/i386/intel_iommu.c | 2 +-
> hw/net/vhost_net.c | 2 +-
> hw/net/virtio-net.c | 6 +-
> hw/virtio/vhost-iova-tree.c | 157 ++++
> hw/virtio/vhost-shadow-virtqueue.c | 746 ++++++++++++++++++
> hw/virtio/vhost-vdpa.c | 437 +++++++++-
> hw/virtio/virtio-pci.c | 16 +-
> net/vhost-vdpa.c | 28 +
> util/iova-tree.c | 151 +++-
> hw/virtio/meson.build | 2 +-
> 19 files changed, 1664 insertions(+), 23 deletions(-)
> create mode 100644 hw/virtio/vhost-iova-tree.h
> create mode 100644 hw/virtio/vhost-shadow-virtqueue.h
> create mode 100644 hw/virtio/vhost-iova-tree.c
> create mode 100644 hw/virtio/vhost-shadow-virtqueue.c
>
On Tue, Nov 2, 2021 at 5:26 AM Jason Wang <jasowang@redhat.com> wrote:
>
>
> 在 2021/10/30 上午2:34, Eugenio Pérez 写道:
> > This series enable shadow virtqueue (SVQ) for vhost-vdpa devices. This
> > is intended as a new method of tracking the memory the devices touch
> > during a migration process: Instead of relay on vhost device's dirty
> > logging capability, SVQ intercepts the VQ dataplane forwarding the
> > descriptors between VM and device. This way qemu is the effective
> > writer of guests memory, like in qemu's virtio device operation.
> >
> > When SVQ is enabled qemu offers a new virtual address space to the
> > device to read and write into, and it maps new vrings and the guest
> > memory in it. SVQ also intercepts kicks and calls between the device
> > and the guest. Used buffers relay would cause dirty memory being
> > tracked, but at this RFC SVQ is not enabled on migration automatically.
> >
> > Thanks of being a buffers relay system, SVQ can be used also to
> > communicate devices and drivers with different capabilities, like
> > devices that only supports packed vring and not split and old guest
> > with no driver packed support.
> >
> > It is based on the ideas of DPDK SW assisted LM, in the series of
> > DPDK's https://patchwork.dpdk.org/cover/48370/ . However, these does
> > not map the shadow vq in guest's VA, but in qemu's.
> >
> > For qemu to use shadow virtqueues the guest virtio driver must not use
> > features like event_idx.
> >
> > SVQ needs to be enabled with QMP command:
> >
> > { "execute": "x-vhost-set-shadow-vq",
> > "arguments": { "name": "vhost-vdpa0", "enable": true } }
> >
> > This series includes some patches to delete in the final version that
> > helps with its testing. The first two of the series have been sent
> > sepparately but they haven't been included in qemu main branch.
> >
> > The two after them adds the feature to stop the device and be able to
> > set and get its status. It's intended to be used with vp_vpda driver in
> > a nested environment, so they are also external to this series. The
> > vp_vdpa driver also need modifications to forward the new status bit,
> > they will be proposed sepparately
> >
> > Patches 5-12 prepares the SVQ and QMP command to support guest to host
> > notifications forwarding. If the SVQ is enabled with these ones
> > applied and the device supports it, that part can be tested in
> > isolation (for example, with networking), hopping through SVQ.
> >
> > Same thing is true with patches 13-17, but with device to guest
> > notifications.
> >
> > Based on them, patches from 18 to 22 implement the actual buffer
> > forwarding, using some features already introduced in previous.
> > However, they will need a host device with no iommu, something that
> > is not available at the moment.
> >
> > The last part of the series uses properly the host iommu, so the driver
> > can access this new virtual address space created.
> >
> > Comments are welcome.
>
>
> I think we need do some benchmark to see the performance impact.
>
> Thanks
>
Ok, I will add them for the next revision.
Thanks!
>
> >
> > TODO:
> > * Event, indirect, packed, and others features of virtio.
> > * To sepparate buffers forwarding in its own AIO context, so we can
> > throw more threads to that task and we don't need to stop the main
> > event loop.
> > * Support multiqueue virtio-net vdpa.
> > * Proper documentation.
> >
> > Changes from v4 RFC:
> > * Support of allocating / freeing iova ranges in IOVA tree. Extending
> > already present iova-tree for that.
> > * Proper validation of guest features. Now SVQ can negotiate a
> > different set of features with the device when enabled.
> > * Support of host notifiers memory regions
> > * Handling of SVQ full queue in case guest's descriptors span to
> > different memory regions (qemu's VA chunks).
> > * Flush pending used buffers at end of SVQ operation.
> > * QMP command now looks by NetClientState name. Other devices will need
> > to implement it's way to enable vdpa.
> > * Rename QMP command to set, so it looks more like a way of working
> > * Better use of qemu error system
> > * Make a few assertions proper error-handling paths.
> > * Add more documentation
> > * Less coupling of virtio / vhost, that could cause friction on changes
> > * Addressed many other small comments and small fixes.
> >
> > Changes from v3 RFC:
> > * Move everything to vhost-vdpa backend. A big change, this allowed
> > some cleanup but more code has been added in other places.
> > * More use of glib utilities, especially to manage memory.
> > v3 link:
> > https://lists.nongnu.org/archive/html/qemu-devel/2021-05/msg06032.html
> >
> > Changes from v2 RFC:
> > * Adding vhost-vdpa devices support
> > * Fixed some memory leaks pointed by different comments
> > v2 link:
> > https://lists.nongnu.org/archive/html/qemu-devel/2021-03/msg05600.html
> >
> > Changes from v1 RFC:
> > * Use QMP instead of migration to start SVQ mode.
> > * Only accepting IOMMU devices, closer behavior with target devices
> > (vDPA)
> > * Fix invalid masking/unmasking of vhost call fd.
> > * Use of proper methods for synchronization.
> > * No need to modify VirtIO device code, all of the changes are
> > contained in vhost code.
> > * Delete superfluous code.
> > * An intermediate RFC was sent with only the notifications forwarding
> > changes. It can be seen in
> > https://patchew.org/QEMU/20210129205415.876290-1-eperezma@redhat.com/
> > v1 link:
> > https://lists.gnu.org/archive/html/qemu-devel/2020-11/msg05372.html
> >
> > Eugenio Pérez (20):
> > virtio: Add VIRTIO_F_QUEUE_STATE
> > virtio-net: Honor VIRTIO_CONFIG_S_DEVICE_STOPPED
> > virtio: Add virtio_queue_is_host_notifier_enabled
> > vhost: Make vhost_virtqueue_{start,stop} public
> > vhost: Add x-vhost-enable-shadow-vq qmp
> > vhost: Add VhostShadowVirtqueue
> > vdpa: Register vdpa devices in a list
> > vhost: Route guest->host notification through shadow virtqueue
> > Add vhost_svq_get_svq_call_notifier
> > Add vhost_svq_set_guest_call_notifier
> > vdpa: Save call_fd in vhost-vdpa
> > vhost-vdpa: Take into account SVQ in vhost_vdpa_set_vring_call
> > vhost: Route host->guest notification through shadow virtqueue
> > virtio: Add vhost_shadow_vq_get_vring_addr
> > vdpa: Save host and guest features
> > vhost: Add vhost_svq_valid_device_features to shadow vq
> > vhost: Shadow virtqueue buffers forwarding
> > vhost: Add VhostIOVATree
> > vhost: Use a tree to store memory mappings
> > vdpa: Add custom IOTLB translations to SVQ
> >
> > Eugenio Pérez (26):
> > util: Make some iova_tree parameters const
> > vhost: Fix last queue index of devices with no cvq
> > virtio: Add VIRTIO_F_QUEUE_STATE
> > virtio-net: Honor VIRTIO_CONFIG_S_DEVICE_STOPPED
> > vhost: Add x-vhost-set-shadow-vq qmp
> > vhost: Add VhostShadowVirtqueue
> > vdpa: Save kick_fd in vhost-vdpa
> > vdpa: Add vhost_svq_get_dev_kick_notifier
> > vdpa: Add vhost_svq_set_svq_kick_fd
> > vhost: Add Shadow VirtQueue kick forwarding capabilities
> > vhost: Handle host notifiers in SVQ
> > vhost: Route guest->host notification through shadow virtqueue
> > Add vhost_svq_get_svq_call_notifier
> > Add vhost_svq_set_guest_call_notifier
> > vdpa: Save call_fd in vhost-vdpa
> > vhost-vdpa: Take into account SVQ in vhost_vdpa_set_vring_call
> > vhost: Route host->guest notification through shadow virtqueue
> > virtio: Add vhost_shadow_vq_get_vring_addr
> > vdpa: ack VIRTIO_F_QUEUE_STATE if device supports it
> > vhost: Add vhost_svq_valid_device_features to shadow vq
> > vhost: Add vhost_svq_valid_guest_features to shadow vq
> > vhost: Shadow virtqueue buffers forwarding
> > util: Add iova_tree_alloc
> > vhost: Add VhostIOVATree
> > vhost: Use a tree to store memory mappings
> > vdpa: Add custom IOTLB translations to SVQ
> >
> > qapi/net.json | 20 +
> > hw/virtio/vhost-iova-tree.h | 27 +
> > hw/virtio/vhost-shadow-virtqueue.h | 44 ++
> > hw/virtio/virtio-pci.h | 1 +
> > include/hw/virtio/vhost-vdpa.h | 12 +
> > include/hw/virtio/virtio.h | 4 +-
> > include/qemu/iova-tree.h | 25 +-
> > .../standard-headers/linux/virtio_config.h | 5 +
> > include/standard-headers/linux/virtio_pci.h | 2 +
> > hw/i386/intel_iommu.c | 2 +-
> > hw/net/vhost_net.c | 2 +-
> > hw/net/virtio-net.c | 6 +-
> > hw/virtio/vhost-iova-tree.c | 157 ++++
> > hw/virtio/vhost-shadow-virtqueue.c | 746 ++++++++++++++++++
> > hw/virtio/vhost-vdpa.c | 437 +++++++++-
> > hw/virtio/virtio-pci.c | 16 +-
> > net/vhost-vdpa.c | 28 +
> > util/iova-tree.c | 151 +++-
> > hw/virtio/meson.build | 2 +-
> > 19 files changed, 1664 insertions(+), 23 deletions(-)
> > create mode 100644 hw/virtio/vhost-iova-tree.h
> > create mode 100644 hw/virtio/vhost-shadow-virtqueue.h
> > create mode 100644 hw/virtio/vhost-iova-tree.c
> > create mode 100644 hw/virtio/vhost-shadow-virtqueue.c
> >
>
© 2016 - 2026 Red Hat, Inc.