tapv2: Sporadic SIGABRT in ethernet_input [VPP-1183] 71/11471/1
authorSteven <sluong@cisco.com>
Sat, 31 Mar 2018 05:18:11 +0000 (22:18 -0700)
committerSteven <sluong@cisco.com>
Sat, 31 Mar 2018 05:26:40 +0000 (22:26 -0700)
virtio_free_rx_buffers uses the wrong slot in the vring to get
the buffer index. It uses desc_next. It should be last_used_idx
which is the slot number for the first valid descriptor.

Change-Id: I6b62b794f06869fbffffce45430b8b2e37b1266c
Signed-off-by: Steven <sluong@cisco.com>
src/vnet/devices/tap/cli.c
src/vnet/devices/virtio/virtio.c

index c17599a..9d86159 100644 (file)
@@ -265,8 +265,9 @@ tap_show_command_fn (vlib_main_t * vm, unformat_input_t * input,
        // RX = 0, TX = 1
        vring = vec_elt_at_index (vif->vrings, i);
        vlib_cli_output (vm, "  Virtqueue (%s)", (i & 1) ? "TX" : "RX");
-       vlib_cli_output (vm, "    qsz %d, last_used_idx %d, desc_in_use %d",
-                        vring->size, vring->last_used_idx,
+       vlib_cli_output (vm,
+                        "    qsz %d, last_used_idx %d, desc_next %d, desc_in_use %d",
+                        vring->size, vring->last_used_idx, vring->desc_next,
                         vring->desc_in_use);
        vlib_cli_output (vm,
                         "    avail.flags 0x%x avail.idx %d used.flags 0x%x used.idx %d",
index aa9db3a..072e8a7 100644 (file)
@@ -140,13 +140,13 @@ static_always_inline void
 virtio_free_rx_buffers (vlib_main_t * vm, virtio_vring_t * vring)
 {
   u16 used = vring->desc_in_use;
-  u16 next = vring->desc_next;
+  u16 last = vring->last_used_idx;
   u16 mask = vring->size - 1;
 
   while (used)
     {
-      vlib_buffer_free (vm, &vring->buffers[next], 1);
-      next = (next + 1) & mask;
+      vlib_buffer_free (vm, &vring->buffers[last & mask], 1);
+      last++;
       used--;
     }
 }