[dpdk-dev] Bug in virtqueue_dequeue_burst_rx()

Yuanhan Liu yuanhan.liu at linux.intel.com
Thu Dec 22 08:38:34 CET 2016


On Mon, Dec 19, 2016 at 09:59:33PM -0800, Gopakumar Choorakkot Edakkunni wrote:
> While I was testing virtio with ubuntu 14.04 kvm as host and dpdk16.07
> linux as guest, quite often I have seen that I get into a situation where
> virtio_recv_mergeable_pkts() gets into a forever loop, after sending
> traffic for a while. In the below API,  I see that it clearly leads to a
> while loop, I am not quite familiar with virtio or mergeable buffers, so
> thought of checking with dpdk alias on the intent here.
> 
> I checked the linux kernel virtio_net.c file which does the similar
> mergeable recieve, and the kernel code breaks out in case of error.
> Shouldnt dpdk be breaking out of here on error instead of continue ?

Yep, that looks buggy.

> 
> virtio_recv_mergeable_pkts()
> {
> <snip>
>     while (i < nb_used) {
>         <snip>
> *        num = virtqueue_dequeue_burst_rx(rxvq, rcv_pkts, len, 1);*
> *        if (num != 1)*
> *            continue;*

However, normally, virtqueue_dequeue_burst_rx() would be successful
here: the outer check (i < nb_used) somehow ascertains it.

Two options I can think of so far:

- will it go back working once you do "break" here?

- tell us how you managed to trigger this issue, so that I could
  also reproduce it that I can debug it.

	--yliu


More information about the dev mailing list