virtio: add missing tx lock when running multithreaded 08/10608/2
authorDamjan Marion <damarion@cisco.com>
Fri, 16 Feb 2018 15:13:32 +0000 (16:13 +0100)
committerDamjan Marion <dmarion.lists@gmail.com>
Mon, 19 Feb 2018 16:40:01 +0000 (16:40 +0000)
Change-Id: I373f429c53c6f66ad38322addcfaccddb7761392
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/vnet/devices/tap/tap.c
src/vnet/devices/virtio/device.c
src/vnet/devices/virtio/virtio.h

index e6a7ba5..de6107a 100644 (file)
@@ -80,6 +80,7 @@ void
 tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
 {
   vnet_main_t *vnm = vnet_get_main ();
+  vlib_thread_main_t *thm = vlib_get_thread_main ();
   virtio_main_t *vim = &virtio_main;
   tap_main_t *tm = &tap_main;
   vnet_sw_interface_t *sw;
@@ -397,6 +398,8 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
   vif->flags |= VIRTIO_IF_FLAG_ADMIN_UP;
   vnet_hw_interface_set_flags (vnm, vif->hw_if_index,
                               VNET_HW_INTERFACE_FLAG_LINK_UP);
+  if (thm->n_vlib_mains > 1)
+    clib_spinlock_init (&vif->lockp);
   goto done;
 
 error:
@@ -453,6 +456,7 @@ tap_delete_if (vlib_main_t * vm, u32 sw_if_index)
   vec_free (vif->vrings);
 
   hash_unset (tm->dev_instance_by_interface_id, vif->id);
+  clib_spinlock_free (&vif->lockp);
   memset (vif, 0, sizeof (*vif));
   pool_put (mm->interfaces, vif);
 
index ae8a116..c7efe65 100644 (file)
@@ -182,6 +182,8 @@ virtio_interface_tx_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
   u16 mask = sz - 1;
   u32 *buffers = vlib_frame_args (frame);
 
+  clib_spinlock_lock_if_init (&vif->lockp);
+
   /* free consumed buffers */
   virtio_free_used_desc (vm, vring);
 
@@ -221,6 +223,8 @@ virtio_interface_tx_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
       vlib_buffer_free (vm, buffers, n_left);
     }
 
+  clib_spinlock_unlock_if_init (&vif->lockp);
+
   return frame->n_vectors - n_left;
 }
 
index 7ffb2ea..5fc5216 100644 (file)
@@ -91,6 +91,8 @@ typedef struct
 typedef struct
 {
   u32 flags;
+  clib_spinlock_t lockp;
+
   u32 id;
   u32 dev_instance;
   u32 hw_if_index;