We plan to use it to be able to execute new qemu version and take over the contol over /dev/vhost-vsock file by reseting the owner and setting a new one. We expect not to lose any AF_VSOCK connection while this happens.
https://virtuozzo.atlassian.net/browse/VSTOR-98105 Signed-off-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com> --- drivers/vhost/vsock.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index ca6a95204b4a7..3654fa0fd5849 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -839,6 +839,34 @@ static int vhost_vsock_set_features(struct vhost_vsock *vsock, u64 features) return -EFAULT; } +static int vhost_vsock_reset_owner(struct vhost_vsock *vsock) +{ + struct vhost_iotlb *umem; + long err; + size_t i; + + mutex_lock(&vsock->dev.mutex); + err = vhost_dev_check_owner(&vsock->dev); + if (err) + goto done; + umem = vhost_dev_reset_owner_prepare(); + if (!umem) { + err = -ENOMEM; + goto done; + } + /* Follows vhost_vsock_dev_release closely except for guest_cid drop */ + vsock_for_each_connected_socket(&vhost_transport.transport, + vhost_vsock_reset_orphans); + vhost_vsock_drop_backends(vsock); + vhost_vsock_flush(vsock); + vhost_dev_stop(&vsock->dev); + virtio_vsock_skb_queue_purge(&vsock->send_pkt_queue); + vhost_dev_reset_owner(&vsock->dev, umem); +done: + mutex_unlock(&vsock->dev.mutex); + return err; +} + static long vhost_vsock_dev_ioctl(struct file *f, unsigned int ioctl, unsigned long arg) { @@ -882,6 +910,8 @@ static long vhost_vsock_dev_ioctl(struct file *f, unsigned int ioctl, return -EOPNOTSUPP; vhost_set_backend_features(&vsock->dev, features); return 0; + case VHOST_RESET_OWNER: + return vhost_vsock_reset_owner(vsock); default: mutex_lock(&vsock->dev.mutex); r = vhost_dev_ioctl(&vsock->dev, ioctl, argp); -- 2.48.1 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel