tls: fix multi threaded medium scale test (VPP-1457)
[vpp.git] / src / vnet / session / session_api.c
index fc63428..5659386 100755 (executable)
@@ -278,30 +278,6 @@ send_session_accept_callback (stream_session_t * s)
   return 0;
 }
 
-void
-mq_send_local_session_disconnected_cb (u32 app_wrk_index,
-                                      local_session_t * ls)
-{
-  app_worker_t *app_wrk = app_worker_get (app_wrk_index);
-  svm_msg_q_msg_t _msg, *msg = &_msg;
-  session_disconnected_msg_t *mp;
-  svm_msg_q_t *app_mq;
-  session_event_t *evt;
-  application_t *app;
-
-  app = application_get (app_wrk->app_index);
-  app_mq = app_wrk->event_queue;
-  svm_msg_q_lock_and_alloc_msg_w_ring (app_mq, SESSION_MQ_CTRL_EVT_RING,
-                                      SVM_Q_WAIT, msg);
-  evt = svm_msg_q_msg_data (app_mq, msg);
-  memset (evt, 0, sizeof (*evt));
-  evt->event_type = SESSION_CTRL_EVT_DISCONNECTED;
-  mp = (session_disconnected_msg_t *) evt->data;
-  mp->handle = application_local_session_handle (ls);
-  mp->context = app->api_client_index;
-  svm_msg_q_add_and_unlock (app_mq, msg);
-}
-
 static void
 send_session_disconnect_callback (stream_session_t * s)
 {
@@ -421,6 +397,23 @@ static session_cb_vft_t session_cb_vft = {
   .del_segment_callback = send_del_segment_callback,
 };
 
+static int
+mq_try_lock_and_alloc_msg (svm_msg_q_t * app_mq, svm_msg_q_msg_t * msg)
+{
+  int rv;
+  u8 try = 0;
+  while (try < 100)
+    {
+      rv = svm_msg_q_lock_and_alloc_msg_w_ring (app_mq,
+                                               SESSION_MQ_CTRL_EVT_RING,
+                                               SVM_Q_NOWAIT, msg);
+      if (!rv)
+       return 0;
+      try++;
+    }
+  return -1;
+}
+
 static int
 mq_send_session_accepted_cb (stream_session_t * s)
 {
@@ -436,8 +429,8 @@ mq_send_session_accepted_cb (stream_session_t * s)
 
   app = application_get (app_wrk->app_index);
   app_mq = app_wrk->event_queue;
-  svm_msg_q_lock_and_alloc_msg_w_ring (app_mq, SESSION_MQ_CTRL_EVT_RING,
-                                      SVM_Q_WAIT, msg);
+  if (mq_try_lock_and_alloc_msg (app_mq, msg))
+    return -1;
 
   evt = svm_msg_q_msg_data (app_mq, msg);
   memset (evt, 0, sizeof (*evt));
@@ -523,8 +516,8 @@ mq_send_session_disconnected_cb (stream_session_t * s)
 
   app = application_get (app_wrk->app_index);
   app_mq = app_wrk->event_queue;
-  svm_msg_q_lock_and_alloc_msg_w_ring (app_mq, SESSION_MQ_CTRL_EVT_RING,
-                                      SVM_Q_WAIT, msg);
+  if (mq_try_lock_and_alloc_msg (app_mq, msg))
+    return;
   evt = svm_msg_q_msg_data (app_mq, msg);
   memset (evt, 0, sizeof (*evt));
   evt->event_type = SESSION_CTRL_EVT_DISCONNECTED;
@@ -534,6 +527,30 @@ mq_send_session_disconnected_cb (stream_session_t * s)
   svm_msg_q_add_and_unlock (app_mq, msg);
 }
 
+void
+mq_send_local_session_disconnected_cb (u32 app_wrk_index,
+                                      local_session_t * ls)
+{
+  app_worker_t *app_wrk = app_worker_get (app_wrk_index);
+  svm_msg_q_msg_t _msg, *msg = &_msg;
+  session_disconnected_msg_t *mp;
+  svm_msg_q_t *app_mq;
+  session_event_t *evt;
+  application_t *app;
+
+  app = application_get (app_wrk->app_index);
+  app_mq = app_wrk->event_queue;
+  if (mq_try_lock_and_alloc_msg (app_mq, msg))
+    return;
+  evt = svm_msg_q_msg_data (app_mq, msg);
+  memset (evt, 0, sizeof (*evt));
+  evt->event_type = SESSION_CTRL_EVT_DISCONNECTED;
+  mp = (session_disconnected_msg_t *) evt->data;
+  mp->handle = application_local_session_handle (ls);
+  mp->context = app->api_client_index;
+  svm_msg_q_add_and_unlock (app_mq, msg);
+}
+
 static void
 mq_send_session_reset_cb (stream_session_t * s)
 {
@@ -544,8 +561,8 @@ mq_send_session_reset_cb (stream_session_t * s)
   session_event_t *evt;
 
   app_mq = app->event_queue;
-  svm_msg_q_lock_and_alloc_msg_w_ring (app_mq, SESSION_MQ_CTRL_EVT_RING,
-                                      SVM_Q_WAIT, msg);
+  if (mq_try_lock_and_alloc_msg (app_mq, msg))
+    return;
   evt = svm_msg_q_msg_data (app_mq, msg);
   memset (evt, 0, sizeof (*evt));
   evt->event_type = SESSION_CTRL_EVT_RESET;
@@ -576,8 +593,8 @@ mq_send_session_connected_cb (u32 app_wrk_index, u32 api_context,
       return -1;
     }
 
-  svm_msg_q_lock_and_alloc_msg_w_ring (app_mq, SESSION_MQ_CTRL_EVT_RING,
-                                      SVM_Q_WAIT, msg);
+  if (mq_try_lock_and_alloc_msg (app_mq, msg))
+    return -1;
   evt = svm_msg_q_msg_data (app_mq, msg);
   memset (evt, 0, sizeof (*evt));
   evt->event_type = SESSION_CTRL_EVT_CONNECTED;
@@ -656,8 +673,9 @@ mq_send_session_bound_cb (u32 app_wrk_index, u32 api_context,
       return -1;
     }
 
-  svm_msg_q_lock_and_alloc_msg_w_ring (app_mq, SESSION_MQ_CTRL_EVT_RING,
-                                      SVM_Q_WAIT, msg);
+  if (mq_try_lock_and_alloc_msg (app_mq, msg))
+    return -1;
+
   evt = svm_msg_q_msg_data (app_mq, msg);
   memset (evt, 0, sizeof (*evt));
   evt->event_type = SESSION_CTRL_EVT_BOUND;