diff options
author | Dave Barach <dave@barachs.net> | 2017-11-28 10:11:42 -0500 |
---|---|---|
committer | Dave Barach <dave@barachs.net> | 2017-11-28 10:12:25 -0500 |
commit | 2a8639155a6cbc0f7c412f26af4ad638b12edb73 (patch) | |
tree | edb262fb6e816a86a59f303178fe23064e29feb6 /src/vnet | |
parent | f988e696149f42828444c69762c036d9684b6bb0 (diff) |
Shut down session queue input nodes on exit
Shut off (especially) worker-thread session queue input nodes.
Otherwise, vpp can crash when the main thread unmaps the API segment.
Change-Id: Idf855e7570e0066cc921ae34bc53afabaa9e1dba
Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'src/vnet')
-rw-r--r-- | src/vnet/session/session.h | 2 | ||||
-rw-r--r-- | src/vnet/session/session_node.c | 19 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h index cf1bc9d87fc..2a0b0cc47bd 100644 --- a/src/vnet/session/session.h +++ b/src/vnet/session/session.h @@ -538,6 +538,8 @@ do { \ return clib_error_return(0, "session layer is not enabled"); \ } while (0) +void session_node_enable_disable (u8 is_en); + #endif /* __included_session_h__ */ /* diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c index ce460e9a94c..f647360ea5b 100644 --- a/src/vnet/session/session_node.c +++ b/src/vnet/session/session_node.c @@ -705,6 +705,25 @@ VLIB_REGISTER_NODE (session_queue_node) = }; /* *INDENT-ON* */ +static clib_error_t * +session_queue_exit (vlib_main_t * vm) +{ + if (vec_len (vlib_mains) < 2) + return 0; + + /* + * Shut off (especially) worker-thread session nodes. + * Otherwise, vpp can crash as the main thread unmaps the + * API segment. + */ + vlib_worker_thread_barrier_sync (vm); + session_node_enable_disable (0 /* is_enable */ ); + vlib_worker_thread_barrier_release (vm); + return 0; +} + +VLIB_MAIN_LOOP_EXIT_FUNCTION (session_queue_exit); + /* * fd.io coding-style-patch-verification: ON * |