On 6/16/26 4:48 PM, Stefano Garzarella wrote:
> On Fri, Jun 12, 2026 at 07:57:16PM +0300, Andrey Drobyshev wrote:
>> From: Pavel Tikhomirov <[email protected]>
>>
>> This ioctl is needed for QEMU's CPR (checkpoint-restore) migration of
>> the guest with vhost-vsock device.  For this to work, we need to reset
>> the device ownership on the source side by calling RESET_OWNER, and then
>> claim it on the dest side by calling SET_OWNER.  We expect not to lose any
>> AF_VSOCK connection while this happens.
>>
>> Signed-off-by: Pavel Tikhomirov <[email protected]>
>> ---
>> drivers/vhost/vsock.c | 28 ++++++++++++++++++++++++++++
>> 1 file changed, 28 insertions(+)
>>
>> diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
>> index b12221ce6faf..e629886e5cf8 100644
>> --- a/drivers/vhost/vsock.c
>> +++ b/drivers/vhost/vsock.c
>> @@ -894,6 +894,32 @@ 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;
>> +
>> +    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);
> 
> In vhost_vsock_reset_orphans() we have:
> 
>       rcu_read_lock();
> 
>       /* If the peer is still valid, no need to reset connection */
>       if (vhost_vsock_get(vsk->remote_addr.svm_cid, sock_net(sk))) {
>               rcu_read_unlock();
>               return;
>       }
> 
> IIUC we are not removing the guest cid from the hash table, so this 
> check will be always true, and nothing is done.
> 
> So, is this call really useful?
>

You're right, and it's most probably an artifact from mimicking the
vhost_vsock_dev_release() implementation, as mentioned in the comment.
In our case this whole iteration is a no-op, we better remove it.

BTW earlier I received some feedback from Sashiko AI reviewer, which
also spotted that same issue (and some more interesting races):

https://sashiko.dev/#/patchset/[email protected]

Apparently it only CC's its reviews to [email protected] so you can't
see them right away.  Just wanted to let you know to save your time
here.  I'll send a v2 with respect to Sashiko remarks.  But of course
would be great if you spot some more issues here.


>> +    vhost_vsock_drop_backends(vsock);
>> +    vhost_vsock_flush(vsock);
>> +    vhost_dev_stop(&vsock->dev);
>> +    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)
>> {
>> @@ -937,6 +963,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.47.1
>>
> 


Reply via email to