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 ab489a5..45cf39d 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])) {