summaryrefslogtreecommitdiffstats
path: root/src/vnet/devices
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/devices')
-rw-r--r--src/vnet/devices/virtio/node.c4
-rw-r--r--src/vnet/devices/virtio/pci.c4
2 files changed, 6 insertions, 2 deletions
diff --git a/src/vnet/devices/virtio/node.c b/src/vnet/devices/virtio/node.c
index 7fabe36401c..1c9cfd0cc03 100644
--- a/src/vnet/devices/virtio/node.c
+++ b/src/vnet/devices/virtio/node.c
@@ -279,10 +279,12 @@ virtio_device_input_gso_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
u16 last = vring->last_used_idx;
u16 n_left = vring->used->idx - last;
- if (vif->packet_coalesce)
+ if (vif->packet_coalesce
+ && clib_spinlock_trylock_if_init (&txq_vring->lockp))
{
vnet_gro_flow_table_schedule_node_on_dispatcher (vm,
txq_vring->flow_table);
+ clib_spinlock_unlock_if_init (&txq_vring->lockp);
}
if ((vring->used->flags & VRING_USED_F_NO_NOTIFY) == 0 &&
diff --git a/src/vnet/devices/virtio/pci.c b/src/vnet/devices/virtio/pci.c
index 5ba9f36de81..df8e2bdaf68 100644
--- a/src/vnet/devices/virtio/pci.c
+++ b/src/vnet/devices/virtio/pci.c
@@ -494,6 +494,7 @@ virtio_pci_control_vring_init (vlib_main_t * vm, virtio_if_t * vif,
clib_error_t *
virtio_pci_vring_init (vlib_main_t * vm, virtio_if_t * vif, u16 queue_num)
{
+ vlib_thread_main_t *vtm = vlib_get_thread_main ();
clib_error_t *error = 0;
u16 queue_size = 0;
virtio_vring_t *vring;
@@ -519,7 +520,8 @@ virtio_pci_vring_init (vlib_main_t * vm, virtio_if_t * vif, u16 queue_num)
vec_validate_aligned (vif->txq_vrings, TX_QUEUE_ACCESS (queue_num),
CLIB_CACHE_LINE_BYTES);
vring = vec_elt_at_index (vif->txq_vrings, TX_QUEUE_ACCESS (queue_num));
- clib_spinlock_init (&vring->lockp);
+ if (vif->max_queue_pairs < vtm->n_vlib_mains)
+ clib_spinlock_init (&vring->lockp);
}
else
{