virtio: add atomic call for kicking 70/30370/5
authorMohsin Kazmi <sykazmi@cisco.com>
Thu, 10 Dec 2020 09:49:21 +0000 (09:49 +0000)
committerBeno�t Ganne <bganne@cisco.com>
Mon, 8 Feb 2021 16:45:34 +0000 (16:45 +0000)
Type: fix

Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
Change-Id: I41faa2ca249ff75e564a732af896e6b5d76bf665

src/vnet/devices/virtio/device.c
src/vnet/devices/virtio/node.c
src/vppinfra/atomics.h

index 5796b1d..3482336 100644 (file)
@@ -926,11 +926,11 @@ virtio_interface_tx_split_gso_inline (vlib_main_t * vm,
 
   if (n_left != n_vectors || n_buffers != n_buffers_left)
     {
-      CLIB_MEMORY_STORE_BARRIER ();
-      vring->avail->idx = avail;
+      clib_atomic_store_seq_cst (&vring->avail->idx, avail);
       vring->desc_next = next;
       vring->desc_in_use = used;
-      if ((vring->used->flags & VRING_USED_F_NO_NOTIFY) == 0)
+      if ((clib_atomic_load_seq_cst (&vring->used->flags) &
+          VRING_USED_F_NO_NOTIFY) == 0)
        virtio_kick (vm, vring, vif);
     }
 
@@ -997,12 +997,6 @@ VNET_DEVICE_CLASS_TX_FN (virtio_device_class) (vlib_main_t * vm,
 
   clib_spinlock_lock_if_init (&vring->lockp);
 
-  if (packed && (vring->device_event->flags != VRING_EVENT_F_DISABLE))
-    virtio_kick (vm, vring, vif);
-  else if ((vring->used->flags & VRING_USED_F_NO_NOTIFY) == 0 &&
-          (vring->last_kick_avail_idx != vring->avail->idx))
-    virtio_kick (vm, vring, vif);
-
   if (vif->packet_coalesce)
     {
       n_vectors = n_left =
index 788cc61..4a2e305 100644 (file)
@@ -135,12 +135,11 @@ more:
       n_slots--;
       used++;
     }
-  CLIB_MEMORY_STORE_BARRIER ();
-  vring->avail->idx = avail;
+  clib_atomic_store_seq_cst (&vring->avail->idx, avail);
   vring->desc_next = next;
   vring->desc_in_use = used;
-
-  if ((vring->used->flags & VRING_USED_F_NO_NOTIFY) == 0)
+  if ((clib_atomic_load_seq_cst (&vring->used->flags) &
+       VRING_USED_F_NO_NOTIFY) == 0)
     {
       virtio_kick (vm, vring, vif);
     }
@@ -588,9 +587,6 @@ virtio_device_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
 
   if (vif->is_packed)
     {
-      if (vring->device_event->flags != VRING_EVENT_F_DISABLE)
-       virtio_kick (vm, vring, vif);
-
       if (vif->gso_enabled)
        rv =
          virtio_device_input_gso_inline (vm, node, frame, vif, vring, type,
@@ -609,10 +605,6 @@ virtio_device_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
     }
   else
     {
-      if ((vring->used->flags & VRING_USED_F_NO_NOTIFY) == 0 &&
-         vring->last_kick_avail_idx != vring->avail->idx)
-       virtio_kick (vm, vring, vif);
-
       if (vif->gso_enabled)
        rv =
          virtio_device_input_gso_inline (vm, node, frame, vif, vring, type,
index 170b54a..5d3c5f8 100644 (file)
@@ -50,6 +50,9 @@
 #define clib_atomic_load_relax_n(a) __atomic_load_n((a), __ATOMIC_RELAXED)
 #define clib_atomic_load_acq_n(a) __atomic_load_n((a), __ATOMIC_ACQUIRE)
 #define clib_atomic_store_rel_n(a, b) __atomic_store_n ((a), (b), __ATOMIC_RELEASE)
+#define clib_atomic_store_seq_cst(a, b)                                       \
+  __atomic_store_n ((a), (b), __ATOMIC_SEQ_CST)
+#define clib_atomic_load_seq_cst(a) __atomic_load_n ((a), __ATOMIC_SEQ_CST)
 
 #define clib_atomic_swap_acq_n(a, b) __atomic_exchange_n ((a), (b), __ATOMIC_ACQUIRE)
 #define clib_atomic_swap_rel_n(a, b) __atomic_exchange_n ((a), (b), __ATOMIC_RELEASE)