session: update time for list of subscribers 87/34987/2
authorFlorin Coras <fcoras@cisco.com>
Fri, 21 Jan 2022 02:10:26 +0000 (18:10 -0800)
committerDave Barach <openvpp@barachs.net>
Sat, 22 Jan 2022 00:29:30 +0000 (00:29 +0000)
Instead of constantly scanning all transport vfts for update time
functions, build list at transport enable time.

Type: improvement

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Id5c07cc03ee1fdd072ebbbd40119d1a440a5e3b1

src/vnet/session/session.c
src/vnet/session/session.h
src/vnet/session/session_node.c
src/vnet/session/transport.c

index 77259ad..42f24d2 100644 (file)
@@ -1768,6 +1768,39 @@ session_register_transport (transport_proto_t transport_proto,
     session_tx_fns[vft->transport_options.tx_type];
 }
 
+void
+session_register_update_time_fn (session_update_time_fn fn, u8 is_add)
+{
+  session_main_t *smm = &session_main;
+  session_update_time_fn *fi;
+  u32 fi_pos = ~0;
+  u8 found = 0;
+
+  vec_foreach (fi, smm->update_time_fns)
+    {
+      if (*fi == fn)
+       {
+         fi_pos = fi - smm->update_time_fns;
+         found = 1;
+         break;
+       }
+    }
+
+  if (is_add)
+    {
+      if (found)
+       {
+         clib_warning ("update time fn %p already registered", fn);
+         return;
+       }
+      vec_add1 (smm->update_time_fns, fn);
+    }
+  else
+    {
+      vec_del1 (smm->update_time_fns, fi_pos);
+    }
+}
+
 transport_proto_t
 session_add_transport_proto (void)
 {
index 9d6c945..c298419 100644 (file)
@@ -171,11 +171,16 @@ extern session_fifo_rx_fn session_tx_fifo_dequeue_internal;
 
 u8 session_node_lookup_fifo_event (svm_fifo_t * f, session_event_t * e);
 
+typedef void (*session_update_time_fn) (f64 time_now, u8 thread_index);
+
 typedef struct session_main_
 {
   /** Worker contexts */
   session_worker_t *wrk;
 
+  /** Vector of transport update time functions */
+  session_update_time_fn *update_time_fns;
+
   /** Event queues memfd segment */
   fifo_segment_t wrk_mqs_segment;
 
@@ -528,6 +533,7 @@ void session_register_transport (transport_proto_t transport_proto,
                                 const transport_proto_vft_t * vft, u8 is_ip4,
                                 u32 output_node);
 transport_proto_t session_add_transport_proto (void);
+void session_register_update_time_fn (session_update_time_fn fn, u8 is_add);
 int session_tx_fifo_peek_bytes (transport_connection_t * tc, u8 * buffer,
                                u32 offset, u32 max_bytes);
 u32 session_tx_fifo_dequeue_drop (transport_connection_t * tc, u32 max_bytes);
index 403c28f..162d54e 100644 (file)
@@ -1641,6 +1641,16 @@ static const u32 session_evt_msg_sizes[] = {
 };
 /* *INDENT-ON* */
 
+always_inline void
+session_update_time_subscribers (session_main_t *smm, clib_time_type_t now,
+                                u32 thread_index)
+{
+  session_update_time_fn *fn;
+
+  vec_foreach (fn, smm->update_time_fns)
+    (*fn) (now, thread_index);
+}
+
 always_inline void
 session_evt_add_to_list (session_worker_t * wrk, session_event_t * evt)
 {
@@ -1755,7 +1765,7 @@ session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
   /*
    *  Update transport time
    */
-  transport_update_time (wrk->last_vlib_time, thread_index);
+  session_update_time_subscribers (smm, wrk->last_vlib_time, thread_index);
   n_tx_packets = vec_len (wrk->pending_tx_buffers);
   SESSION_EVT (SESSION_EVT_DSP_CNTRS, UPDATE_TIME, wrk);
 
index 5d03a4f..92df365 100644 (file)
@@ -830,6 +830,9 @@ transport_enable_disable (vlib_main_t * vm, u8 is_en)
   {
     if (vft->enable)
       (vft->enable) (vm, is_en);
+
+    if (vft->update_time)
+      session_register_update_time_fn (vft->update_time, is_en);
   }
 }