Projects
home:dongzhihai
qemu
_service:tar_scm:vhost-implement-vhost-vdpa-sus...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:vhost-implement-vhost-vdpa-suspend-resume.patch of Package qemu
From a7f9a67ee98a5261f7639619055034f40bccfef0 Mon Sep 17 00:00:00 2001 From: libai <libai12@huawei.com> Date: Mon, 4 Dec 2023 15:22:20 +0800 Subject: [PATCH] vhost: implement vhost-vdpa suspend/resume vhost-vdpa implements the vhost_dev_suspend interface, which will be called during the shutdown phase of the live migration source virtual machine to suspend the device but not reset the device information. vhost-vdpa implements the vhost_dev_resume interface. If the live migration fails, it will be called during the startup phase of the source virtual machine. Enable the device but set the status, etc. Signed-off-by: libai <libai12@huawei.com> --- hw/virtio/vhost-vdpa.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c index 037a9c6e4c..063e941544 100644 --- a/hw/virtio/vhost-vdpa.c +++ b/hw/virtio/vhost-vdpa.c @@ -1513,6 +1513,45 @@ static bool vhost_vdpa_force_iommu(struct vhost_dev *dev) return true; } +static int vhost_vdpa_suspend_device(struct vhost_dev *dev) +{ + struct vhost_vdpa *v = dev->opaque; + int ret; + + vhost_vdpa_svqs_stop(dev); + vhost_vdpa_host_notifiers_uninit(dev, dev->nvqs); + + if (dev->vq_index + dev->nvqs != dev->vq_index_end) { + return 0; + } + + ret = vhost_vdpa_call(dev, VHOST_VDPA_SUSPEND, NULL); + memory_listener_unregister(&v->listener); + return ret; +} + +static int vhost_vdpa_resume_device(struct vhost_dev *dev) +{ + struct vhost_vdpa *v = dev->opaque; + bool ok; + + vhost_vdpa_host_notifiers_init(dev); + ok = vhost_vdpa_svqs_start(dev); + if (unlikely(!ok)) { + return -1; + } + for (int i = 0; i < v->dev->nvqs; ++i) { + vhost_vdpa_set_vring_ready(v, v->dev->vq_index + i); + } + + if (dev->vq_index + dev->nvqs != dev->vq_index_end) { + return 0; + } + + memory_listener_register(&v->listener, &address_space_memory); + return vhost_vdpa_call(dev, VHOST_VDPA_RESUME, NULL); +} + static int vhost_vdpa_log_sync(struct vhost_dev *dev) { struct vhost_vdpa *v = dev->opaque; @@ -1559,4 +1598,6 @@ const VhostOps vdpa_ops = { .vhost_log_sync = vhost_vdpa_log_sync, .vhost_set_config_call = vhost_vdpa_set_config_call, .vhost_reset_status = vhost_vdpa_reset_status, + .vhost_dev_suspend = vhost_vdpa_suspend_device, + .vhost_dev_resume = vhost_vdpa_resume_device, }; -- 2.27.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2