From 9f299030fd1214eb1fc076cf0c7f44559a7c8f6b Mon Sep 17 00:00:00 2001 From: liuyacan Date: Sun, 25 Apr 2021 20:11:30 +0800 Subject: session: fix race condition in fifo allocation Under some timing conditions,VCL may receive CONNECTED/ACCEPTED event before ADD_SEGMENT event. Timing example: 2 threads call segment_manager_alloc_session_fifos() parallelly Thread 1 Thread 2 sm read lock | | | try to alloc fifo =>failed | | | sm read unlock | | | sm write lock | | | add segment | | | sm write unlock | | sm read lock | | | try to alloc fifo=>successful sm read lock | | sm read unlock | | | emit CONNECTED/ACCEPTED emit ADD_SEGMENT event | sm read unlock This commit move ADD_SEGMENT notification under the protection of the write lock in some scenarios. Type: fix Signed-off-by: liuyacan Change-Id: I25d5475c5e6d37cfccefa9506f6030c26ce8ee9b --- src/vnet/session/segment_manager.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/vnet/session/segment_manager.h') diff --git a/src/vnet/session/segment_manager.h b/src/vnet/session/segment_manager.h index 7c3434b70d3..e73a70fda16 100644 --- a/src/vnet/session/segment_manager.h +++ b/src/vnet/session/segment_manager.h @@ -101,7 +101,8 @@ segment_manager_t *segment_manager_get (u32 index); segment_manager_t *segment_manager_get_if_valid (u32 index); u32 segment_manager_index (segment_manager_t * sm); -int segment_manager_add_segment (segment_manager_t * sm, uword segment_size); +int segment_manager_add_segment (segment_manager_t *sm, uword segment_size, + u8 notify_app); void segment_manager_del_segment (segment_manager_t * sm, fifo_segment_t * fs); void segment_manager_lock_and_del_segment (segment_manager_t * sm, -- cgit 1.2.3-korg