Messages in this thread | | | Date | Fri, 29 Mar 2024 17:22:00 +0100 | From | Stefano Garzarella <> | Subject | Re: [PATCH net v2] vsock/virtio: fix packet delivery to tap device |
| |
On Fri, Mar 29, 2024 at 05:12:59PM +0100, Marco Pinna wrote: >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> >--- > net/vmw_vsock/virtio_transport.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-)
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
> >diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c >index 1748268e0694..ee5d306a96d0 100644 >--- a/net/vmw_vsock/virtio_transport.c >+++ b/net/vmw_vsock/virtio_transport.c >@@ -120,7 +120,6 @@ virtio_transport_send_pkt_work(struct work_struct *work) > if (!skb) > break; > >- virtio_transport_deliver_tap_pkt(skb); > reply = virtio_vsock_skb_reply(skb); > sgs = vsock->out_sgs; > sg_init_one(sgs[out_sg], virtio_vsock_hdr(skb), >@@ -170,6 +169,8 @@ virtio_transport_send_pkt_work(struct work_struct *work) > break; > } > >+ virtio_transport_deliver_tap_pkt(skb); >+ > if (reply) { > struct virtqueue *rx_vq = vsock->vqs[VSOCK_VQ_RX]; > int val; >-- >2.44.0 >
| |