]> git.droids-corp.org - dpdk.git/commitdiff
net/virtio: fix oversized packets in vectorized Rx
authorMarvin Liu <yong.liu@intel.com>
Sun, 26 Sep 2021 09:28:42 +0000 (17:28 +0800)
committerMaxime Coquelin <maxime.coquelin@redhat.com>
Thu, 21 Oct 2021 12:24:21 +0000 (14:24 +0200)
If packed ring size is not power of two, it is possible that remained
number less than one batch and meanwhile batch operation can pass.
This will cause incorrect remained number calculation and then lead to
receiving oversized packets. The patch fixed the issue by added
remained number check before batch operation.

Fixes: 77d66da83834 ("net/virtio: add vectorized packed ring Rx")
Cc: stable@dpdk.org
Signed-off-by: Marvin Liu <yong.liu@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
drivers/net/virtio/virtio_rxtx_packed.c

index ab489a58af3d781c68b3b460ce968d9fda9aa200..45cf39df2222b8e0802d4ec4c7ec9fe68658ab36 100644 (file)
@@ -95,11 +95,13 @@ virtio_recv_pkts_packed_vec(void *rx_queue,
                num = num - ((vq->vq_used_cons_idx + num) % PACKED_BATCH_SIZE);
 
        while (num) {
-               if (!virtqueue_dequeue_batch_packed_vec(rxvq,
-                                       &rx_pkts[nb_rx])) {
-                       nb_rx += PACKED_BATCH_SIZE;
-                       num -= PACKED_BATCH_SIZE;
-                       continue;
+               if (num >= PACKED_BATCH_SIZE) {
+                       if (!virtqueue_dequeue_batch_packed_vec(rxvq,
+                                               &rx_pkts[nb_rx])) {
+                               nb_rx += PACKED_BATCH_SIZE;
+                               num -= PACKED_BATCH_SIZE;
+                               continue;
+                       }
                }
                if (!virtqueue_dequeue_single_packed_vec(rxvq,
                                        &rx_pkts[nb_rx])) {