session/fifo: make event unset atomic 68/18468/1
authorFlorin Coras <fcoras@cisco.com>
Thu, 21 Mar 2019 20:54:53 +0000 (13:54 -0700)
committerFlorin Coras <fcoras@cisco.com>
Thu, 21 Mar 2019 20:56:02 +0000 (13:56 -0700)
Ensures that fifo cursize loads cannot be speculated to before the event
unset.

Change-Id: Ia7c20c510d58f26a8e9b82d3982c6d4143a3a4d6
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/svm/svm_fifo.h
src/vnet/session/application_interface.h

index d7146ae..6c3940d 100644 (file)
@@ -179,12 +179,12 @@ svm_fifo_set_event (svm_fifo_t * f)
 /**
  * Unsets fifo event flag.
  *
- * Also acts as a release barrier.
+ * Also acts as an acquire barrier.
  */
 always_inline void
 svm_fifo_unset_event (svm_fifo_t * f)
 {
-  clib_atomic_release (&f->has_event);
+  __atomic_exchange_n (&f->has_event, 0, __ATOMIC_ACQUIRE);
 }
 
 svm_fifo_t *svm_fifo_create (u32 data_size_in_bytes);
index 56d034e..8323e72 100644 (file)
@@ -475,9 +475,10 @@ app_send_dgram_raw (svm_fifo_t * f, app_session_transport_t * at,
   rv = svm_fifo_enqueue_nowait (f, sizeof (hdr), (u8 *) & hdr);
   ASSERT (rv == sizeof (hdr));
 
-  if ((rv = svm_fifo_enqueue_nowait (f, actual_write, data)) > 0)
+  rv = svm_fifo_enqueue_nowait (f, actual_write, data);
+  if (do_evt)
     {
-      if (do_evt && svm_fifo_set_event (f))
+      if (rv > 0 && svm_fifo_set_event (f))
        app_send_io_evt_to_vpp (vpp_evt_q, f->master_session_index, evt_type,
                                noblock);
     }
@@ -499,9 +500,10 @@ app_send_stream_raw (svm_fifo_t * f, svm_msg_q_t * vpp_evt_q, u8 * data,
 {
   int rv;
 
-  if ((rv = svm_fifo_enqueue_nowait (f, len, data)) > 0)
+  rv = svm_fifo_enqueue_nowait (f, len, data);
+  if (do_evt)
     {
-      if (do_evt && svm_fifo_set_event (f))
+      if (rv > 0 && svm_fifo_set_event (f))
        app_send_io_evt_to_vpp (vpp_evt_q, f->master_session_index, evt_type,
                                noblock);
     }