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:
@ -265,8 +265,9 @@ tap_show_command_fn (vlib_main_t * vm, unformat_input_t * input,
|
|||||||
// RX = 0, TX = 1
|
// RX = 0, TX = 1
|
||||||
vring = vec_elt_at_index (vif->vrings, i);
|
vring = vec_elt_at_index (vif->vrings, i);
|
||||||
vlib_cli_output (vm, " Virtqueue (%s)", (i & 1) ? "TX" : "RX");
|
vlib_cli_output (vm, " Virtqueue (%s)", (i & 1) ? "TX" : "RX");
|
||||||
vlib_cli_output (vm, " qsz %d, last_used_idx %d, desc_in_use %d",
|
vlib_cli_output (vm,
|
||||||
vring->size, vring->last_used_idx,
|
" 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);
|
vring->desc_in_use);
|
||||||
vlib_cli_output (vm,
|
vlib_cli_output (vm,
|
||||||
" avail.flags 0x%x avail.idx %d used.flags 0x%x used.idx %d",
|
" avail.flags 0x%x avail.idx %d used.flags 0x%x used.idx %d",
|
||||||
|
@ -140,13 +140,13 @@ static_always_inline void
|
|||||||
virtio_free_rx_buffers (vlib_main_t * vm, virtio_vring_t * vring)
|
virtio_free_rx_buffers (vlib_main_t * vm, virtio_vring_t * vring)
|
||||||
{
|
{
|
||||||
u16 used = vring->desc_in_use;
|
u16 used = vring->desc_in_use;
|
||||||
u16 next = vring->desc_next;
|
u16 last = vring->last_used_idx;
|
||||||
u16 mask = vring->size - 1;
|
u16 mask = vring->size - 1;
|
||||||
|
|
||||||
while (used)
|
while (used)
|
||||||
{
|
{
|
||||||
vlib_buffer_free (vm, &vring->buffers[next], 1);
|
vlib_buffer_free (vm, &vring->buffers[last & mask], 1);
|
||||||
next = (next + 1) & mask;
|
last++;
|
||||||
used--;
|
used--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user