diff options
author | Steven Luong <sluong@cisco.com> | 2023-10-05 15:33:40 -0700 |
---|---|---|
committer | Damjan Marion <dmarion@0xa5.net> | 2023-10-18 09:16:35 +0000 |
commit | 34c721fb47155135bf2173ca7b9a31aaacfde190 (patch) | |
tree | 4c769cfadcb11b94650bb7fca9dfba68ab3f0dc1 | |
parent | bf236630f518ae94bc2ef76f83b269b98dd109d4 (diff) |
memif: contention between memif_disconnect and memif RX/TX threads
memif_disconect may be called without barrier sync. It removes stuff in mq
without protection which may cause troubles for memif RX/TX worker threads.
The fix is to protect mq removal in memif_disconnect.
Type: fix
Change-Id: I368c466d1f13df98980dfa87e8442fbcd822a428
Signed-off-by: Steven Luong <sluong@cisco.com>
-rw-r--r-- | src/plugins/memif/memif.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/plugins/memif/memif.c b/src/plugins/memif/memif.c index 37028d8223e..22f3e3dcdf1 100644 --- a/src/plugins/memif/memif.c +++ b/src/plugins/memif/memif.c @@ -100,6 +100,8 @@ memif_disconnect (memif_if_t * mif, clib_error_t * err) memif_region_t *mr; memif_queue_t *mq; int i; + vlib_main_t *vm = vlib_get_main (); + int with_barrier = 0; if (mif == 0) return; @@ -141,6 +143,12 @@ memif_disconnect (memif_if_t * mif, clib_error_t * err) clib_mem_free (mif->sock); } + if (vlib_worker_thread_barrier_held () == 0) + { + with_barrier = 1; + vlib_worker_thread_barrier_sync (vm); + } + /* *INDENT-OFF* */ vec_foreach_index (i, mif->rx_queues) { @@ -198,6 +206,9 @@ memif_disconnect (memif_if_t * mif, clib_error_t * err) vec_free (mif->remote_name); vec_free (mif->remote_if_name); clib_fifo_free (mif->msg_queue); + + if (with_barrier) + vlib_worker_thread_barrier_release (vm); } static clib_error_t * |