From: "Michael S. Tsirkin" <mst@redhat.com>
To: Laurent Vivier <lvivier@redhat.com>
Cc: qemu-devel@nongnu.org, Hanna Czenczek <hreitz@redhat.com>,
Jason Wang <jasowang@redhat.com>
Subject: Re: [PATCH] virtio-net: vhost-user: Implement internal migration
Date: Wed, 15 Jan 2025 05:10:53 -0500 [thread overview]
Message-ID: <20250115051039-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20241218143453.1573185-1-lvivier@redhat.com>
On Wed, Dec 18, 2024 at 03:34:53PM +0100, Laurent Vivier wrote:
> Add support of VHOST_USER_PROTOCOL_F_DEVICE_STATE in virtio-net
> with vhost-user backend.
>
> Cc: Hanna Czenczek <hreitz@redhat.com>
> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
Breaks windows builds:
https://gitlab.com/mstredhat/qemu/-/jobs/8855973625
> ---
> hw/net/virtio-net.c | 135 ++++++++++++++++++++++++++++++++++++--------
> 1 file changed, 112 insertions(+), 23 deletions(-)
>
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index 6e8c51a2dbce..b4d9e96dc0d7 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -3337,6 +3337,117 @@ static const VMStateDescription vmstate_virtio_net_rss = {
> },
> };
>
> +static struct vhost_dev *virtio_net_get_vhost(VirtIODevice *vdev)
> +{
> + VirtIONet *n = VIRTIO_NET(vdev);
> + NetClientState *nc;
> + struct vhost_net *net;
> +
> + if (!n->nic) {
> + return NULL;
> + }
> +
> + nc = qemu_get_queue(n->nic);
> + if (!nc) {
> + return NULL;
> + }
> +
> + net = get_vhost_net(nc->peer);
> + if (!net) {
> + return NULL;
> + }
> +
> + return &net->dev;
> +}
> +
> +static int vhost_user_net_save_state(QEMUFile *f, void *pv, size_t size,
> + const VMStateField *field,
> + JSONWriter *vmdesc)
> +{
> + VirtIONet *n = pv;
> + VirtIODevice *vdev = VIRTIO_DEVICE(n);
> + struct vhost_dev *vhdev;
> + Error *local_error = NULL;
> + int ret;
> +
> + vhdev = virtio_net_get_vhost(vdev);
> + if (vhdev == NULL) {
> + error_reportf_err(local_error,
> + "Error getting vhost back-end of %s device %s: ",
> + vdev->name, vdev->parent_obj.canonical_path);
> + return -1;
> + }
> +
> + ret = vhost_save_backend_state(vhdev, f, &local_error);
> + if (ret < 0) {
> + error_reportf_err(local_error,
> + "Error saving back-end state of %s device %s: ",
> + vdev->name, vdev->parent_obj.canonical_path);
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +static int vhost_user_net_load_state(QEMUFile *f, void *pv, size_t size,
> + const VMStateField *field)
> +{
> + VirtIONet *n = pv;
> + VirtIODevice *vdev = VIRTIO_DEVICE(n);
> + struct vhost_dev *vhdev;
> + Error *local_error = NULL;
> + int ret;
> +
> + vhdev = virtio_net_get_vhost(vdev);
> + if (vhdev == NULL) {
> + error_reportf_err(local_error,
> + "Error getting vhost back-end of %s device %s: ",
> + vdev->name, vdev->parent_obj.canonical_path);
> + return -1;
> + }
> +
> + ret = vhost_load_backend_state(vhdev, f, &local_error);
> + if (ret < 0) {
> + error_reportf_err(local_error,
> + "Error loading back-end state of %s device %s: ",
> + vdev->name, vdev->parent_obj.canonical_path);
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +static bool vhost_user_net_is_internal_migration(void *opaque)
> +{
> + VirtIONet *n = opaque;
> + VirtIODevice *vdev = VIRTIO_DEVICE(n);
> + struct vhost_dev *vhdev;
> +
> + vhdev = virtio_net_get_vhost(vdev);
> + if (vhdev == NULL) {
> + return false;
> + }
> +
> + return vhost_supports_device_state(vhdev);
> +}
> +
> +static const VMStateDescription vhost_user_net_backend_state = {
> + .name = "virtio-net-device/backend",
> + .version_id = 0,
> + .needed = vhost_user_net_is_internal_migration,
> + .fields = (const VMStateField[]) {
> + {
> + .name = "backend",
> + .info = &(const VMStateInfo) {
> + .name = "virtio-net vhost-user backend state",
> + .get = vhost_user_net_load_state,
> + .put = vhost_user_net_save_state,
> + },
> + },
> + VMSTATE_END_OF_LIST()
> + }
> +};
> +
> static const VMStateDescription vmstate_virtio_net_device = {
> .name = "virtio-net-device",
> .version_id = VIRTIO_NET_VM_VERSION,
> @@ -3389,6 +3500,7 @@ static const VMStateDescription vmstate_virtio_net_device = {
> },
> .subsections = (const VMStateDescription * const []) {
> &vmstate_virtio_net_rss,
> + &vhost_user_net_backend_state,
> NULL
> }
> };
> @@ -3950,29 +4062,6 @@ static bool dev_unplug_pending(void *opaque)
> return vdc->primary_unplug_pending(dev);
> }
>
> -static struct vhost_dev *virtio_net_get_vhost(VirtIODevice *vdev)
> -{
> - VirtIONet *n = VIRTIO_NET(vdev);
> - NetClientState *nc;
> - struct vhost_net *net;
> -
> - if (!n->nic) {
> - return NULL;
> - }
> -
> - nc = qemu_get_queue(n->nic);
> - if (!nc) {
> - return NULL;
> - }
> -
> - net = get_vhost_net(nc->peer);
> - if (!net) {
> - return NULL;
> - }
> -
> - return &net->dev;
> -}
> -
> static const VMStateDescription vmstate_virtio_net = {
> .name = "virtio-net",
> .minimum_version_id = VIRTIO_NET_VM_VERSION,
> --
> 2.47.1
next prev parent reply other threads:[~2025-01-15 10:11 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-18 14:34 [PATCH] virtio-net: vhost-user: Implement internal migration Laurent Vivier
2024-12-19 1:43 ` Lei Yang
2025-01-08 10:11 ` Laurent Vivier
2025-01-15 10:10 ` Michael S. Tsirkin [this message]
2025-01-15 10:59 ` Laurent Vivier
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=20250115051039-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=hreitz@redhat.com \
--cc=jasowang@redhat.com \
--cc=lvivier@redhat.com \
--cc=qemu-devel@nongnu.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.