From: "Eugenio Pérez" <eperezma@redhat.com>
To: qemu-devel@nongnu.org
Cc: Parav Pandit <parav@mellanox.com>,
Juan Quintela <quintela@redhat.com>,
Jason Wang <jasowang@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Markus Armbruster <armbru@redhat.com>,
virtualization@lists.linux-foundation.org,
Harpreet Singh Anand <hanand@xilinx.com>,
Xiao W Wang <xiao.w.wang@intel.com>,
Stefan Hajnoczi <stefanha@redhat.com>,
Eli Cohen <eli@mellanox.com>, Eric Blake <eblake@redhat.com>,
Michael Lilja <ml@napatech.com>,
Stefano Garzarella <sgarzare@redhat.com>
Subject: [RFC PATCH v4 00/20] vDPA shadow virtqueue
Date: Fri, 1 Oct 2021 09:05:43 +0200 [thread overview]
Message-ID: <20211001070603.307037-1-eperezma@redhat.com> (raw)
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 vring to the device to read
and write into, and 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.
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 or indirect descriptors. These limitations will
be addressed in later series, but they are left out for simplicity at
the moment.
SVQ needs to be enabled with QMP command:
{ "execute": "x-vhost-enable-shadow-vq",
"arguments": { "name": "dev0", "enable": true } }
This series includes some patches to delete in the final version that
helps with its testing. The first two of the series freely implements
the feature to stop the device and be able to retrieve its status. It's
intended to be used with vp_vpda driver in a nested environment. This
driver also need modifications to forward the new status bit.
Patches 2-8 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 9-13, but with device to guest
notifications.
The rest of the patches implements the actual buffer forwarding.
Comments are welcome.
TODO:
* Event, indirect, packed, and others features of virtio - Waiting for
confirmation of the big picture.
* Use already available iova tree to track mappings.
* 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.
* unmap iommu memory. Now the tree can only grow from SVQ enable, but
it should be fine as long as not a lot of memory is added to the
guest.
* Rebase on top of latest qemu (and, hopefully, on top of multiqueue
vdpa).
* Some assertions need to be appropiate error handling paths.
* Proper documentation.
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 (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
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: Check for device VRING_USED_F_NO_NOTIFY at shadow virtqueue
kick
vhost: Use VRING_AVAIL_F_NO_INTERRUPT at device call on shadow
virtqueue
vhost: Add VhostIOVATree
vhost: Use a tree to store memory mappings
vdpa: Add custom IOTLB translations to SVQ
qapi/net.json | 23 +
hw/virtio/vhost-iova-tree.h | 40 ++
hw/virtio/vhost-shadow-virtqueue.h | 37 ++
hw/virtio/virtio-pci.h | 1 +
include/hw/virtio/vhost-vdpa.h | 13 +
include/hw/virtio/vhost.h | 4 +
include/hw/virtio/virtio.h | 5 +-
.../standard-headers/linux/virtio_config.h | 5 +
include/standard-headers/linux/virtio_pci.h | 2 +
hw/net/virtio-net.c | 6 +-
hw/virtio/vhost-iova-tree.c | 230 +++++++
hw/virtio/vhost-shadow-virtqueue.c | 619 ++++++++++++++++++
hw/virtio/vhost-vdpa.c | 412 +++++++++++-
hw/virtio/vhost.c | 12 +-
hw/virtio/virtio-pci.c | 16 +-
hw/virtio/virtio.c | 5 +
hw/virtio/meson.build | 2 +-
hw/virtio/trace-events | 1 +
18 files changed, 1413 insertions(+), 20 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
next reply other threads:[~2021-10-01 7:13 UTC|newest]
Thread overview: 90+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-01 7:05 Eugenio Pérez [this message]
2021-10-01 7:05 ` [RFC PATCH v4 01/20] virtio: Add VIRTIO_F_QUEUE_STATE Eugenio Pérez
2021-10-01 7:05 ` [RFC PATCH v4 02/20] virtio-net: Honor VIRTIO_CONFIG_S_DEVICE_STOPPED Eugenio Pérez
2021-10-01 7:05 ` [RFC PATCH v4 03/20] virtio: Add virtio_queue_is_host_notifier_enabled Eugenio Pérez
2021-10-01 7:05 ` [RFC PATCH v4 04/20] vhost: Make vhost_virtqueue_{start,stop} public Eugenio Pérez
2021-10-01 7:05 ` [RFC PATCH v4 05/20] vhost: Add x-vhost-enable-shadow-vq qmp Eugenio Pérez
2021-10-12 5:18 ` Markus Armbruster
2021-10-12 13:08 ` Eugenio Perez Martin
2021-10-12 13:45 ` Markus Armbruster
2021-10-14 12:01 ` Eugenio Perez Martin
2021-10-01 7:05 ` [RFC PATCH v4 06/20] vhost: Add VhostShadowVirtqueue Eugenio Pérez
2021-10-01 7:05 ` [RFC PATCH v4 07/20] vdpa: Register vdpa devices in a list Eugenio Pérez
2021-10-01 7:05 ` [RFC PATCH v4 08/20] vhost: Route guest->host notification through shadow virtqueue Eugenio Pérez
2021-10-12 5:19 ` Markus Armbruster
2021-10-12 13:09 ` Eugenio Perez Martin
2021-10-13 3:27 ` Jason Wang
2021-10-14 12:00 ` Eugenio Perez Martin
2021-10-15 3:45 ` Jason Wang
2021-10-15 9:08 ` Eugenio Perez Martin
2021-10-15 18:21 ` Eugenio Perez Martin
2021-10-01 7:05 ` [RFC PATCH v4 09/20] vdpa: Save call_fd in vhost-vdpa Eugenio Pérez
2021-10-13 3:43 ` Jason Wang
2021-10-14 12:11 ` Eugenio Perez Martin
2021-10-01 7:05 ` [RFC PATCH v4 10/20] vhost-vdpa: Take into account SVQ in vhost_vdpa_set_vring_call Eugenio Pérez
2021-10-13 3:43 ` Jason Wang
2021-10-14 12:18 ` Eugenio Perez Martin
2021-10-01 7:05 ` [RFC PATCH v4 11/20] vhost: Route host->guest notification through shadow virtqueue Eugenio Pérez
2021-10-13 3:47 ` Jason Wang
2021-10-14 16:39 ` Eugenio Perez Martin
2021-10-15 4:42 ` Jason Wang
2021-10-19 8:39 ` Eugenio Perez Martin
2021-10-20 2:01 ` Jason Wang
2021-10-20 6:36 ` Eugenio Perez Martin
2021-10-13 3:49 ` Jason Wang
2021-10-14 15:58 ` Eugenio Perez Martin
2021-10-15 4:24 ` Jason Wang
2021-10-01 7:05 ` [RFC PATCH v4 12/20] virtio: Add vhost_shadow_vq_get_vring_addr Eugenio Pérez
2021-10-13 3:54 ` Jason Wang
2021-10-14 14:39 ` Eugenio Perez Martin
2021-10-01 7:05 ` [RFC PATCH v4 13/20] vdpa: Save host and guest features Eugenio Pérez
2021-10-13 3:56 ` Jason Wang
2021-10-14 15:03 ` Eugenio Perez Martin
2021-10-01 7:05 ` [RFC PATCH v4 14/20] vhost: Add vhost_svq_valid_device_features to shadow vq Eugenio Pérez
2021-10-01 7:05 ` [RFC PATCH v4 15/20] vhost: Shadow virtqueue buffers forwarding Eugenio Pérez
2021-10-12 5:21 ` Markus Armbruster
2021-10-12 13:28 ` Eugenio Perez Martin
2021-10-12 13:48 ` Markus Armbruster
2021-10-14 15:04 ` Eugenio Perez Martin
2021-10-13 4:31 ` Jason Wang
2021-10-14 17:56 ` Eugenio Perez Martin
2021-10-15 4:23 ` Jason Wang
2021-10-15 9:33 ` Eugenio Perez Martin
2021-10-01 7:05 ` [RFC PATCH v4 16/20] vhost: Check for device VRING_USED_F_NO_NOTIFY at shadow virtqueue kick Eugenio Pérez
2021-10-13 4:35 ` Jason Wang
2021-10-15 6:17 ` Eugenio Perez Martin
2021-10-01 7:06 ` [RFC PATCH v4 17/20] vhost: Use VRING_AVAIL_F_NO_INTERRUPT at device call on shadow virtqueue Eugenio Pérez
2021-10-13 4:36 ` Jason Wang
2021-10-15 6:22 ` Eugenio Perez Martin
2021-10-01 7:06 ` [RFC PATCH v4 18/20] vhost: Add VhostIOVATree Eugenio Pérez
2021-10-19 8:32 ` Jason Wang
2021-10-19 9:22 ` Jason Wang
2021-10-20 7:54 ` Eugenio Perez Martin
2021-10-20 9:01 ` Jason Wang
2021-10-20 12:06 ` Eugenio Perez Martin
2021-10-21 2:34 ` Jason Wang
2021-10-21 7:03 ` Eugenio Perez Martin
2021-10-21 8:12 ` Jason Wang
2021-10-21 14:33 ` Eugenio Perez Martin
2021-10-26 4:29 ` Jason Wang
2021-10-20 7:36 ` Eugenio Perez Martin
2021-10-01 7:06 ` [RFC PATCH v4 19/20] vhost: Use a tree to store memory mappings Eugenio Pérez
2021-10-01 7:06 ` [RFC PATCH v4 20/20] vdpa: Add custom IOTLB translations to SVQ Eugenio Pérez
2021-10-13 5:34 ` Jason Wang
2021-10-15 7:27 ` Eugenio Perez Martin
2021-10-15 7:37 ` Jason Wang
2021-10-15 8:20 ` Eugenio Perez Martin
2021-10-15 8:37 ` Jason Wang
2021-10-15 9:14 ` Eugenio Perez Martin
2021-10-19 9:24 ` Jason Wang
2021-10-19 10:28 ` Eugenio Perez Martin
2021-10-20 2:02 ` Jason Wang
2021-10-20 2:07 ` Jason Wang
2021-10-20 6:51 ` Eugenio Perez Martin
2021-10-20 9:03 ` Jason Wang
2021-10-20 11:56 ` Eugenio Perez Martin
2021-10-21 2:38 ` Jason Wang
2021-10-26 4:32 ` Jason Wang
2021-10-12 3:59 ` [RFC PATCH v4 00/20] vDPA shadow virtqueue Jason Wang
2021-10-12 4:06 ` Jason Wang
2021-10-12 9:09 ` Eugenio Perez Martin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211001070603.307037-1-eperezma@redhat.com \
--to=eperezma@redhat.com \
--cc=armbru@redhat.com \
--cc=eblake@redhat.com \
--cc=eli@mellanox.com \
--cc=hanand@xilinx.com \
--cc=jasowang@redhat.com \
--cc=ml@napatech.com \
--cc=mst@redhat.com \
--cc=parav@mellanox.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=sgarzare@redhat.com \
--cc=stefanha@redhat.com \
--cc=virtualization@lists.linux-foundation.org \
--cc=xiao.w.wang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).