Stefano Garzarella
2022-Mar-23 17:36 UTC
[PATCH net v3 0/3] vsock/virtio: enable VQs early on probe and finish the setup before using them
The first patch fixes a virtio-spec violation. The other two patches complete the driver configuration before using the VQs in the probe. The patch order should simplify backporting in stable branches. v3: - re-ordered the patch to improve bisectability [MST] v2: https://lore.kernel.org/netdev/20220323084954.11769-1-sgarzare at redhat.com/ v1: https://lore.kernel.org/netdev/20220322103823.83411-1-sgarzare at redhat.com/ Stefano Garzarella (3): vsock/virtio: initialize vdev->priv before using VQs vsock/virtio: read the negotiated features before using VQs vsock/virtio: enable VQs early on probe net/vmw_vsock/virtio_transport.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) -- 2.35.1
Stefano Garzarella
2022-Mar-23 17:36 UTC
[PATCH net v3 1/3] vsock/virtio: initialize vdev->priv before using VQs
When we fill VQs with empty buffers and kick the host, it may send
an interrupt. `vdev->priv` must be initialized before this since it
is used in the virtqueue callbacks.
Fixes: 0deab087b16a ("vsock/virtio: use RCU to avoid use-after-free on
the_virtio_vsock")
Suggested-by: Michael S. Tsirkin <mst at redhat.com>
Signed-off-by: Stefano Garzarella <sgarzare at redhat.com>
---
net/vmw_vsock/virtio_transport.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index 5afc194a58bb..3e5513934c9f 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -622,6 +622,8 @@ static int virtio_vsock_probe(struct virtio_device *vdev)
INIT_WORK(&vsock->event_work, virtio_transport_event_work);
INIT_WORK(&vsock->send_pkt_work, virtio_transport_send_pkt_work);
+ vdev->priv = vsock;
+
mutex_lock(&vsock->tx_lock);
vsock->tx_run = true;
mutex_unlock(&vsock->tx_lock);
@@ -639,7 +641,6 @@ static int virtio_vsock_probe(struct virtio_device *vdev)
if (virtio_has_feature(vdev, VIRTIO_VSOCK_F_SEQPACKET))
vsock->seqpacket_allow = true;
- vdev->priv = vsock;
rcu_assign_pointer(the_virtio_vsock, vsock);
mutex_unlock(&the_virtio_vsock_mutex);
--
2.35.1
Stefano Garzarella
2022-Mar-23 17:36 UTC
[PATCH net v3 2/3] vsock/virtio: read the negotiated features before using VQs
Complete the driver configuration, reading the negotiated features,
before using the VQs in the virtio_vsock_probe().
Fixes: 53efbba12cc7 ("virtio/vsock: enable SEQPACKET for transport")
Suggested-by: Michael S. Tsirkin <mst at redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha at redhat.com>
Signed-off-by: Stefano Garzarella <sgarzare at redhat.com>
---
net/vmw_vsock/virtio_transport.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index 3e5513934c9f..3954d3be9083 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -622,6 +622,9 @@ static int virtio_vsock_probe(struct virtio_device *vdev)
INIT_WORK(&vsock->event_work, virtio_transport_event_work);
INIT_WORK(&vsock->send_pkt_work, virtio_transport_send_pkt_work);
+ if (virtio_has_feature(vdev, VIRTIO_VSOCK_F_SEQPACKET))
+ vsock->seqpacket_allow = true;
+
vdev->priv = vsock;
mutex_lock(&vsock->tx_lock);
@@ -638,9 +641,6 @@ static int virtio_vsock_probe(struct virtio_device *vdev)
vsock->event_run = true;
mutex_unlock(&vsock->event_lock);
- if (virtio_has_feature(vdev, VIRTIO_VSOCK_F_SEQPACKET))
- vsock->seqpacket_allow = true;
-
rcu_assign_pointer(the_virtio_vsock, vsock);
mutex_unlock(&the_virtio_vsock_mutex);
--
2.35.1
Stefano Garzarella
2022-Mar-23 17:36 UTC
[PATCH net v3 3/3] vsock/virtio: enable VQs early on probe
virtio spec requires drivers to set DRIVER_OK before using VQs.
This is set automatically after probe returns, but virtio-vsock
driver uses VQs in the probe function to fill rx and event VQs
with new buffers.
Let's fix this, calling virtio_device_ready() before using VQs
in the probe function.
Fixes: 0ea9e1d3a9e3 ("VSOCK: Introduce virtio_transport.ko")
Signed-off-by: Stefano Garzarella <sgarzare at redhat.com>
---
net/vmw_vsock/virtio_transport.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index 3954d3be9083..ba1c8cc0c467 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -627,6 +627,8 @@ static int virtio_vsock_probe(struct virtio_device *vdev)
vdev->priv = vsock;
+ virtio_device_ready(vdev);
+
mutex_lock(&vsock->tx_lock);
vsock->tx_run = true;
mutex_unlock(&vsock->tx_lock);
--
2.35.1
Michael S. Tsirkin
2022-Mar-23 22:37 UTC
[PATCH net v3 0/3] vsock/virtio: enable VQs early on probe and finish the setup before using them
On Wed, Mar 23, 2022 at 06:36:22PM +0100, Stefano Garzarella wrote:> The first patch fixes a virtio-spec violation. The other two patches > complete the driver configuration before using the VQs in the probe. > > The patch order should simplify backporting in stable branches.Series: Acked-by: Michael S. Tsirkin <mst at redhat.com>> v3: > - re-ordered the patch to improve bisectability [MST] > > v2: https://lore.kernel.org/netdev/20220323084954.11769-1-sgarzare at redhat.com/ > v1: https://lore.kernel.org/netdev/20220322103823.83411-1-sgarzare at redhat.com/ > > Stefano Garzarella (3): > vsock/virtio: initialize vdev->priv before using VQs > vsock/virtio: read the negotiated features before using VQs > vsock/virtio: enable VQs early on probe > > net/vmw_vsock/virtio_transport.c | 11 +++++++---- > 1 file changed, 7 insertions(+), 4 deletions(-) > > -- > 2.35.1
Stefan Hajnoczi
2022-Mar-24 09:20 UTC
[PATCH net v3 0/3] vsock/virtio: enable VQs early on probe and finish the setup before using them
On Wed, Mar 23, 2022 at 06:36:22PM +0100, Stefano Garzarella wrote:> The first patch fixes a virtio-spec violation. The other two patches > complete the driver configuration before using the VQs in the probe. > > The patch order should simplify backporting in stable branches. > > v3: > - re-ordered the patch to improve bisectability [MST] > > v2: https://lore.kernel.org/netdev/20220323084954.11769-1-sgarzare at redhat.com/ > v1: https://lore.kernel.org/netdev/20220322103823.83411-1-sgarzare at redhat.com/ > > Stefano Garzarella (3): > vsock/virtio: initialize vdev->priv before using VQs > vsock/virtio: read the negotiated features before using VQs > vsock/virtio: enable VQs early on probe > > net/vmw_vsock/virtio_transport.c | 11 +++++++---- > 1 file changed, 7 insertions(+), 4 deletions(-) > > -- > 2.35.1 >A subtle point is that we still drop events and rx packets during the window where DRIVER_OK has been set but vqs haven't been filled. This is acceptable because it's unavoidable and equivalent to events happening before DRIVER_OK is set. What this revision *does* fix is that vq used buffer notifications are no longer lost. Good. Reviewed-by: Stefan Hajnoczi <stefanha at redhat.com> -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 488 bytes Desc: not available URL: <http://lists.linuxfoundation.org/pipermail/virtualization/attachments/20220324/b8c143e9/attachment.sig>