VPP-895 multi-thread: fix vpp crash on show runtime

In multi-threaded model (e.g. 1 main and 1 worker threads),
after an ethernet interface is deleted (e.g. vhost-user interface),
'show runtime' command produces garbled output and sometimes
leads to vpp crash.

The reason is because vlib_node_rename() frees and reallocates node's
'n->name' vector, however the change is not propagated into copies
of the node on worker threads.

Change-Id: Ibf22422913b7f2df22f70f3b2fe8dafd34c1dd06
Signed-off-by: Igor Mikhailov (imichail) <imichail@cisco.com>
(cherry picked from commit 02989064e4)
This commit is contained in:
Igor Mikhailov (imichail)
2017-07-03 17:01:50 -07:00
committed by Neale Ranns
parent a2522f6fd5
commit 19e9d954bd

View File

@ -72,6 +72,32 @@ node_set_elog_name (vlib_main_t * vm, uword node_index)
n->name_elog_string = elog_string (&vm->elog_main, "%v%c", n->name, 0);
}
static void
vlib_worker_thread_node_rename (u32 node_index)
{
int i;
vlib_main_t *vm;
vlib_node_t *n;
if (vec_len (vlib_mains) == 1)
return;
vm = vlib_mains[0];
n = vlib_get_node (vm, node_index);
ASSERT (vlib_get_thread_index () == 0);
ASSERT (*vlib_worker_threads->wait_at_barrier == 1);
for (i = 1; i < vec_len (vlib_mains); i++)
{
vlib_main_t *vm_worker = vlib_mains[i];
vlib_node_t *n_worker = vlib_get_node (vm_worker, node_index);
n_worker->name = n->name;
n_worker->name_elog_string = n->name_elog_string;
}
}
void
vlib_node_rename (vlib_main_t * vm, u32 node_index, char *fmt, ...)
{
@ -87,6 +113,9 @@ vlib_node_rename (vlib_main_t * vm, u32 node_index, char *fmt, ...)
hash_set (nm->node_by_name, n->name, n->index);
node_set_elog_name (vm, node_index);
/* Propagate the change to all worker threads */
vlib_worker_thread_node_rename (node_index);
}
static void