diff options
author | Steven <sluong@cisco.com> | 2017-05-18 21:22:00 -0700 |
---|---|---|
committer | John Lo <loj@cisco.com> | 2017-05-20 17:43:12 +0000 |
commit | 95827e430762a2858f4e56e1248a4a93d629a938 (patch) | |
tree | 946868f28a62662866903648cc4c73e0da8ec19e /src | |
parent | c442e6197399f65b02a9c97fe040af7f442bdea9 (diff) |
vhost: buffers leak and interface disable upon vring descriptor out of mmap
When processing a vring descriptor which is outside of mmap, we disable
the interface and spit a message to shut/no shut the interface. This is
not practical as application using vhost cannot constantly checking the
logs and do the recovery. The proposed fix is to log an error, like
other errors that we encounter.
The other bug is buffer leak in the function rewind. At the end of the
while loop when b_current != b_head, we still have to give back 1 more
buffer or add 1 to rx_buffers_len.
Change-Id: I68c0b24f070e644cd8878f42272a7b518f14393f
Signed-off-by: Steven <sluong@cisco.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/vnet/devices/virtio/vhost-user.c | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/src/vnet/devices/virtio/vhost-user.c b/src/vnet/devices/virtio/vhost-user.c index 64d55b65f15..451ae4342b6 100644 --- a/src/vnet/devices/virtio/vhost-user.c +++ b/src/vnet/devices/virtio/vhost-user.c @@ -1557,6 +1557,7 @@ vhost_user_input_rewind_buffers (vlib_main_t * vm, b_current->current_length = 0; b_current->flags = 0; } + cpu->rx_buffers_len++; } static u32 @@ -1735,7 +1736,8 @@ vhost_user_if_input (vlib_main_t * vm, desc_current = 0; if (PREDICT_FALSE (desc_table == 0)) { - //FIXME: Handle error by shutdown the queue + vlib_error_count (vm, node->node_index, + VHOST_USER_INPUT_FUNC_ERROR_MMAP_FAIL, 1); goto out; } } @@ -1868,13 +1870,8 @@ vhost_user_if_input (vlib_main_t * vm, (vhost_user_input_copy (vui, vum->cpus[thread_index].copy, copy_len, &map_hint))) { - clib_warning - ("Memory mapping error on interface hw_if_index=%d " - "(Shutting down - Switch interface down and up to restart)", - vui->hw_if_index); - vui->admin_up = 0; - copy_len = 0; - break; + vlib_error_count (vm, node->node_index, + VHOST_USER_INPUT_FUNC_ERROR_MMAP_FAIL, 1); } copy_len = 0; @@ -1893,10 +1890,8 @@ vhost_user_if_input (vlib_main_t * vm, (vhost_user_input_copy (vui, vum->cpus[thread_index].copy, copy_len, &map_hint))) { - clib_warning ("Memory mapping error on interface hw_if_index=%d " - "(Shutting down - Switch interface down and up to restart)", - vui->hw_if_index); - vui->admin_up = 0; + vlib_error_count (vm, node->node_index, + VHOST_USER_INPUT_FUNC_ERROR_MMAP_FAIL, 1); } /* give buffers back to driver */ @@ -2324,10 +2319,8 @@ done: (vhost_user_tx_copy (vui, vum->cpus[thread_index].copy, copy_len, &map_hint))) { - clib_warning ("Memory mapping error on interface hw_if_index=%d " - "(Shutting down - Switch interface down and up to restart)", - vui->hw_if_index); - vui->admin_up = 0; + vlib_error_count (vm, node->node_index, + VHOST_USER_TX_FUNC_ERROR_MMAP_FAIL, 1); } CLIB_MEMORY_BARRIER (); |