On Thu, Jan 18, 2018 at 10:07:32AM +0100, Olivier Matz wrote:
> Rationalize the function virtio_dev_free_mbufs():
> 
> - skip NULL vqs instead of crashing: this is required for the
>   next commit
> - use the same kind of loop than in virtio_free_queues()
> - also flush mbufs from the control queue (this is useless yet)
> - factorize common code between rxq, txq, cq
> 
> Cc: sta...@dpdk.org
> 
> Signed-off-by: Olivier Matz <olivier.m...@6wind.com>
> ---
>  drivers/net/virtio/virtio_ethdev.c | 55 
> ++++++++++++++++++--------------------
>  1 file changed, 26 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_ethdev.c 
> b/drivers/net/virtio/virtio_ethdev.c
> index c7426951c..d8b3b8ed7 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -1868,47 +1868,44 @@ virtio_dev_start(struct rte_eth_dev *dev)
>  
>  static void virtio_dev_free_mbufs(struct rte_eth_dev *dev)
>  {
[...]
>  
> -             mbuf_num = 0;
> -             while ((buf = virtqueue_detach_unused(txvq->vq)) != NULL) {
> +             while ((buf = virtqueue_detach_unused(vq)) != NULL) {

Thanks for working on this! The virtqueue_detach_unused() can't
handle the vector Rx case correctly. Because vq->vq_descx[] is
initialized for vector Rx, but isn't updated by the vector Rx.
So together with the next commit, it may cause problems during
dev_stop/dev_configure/dev_start if vector Rx is used.

Thanks,
Tiwei

>                       rte_pktmbuf_free(buf);
>                       mbuf_num++;
>               }
>  
> -             PMD_INIT_LOG(DEBUG, "free %d mbufs", mbuf_num);
>               PMD_INIT_LOG(DEBUG,
> -                          "After freeing txq[%d] used and unused buf", i);
> -             VIRTQUEUE_DUMP(txvq->vq);
> +                     "After freeing %s[%d] used and unused buf",
> +                     type, i);
> +             VIRTQUEUE_DUMP(vq);
>       }
> +
> +     PMD_INIT_LOG(DEBUG, "%d mbufs freed", mbuf_num);
>  }
>  
>  /*
> -- 
> 2.11.0
> 

Reply via email to