session: avoid debug half-open session pool contention 73/35273/3
authorFlorin Coras <fcoras@cisco.com>
Thu, 10 Feb 2022 03:17:02 +0000 (19:17 -0800)
committerFlorin Coras <florin.coras@gmail.com>
Thu, 10 Feb 2022 03:09:44 +0000 (03:09 +0000)
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

src/vnet/session/session.h

index c298419..fe8a85c 100644 (file)
@@ -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;
 }