Clear the device IOTLB when userspace clears VIRTIO_F_ACCESS_PLATFORM. Otherwise descriptor translation can continue to use mappings installed before the feature change. The common helper invalidates cached vring access and applies the transition even while a backend is attached. The backend remains attached, but userspace must configure the vring addresses for the new address mode after a successful live transition. Fixes: e13a6915a03f ("vhost/vsock: add IOTLB API support") Suggested-by: Michael S. Tsirkin Signed-off-by: Jia Jia --- drivers/vhost/vsock.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index 9aaab6bb8061..77a5a6775c86 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -854,6 +854,7 @@ static int vhost_vsock_set_cid(struct vhost_vsock *vsock, u64 guest_cid) static int vhost_vsock_set_features(struct vhost_vsock *vsock, u64 features) { struct vhost_virtqueue *vq; + int ret = -EFAULT; int i; if (features & ~VHOST_VSOCK_FEATURES) @@ -865,9 +866,12 @@ static int vhost_vsock_set_features(struct vhost_vsock *vsock, u64 features) goto err; } - if ((features & (1ULL << VIRTIO_F_ACCESS_PLATFORM))) { - if (vhost_init_device_iotlb(&vsock->dev)) + if (features & (1ULL << VIRTIO_F_ACCESS_PLATFORM)) { + ret = vhost_init_device_iotlb(&vsock->dev); + if (ret) goto err; + } else { + vhost_clear_device_iotlb(&vsock->dev); } vsock->seqpacket_allow = features & (1ULL << VIRTIO_VSOCK_F_SEQPACKET); @@ -883,7 +887,7 @@ static int vhost_vsock_set_features(struct vhost_vsock *vsock, u64 features) err: mutex_unlock(&vsock->dev.mutex); - return -EFAULT; + return ret; } static long vhost_vsock_dev_ioctl(struct file *f, unsigned int ioctl,