Skip to content

Commit

Permalink
vsock/virtio: add support for device suspend/resume
Browse files Browse the repository at this point in the history
Implement .freeze and .restore callbacks of struct virtio_driver
to support device suspend/resume.

During suspension all connected sockets are reset and VQs deleted.
During resume the VQs are re-initialized.

Reported by: Vilas R K <vilas.r.k@intel.com>
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Stefano Garzarella authored and Jakub Kicinski committed May 2, 2022
1 parent a103209 commit bd50c5d
Showing 1 changed file with 47 additions and 0 deletions.
47 changes: 47 additions & 0 deletions net/vmw_vsock/virtio_transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -743,6 +743,49 @@ static void virtio_vsock_remove(struct virtio_device *vdev)
kfree(vsock);
}

#ifdef CONFIG_PM_SLEEP
static int virtio_vsock_freeze(struct virtio_device *vdev)
{
struct virtio_vsock *vsock = vdev->priv;

mutex_lock(&the_virtio_vsock_mutex);

rcu_assign_pointer(the_virtio_vsock, NULL);
synchronize_rcu();

virtio_vsock_vqs_del(vsock);

mutex_unlock(&the_virtio_vsock_mutex);

return 0;
}

static int virtio_vsock_restore(struct virtio_device *vdev)
{
struct virtio_vsock *vsock = vdev->priv;
int ret;

mutex_lock(&the_virtio_vsock_mutex);

/* Only one virtio-vsock device per guest is supported */
if (rcu_dereference_protected(the_virtio_vsock,
lockdep_is_held(&the_virtio_vsock_mutex))) {
ret = -EBUSY;
goto out;
}

ret = virtio_vsock_vqs_init(vsock);
if (ret < 0)
goto out;

rcu_assign_pointer(the_virtio_vsock, vsock);

out:
mutex_unlock(&the_virtio_vsock_mutex);
return ret;
}
#endif /* CONFIG_PM_SLEEP */

static struct virtio_device_id id_table[] = {
{ VIRTIO_ID_VSOCK, VIRTIO_DEV_ANY_ID },
{ 0 },
Expand All @@ -760,6 +803,10 @@ static struct virtio_driver virtio_vsock_driver = {
.id_table = id_table,
.probe = virtio_vsock_probe,
.remove = virtio_vsock_remove,
#ifdef CONFIG_PM_SLEEP
.freeze = virtio_vsock_freeze,
.restore = virtio_vsock_restore,
#endif
};

static int __init virtio_vsock_init(void)
Expand Down

0 comments on commit bd50c5d

Please sign in to comment.