mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-04-27 19:35:32 +00:00
The virtio vsock driver has a small window during initialization where it can silently drop replies to connection requests. Because no reply is sent, kata waits for 10 seconds and in the end it generates a connection timeout error in HybridVSockDialer. Fixes: #8291 Signed-off-by: Alexandru Matei <alexandru.matei@uipath.com>
88 lines
2.3 KiB
Diff
88 lines
2.3 KiB
Diff
From bca7681a7c3461da21ceac2aab05b38a190f8a43 Mon Sep 17 00:00:00 2001
|
|
From: Stefano Garzarella <sgarzare@redhat.com>
|
|
Date: Thu, 28 Apr 2022 15:22:41 +0200
|
|
Subject: [PATCH 6/7] vsock/virtio: add support for device suspend/resume
|
|
|
|
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>
|
|
---
|
|
net/vmw_vsock/virtio_transport.c | 47 ++++++++++++++++++++++++++++++++
|
|
1 file changed, 47 insertions(+)
|
|
|
|
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
|
|
index dd4af6a56cad..793c4b1325f1 100644
|
|
--- a/net/vmw_vsock/virtio_transport.c
|
|
+++ b/net/vmw_vsock/virtio_transport.c
|
|
@@ -717,6 +717,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 },
|
|
@@ -733,6 +776,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)
|
|
--
|
|
2.34.1
|
|
|