summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven <sluong@cisco.com>2017-05-18 21:22:00 -0700
committerJohn Lo <loj@cisco.com>2017-05-20 17:50:58 +0000
commit7d68ec61343800f5b2d0660265b02e12b19cb640 (patch)
tree410a3c31523ae8b59817d3618a9a899ca4be96e2
parent7ebd374e182275aed72860ba0fff6da5af8b53d1 (diff)
vhost: buffers leak and interface disable upon vring descriptor out of mmapv17.04.1
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> (cherry picked from commit 95827e430762a2858f4e56e1248a4a93d629a938)
-rw-r--r--src/vnet/devices/virtio/vhost-user.c25
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 114ccdd0cd0..92294c309f9 100644
--- a/src/vnet/devices/virtio/vhost-user.c
+++ b/src/vnet/devices/virtio/vhost-user.c
@@ -1575,6 +1575,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
@@ -1752,7 +1753,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;
}
}
@@ -1884,13 +1886,8 @@ vhost_user_if_input (vlib_main_t * vm,
(vhost_user_input_copy (vui, vum->cpus[cpu_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;
@@ -1909,10 +1906,8 @@ vhost_user_if_input (vlib_main_t * vm,
(vhost_user_input_copy (vui, vum->cpus[cpu_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 */
@@ -2340,10 +2335,8 @@ done:
(vhost_user_tx_copy (vui, vum->cpus[cpu_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 ();