summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2022-02-09 19:17:02 -0800
committerFlorin Coras <florin.coras@gmail.com>2022-02-10 03:09:44 +0000
commitf8c8809d009ea6e3785e4b66047d2b4982d6286e (patch)
treeb42713494152996ed65051ba94398e25aa56fac3 /src
parent794599bccae8bfb57c17b0c3c8b96630b0bf9bb9 (diff)
session: avoid debug half-open session pool contention
Half-opens are only allocated from main with worker barrier but can be cleaned up, i.e., session_half_open_free, from main without a barrier. In debug images, the free_bitmap can grow while workers peek the sessions pool, e.g., session_half_open_migrate_notify, and as a result crash while validating the session. To avoid, proactively grow bitmap in debug images. Type: fix Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: I2410793f933fb638651fe8dc08ba78e9bee0bd77
Diffstat (limited to 'src')
-rw-r--r--src/vnet/session/session.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h
index c2984198bf7..fe8a85cd5f4 100644
--- a/src/vnet/session/session.h
+++ b/src/vnet/session/session.h
@@ -676,6 +676,17 @@ ho_session_alloc (void)
s = session_alloc (0);
s->session_state = SESSION_STATE_CONNECTING;
s->flags |= SESSION_F_HALF_OPEN;
+ /* Not ideal. Half-opens are only allocated from main with worker barrier
+ * but can be cleaned up, i.e., session_half_open_free, from main without
+ * a barrier. In debug images, the free_bitmap can grow while workers peek
+ * the sessions pool, e.g., session_half_open_migrate_notify, and as a
+ * result crash while validating the session. To avoid this, grow the bitmap
+ * now. */
+ if (CLIB_DEBUG)
+ {
+ session_t *sp = session_main.wrk[0].sessions;
+ clib_bitmap_validate (pool_header (sp)->free_bitmap, s->session_index);
+ }
return s;
}