net/virtio: fix invalid indirect desc length

Message ID 20201015054607.57325-1-yong.liu@intel.com (mailing list archive)
State Accepted, archived
Delegated to: Maxime Coquelin
Headers
Series net/virtio: fix invalid indirect desc length |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/iol-testing success Testing PASS
ci/iol-broadcom-Functional fail Functional Testing issues
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-intel-Functional fail Functional Testing issues
ci/iol-intel-Performance success Performance Testing PASS
ci/travis-robot success Travis build: passed
ci/iol-mellanox-Performance success Performance Testing PASS

Commit Message

Marvin Liu Oct. 15, 2020, 5:46 a.m. UTC
  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@dpdk.org

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

Comments

Maxime Coquelin Oct. 15, 2020, 10:48 a.m. UTC | #1
On 10/15/20 7:46 AM, Marvin Liu wrote:
> 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@dpdk.org
> 
> Signed-off-by: Marvin Liu <yong.liu@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;
> 

Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

Thanks,
Maxime
  
Maxime Coquelin Oct. 15, 2020, 3:40 p.m. UTC | #2
On 10/15/20 7:46 AM, Marvin Liu wrote:
> 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@dpdk.org
> 
> Signed-off-by: Marvin Liu <yong.liu@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;
> 

Applied to dpdk-next-virtio/main.

Thanks,
Maxime
  

Patch

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;