net/virtio: fix incorrect slots number when indirect feature on
Checks
Commit Message
Virtio driver only occupies one slot for enqueuing chained mbufs when
indirect feature is on. Required slots calculation should depend on
indirect feature status at the end.
Fixes: 0eaf7fc2fe8e ("net/virtio: separate AVX Rx/Tx")
Cc: stable@dpdk.org
Signed-off-by: Marvin Liu <yong.liu@intel.com>
Comments
On 1/20/22 13:22, Marvin Liu wrote:
> Virtio driver only occupies one slot for enqueuing chained mbufs when
> indirect feature is on. Required slots calculation should depend on
> indirect feature status at the end.
>
> Fixes: 0eaf7fc2fe8e ("net/virtio: separate AVX Rx/Tx")
> Cc: stable@dpdk.org
>
> Signed-off-by: Marvin Liu <yong.liu@intel.com>
>
> diff --git a/drivers/net/virtio/virtio_rxtx_packed.h b/drivers/net/virtio/virtio_rxtx_packed.h
> index d5c259a1f6..536112983c 100644
> --- a/drivers/net/virtio/virtio_rxtx_packed.h
> +++ b/drivers/net/virtio/virtio_rxtx_packed.h
> @@ -125,13 +125,12 @@ virtqueue_enqueue_single_packed_vec(struct virtnet_tx *txvq,
> * any_layout => number of segments
> * default => number of segments + 1
> */
> - slots = use_indirect ? 1 : (txm->nb_segs + !can_push);
> can_push = rte_mbuf_refcnt_read(txm) == 1 &&
> RTE_MBUF_DIRECT(txm) &&
> txm->nb_segs == 1 &&
> rte_pktmbuf_headroom(txm) >= hdr_size;
>
> - slots = txm->nb_segs + !can_push;
> + slots = use_indirect ? 1 : (txm->nb_segs + !can_push);
> need = slots - vq->vq_free_cnt;
>
> /* Positive value indicates it need free vring descriptors */
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Thanks,
Maxime
On 1/20/22 13:22, Marvin Liu wrote:
> Virtio driver only occupies one slot for enqueuing chained mbufs when
> indirect feature is on. Required slots calculation should depend on
> indirect feature status at the end.
>
> Fixes: 0eaf7fc2fe8e ("net/virtio: separate AVX Rx/Tx")
> Cc: stable@dpdk.org
>
> Signed-off-by: Marvin Liu <yong.liu@intel.com>
>
> diff --git a/drivers/net/virtio/virtio_rxtx_packed.h b/drivers/net/virtio/virtio_rxtx_packed.h
> index d5c259a1f6..536112983c 100644
> --- a/drivers/net/virtio/virtio_rxtx_packed.h
> +++ b/drivers/net/virtio/virtio_rxtx_packed.h
> @@ -125,13 +125,12 @@ virtqueue_enqueue_single_packed_vec(struct virtnet_tx *txvq,
> * any_layout => number of segments
> * default => number of segments + 1
> */
> - slots = use_indirect ? 1 : (txm->nb_segs + !can_push);
> can_push = rte_mbuf_refcnt_read(txm) == 1 &&
> RTE_MBUF_DIRECT(txm) &&
> txm->nb_segs == 1 &&
> rte_pktmbuf_headroom(txm) >= hdr_size;
>
> - slots = txm->nb_segs + !can_push;
> + slots = use_indirect ? 1 : (txm->nb_segs + !can_push);
> need = slots - vq->vq_free_cnt;
>
> /* Positive value indicates it need free vring descriptors */
Applied to dpdk-next-virtio/main.
Thanks,
Maxime
@@ -125,13 +125,12 @@ virtqueue_enqueue_single_packed_vec(struct virtnet_tx *txvq,
* any_layout => number of segments
* default => number of segments + 1
*/
- slots = use_indirect ? 1 : (txm->nb_segs + !can_push);
can_push = rte_mbuf_refcnt_read(txm) == 1 &&
RTE_MBUF_DIRECT(txm) &&
txm->nb_segs == 1 &&
rte_pktmbuf_headroom(txm) >= hdr_size;
- slots = txm->nb_segs + !can_push;
+ slots = use_indirect ? 1 : (txm->nb_segs + !can_push);
need = slots - vq->vq_free_cnt;
/* Positive value indicates it need free vring descriptors */