Wrap the set_owner/reset_owner backend ops in dev-level helpers, matching other vhost_dev_* wrappers, so device code can take or release ownership without reaching into vhost_ops directly. vhost_dev_init() now uses vhost_dev_set_owner(). Both return -ENOSYS if the backend has no such op.
No functional change. These are used by the following vhost-vsock patch to hand a device between owners during CPR. Reviewed-by: Stefano Garzarella <[email protected]> Signed-off-by: Andrey Drobyshev <[email protected]> --- hw/virtio/vhost.c | 20 +++++++++++++++++++- include/hw/virtio/vhost.h | 25 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index dfdfd49da3f..56fa4345886 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -1703,6 +1703,24 @@ int vhost_dev_init_backend(struct vhost_dev *hdev, void *opaque, return 0; } +int vhost_dev_set_owner(struct vhost_dev *hdev) +{ + assert(hdev->vhost_ops); + if (!hdev->vhost_ops->vhost_set_owner) { + return -ENOSYS; + } + return hdev->vhost_ops->vhost_set_owner(hdev); +} + +int vhost_dev_reset_owner(struct vhost_dev *hdev) +{ + assert(hdev->vhost_ops); + if (!hdev->vhost_ops->vhost_reset_owner) { + return -ENOSYS; + } + return hdev->vhost_ops->vhost_reset_owner(hdev); +} + int vhost_dev_init(struct vhost_dev *hdev, void *opaque, VhostBackendType backend_type, uint32_t busyloop_timeout, Error **errp) @@ -1720,7 +1738,7 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque, goto fail; } - r = hdev->vhost_ops->vhost_set_owner(hdev); + r = vhost_dev_set_owner(hdev); if (r < 0) { error_setg_errno(errp, -r, "vhost_set_owner failed"); goto fail; diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h index b2b644c0d1c..8127a9a5a2c 100644 --- a/include/hw/virtio/vhost.h +++ b/include/hw/virtio/vhost.h @@ -178,6 +178,31 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque, int vhost_dev_init_backend(struct vhost_dev *hdev, void *opaque, VhostBackendType backend_type, Error **errp); +/** + * vhost_dev_set_owner() - take ownership of a vhost device + * @hdev: the common vhost_dev structure + * + * Issue VHOST_SET_OWNER on a device that has already been set up, e.g. to + * complete a CPR handoff on the destination, or to take the device back on + * the source after a failed CPR. + * + * Return: 0 on success, -ENOSYS if the backend has no such op, negative + * errno on failure. + */ +int vhost_dev_set_owner(struct vhost_dev *hdev); + +/** + * vhost_dev_reset_owner() - release ownership of a vhost device + * @hdev: the common vhost_dev structure + * + * Issue VHOST_RESET_OWNER so that another process can take the device over + * with vhost_dev_set_owner(), e.g. on the CPR source once the VM is stopped. + * + * Return: 0 on success, -ENOSYS if the backend has no such op, negative + * errno on failure. + */ +int vhost_dev_reset_owner(struct vhost_dev *hdev); + /** * vhost_dev_cleanup() - tear down and cleanup vhost interface * @hdev: the common vhost_dev structure -- 2.47.1
