[dpdk-dev] [PATCH] net/virtio: fix invalid indirect desc length

Marvin Liu yong.liu at intel.com
Thu Oct 15 07:46:07 CEST 2020


When transmitting indirect descriptors, first desc will store net_hdr
and following descs will be mapped to mbuf segments. Total desc number
will be seg_num plus one. Meaning of variable needed is the number of
used descs in packed ring. This value will always be two for indirect
desc. Now use mbuf segments number for calculating correct desc length.

Fixes: de8b3d238074 ("net/virtio: fix indirect descs in packed datapaths")
Cc: stable at dpdk.org

Signed-off-by: Marvin Liu <yong.liu at intel.com>

diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
index 8c8ab9889..42c4c9882 100644
--- a/drivers/net/virtio/virtqueue.h
+++ b/drivers/net/virtio/virtqueue.h
@@ -698,6 +698,7 @@ virtqueue_enqueue_xmit_packed(struct virtnet_tx *txvq, struct rte_mbuf *cookie,
 	struct virtio_net_hdr *hdr;
 	uint16_t prev;
 	bool prepend_header = false;
+	uint16_t seg_num = cookie->nb_segs;
 
 	id = in_order ? vq->vq_avail_idx : vq->vq_desc_head_idx;
 
@@ -732,7 +733,7 @@ virtqueue_enqueue_xmit_packed(struct virtnet_tx *txvq, struct rte_mbuf *cookie,
 		 */
 		start_dp[idx].addr  = txvq->virtio_net_hdr_mem +
 			RTE_PTR_DIFF(&txr[idx].tx_packed_indir, txr);
-		start_dp[idx].len   = (needed + 1) *
+		start_dp[idx].len   = (seg_num + 1) *
 			sizeof(struct vring_packed_desc);
 		/* reset flags for indirect desc */
 		head_flags = VRING_DESC_F_INDIRECT;
-- 
2.17.1



More information about the dev mailing list