On Thu, Oct 11, 2018 at 07:31:57PM +0200, Maxime Coquelin wrote:

I'm testing your series, and it gets stuck after 256 packets in transmit
path. When it happens, descs flags indicate it has been made available
by the driver (desc->flags = 0x80), but it is not consistent with the
expected wrap counter value (0).

Not sure this is the root cause, but it seems below code is broken:


On 10/03/2018 03:11 PM, Jens Freimann wrote:

[snip]
+
+       do {
+               if (idx >= vq->vq_nentries) {
+                       idx = 0;
+                       vq->vq_ring.avail_wrap_counter ^= 1;
+               }
+               start_dp[idx].addr  = VIRTIO_MBUF_DATA_DMA_ADDR(cookie, vq);
+               start_dp[idx].len   = cookie->data_len;
+               start_dp[idx].flags = cookie->next ? VRING_DESC_F_NEXT : 0;
+               start_dp[idx].flags |=
+                       VRING_DESC_F_AVAIL(vq->vq_ring.avail_wrap_counter) |
+                       VRING_DESC_F_USED(!vq->vq_ring.avail_wrap_counter);
+               if (use_indirect) {
+                       if (++idx >= (seg_num + 1))
+                               break;
+               } else {
+                       dxp = &vq->vq_descx[idx];
+                       idx = dxp->next;
+               }

Imagine current idx is 255, dxp->next will give idx 0, right?

No it will be VQ_RING_DESC_CHAIN_END which is defined as 32768.
In that case, for desc[0], on next iteration, the flags won't be set available properly, as vq->vq_ring.avail_wrap_counter isn't updated.

It will wrap because VQ_RING_DESC_CHAIN_END is > ring size.

I can't reproduce what you see. Do you test with txonly fwd mode?

regards,
Jens

Reply via email to