tapv2: Sporadic SIGABRT in ethernet_input [VPP-1183]

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>
This commit is contained in:
Steven
2018-03-30 22:18:11 -07:00
parent 3744fc7abc
commit 074f698be5
2 changed files with 6 additions and 5 deletions

View 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",

View 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--;
}
}