| Patch-mainline: v6.9-rc3 |
| Git-commit: b32a09ea7c38849ff925489a6bf5bd8914bc45df |
| References: git-fixes |
| From: Marco Pinna <marco.pinn95@gmail.com> |
| Date: Fri, 29 Mar 2024 17:12:59 +0100 |
| Subject: [PATCH] vsock/virtio: fix packet delivery to tap device |
| |
| Commit 82dfb540aeb2 ("VSOCK: Add virtio vsock vsockmon hooks") added |
| virtio_transport_deliver_tap_pkt() for handing packets to the |
| vsockmon device. However, in virtio_transport_send_pkt_work(), |
| the function is called before actually sending the packet (i.e. |
| before placing it in the virtqueue with virtqueue_add_sgs() and checking |
| whether it returned successfully). |
| Queuing the packet in the virtqueue can fail even multiple times. |
| However, in virtio_transport_deliver_tap_pkt() we deliver the packet |
| to the monitoring tap interface only the first time we call it. |
| This certainly avoids seeing the same packet replicated multiple times |
| in the monitoring interface, but it can show the packet sent with the |
| wrong timestamp or even before we succeed to queue it in the virtqueue. |
| |
| Move virtio_transport_deliver_tap_pkt() after calling virtqueue_add_sgs() |
| and making sure it returned successfully. |
| |
| Fixes: 82dfb540aeb2 ("VSOCK: Add virtio vsock vsockmon hooks") |
| Cc: stable@vge.kernel.org |
| Signed-off-by: Marco Pinna <marco.pinn95@gmail.com> |
| Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> |
| Link: https://lore.kernel.org/r/20240329161259.411751-1-marco.pinn95@gmail.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Juergen Gross <jgross@suse.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 1748268e0694..ee5d306a96d0 100644 |
| |
| |
| @@ -120,7 +120,6 @@ virtio_transport_send_pkt_work(struct work_struct *work) |
| list_del_init(&pkt->list); |
| spin_unlock_bh(&vsock->send_pkt_list_lock); |
| |
| - virtio_transport_deliver_tap_pkt(pkt); |
| |
| reply = pkt->reply; |
| |
| @@ -170,6 +169,8 @@ virtio_transport_send_pkt_work(struct work_struct *work) |
| break; |
| } |
| |
| + virtio_transport_deliver_tap_pkt(pkt); |
| + |
| if (reply) { |
| struct virtqueue *rx_vq = vsock->vqs[VSOCK_VQ_RX]; |
| int val; |
| -- |
| 2.35.3 |
| |