+ virtio_vring_t *vring = vec_elt_at_index (vif->rxq_vrings, qid);
+ const int hdr_sz = vif->virtio_net_hdr_sz;
+ u16 txq_id = vm->thread_index % vif->num_txqs;
+ virtio_vring_t *txq_vring = vec_elt_at_index (vif->txq_vrings, txq_id);
+ uword rv;
+
+ if (clib_spinlock_trylock_if_init (&txq_vring->lockp))
+ {
+ if (vif->packet_coalesce)
+ vnet_gro_flow_table_schedule_node_on_dispatcher
+ (vm, txq_vring->flow_table);
+ else if (vif->packet_buffering)
+ virtio_vring_buffering_schedule_node_on_dispatcher
+ (vm, txq_vring->buffering);
+ clib_spinlock_unlock_if_init (&txq_vring->lockp);
+ }
+
+ if ((vring->used->flags & VRING_USED_F_NO_NOTIFY) == 0 &&
+ vring->last_kick_avail_idx != vring->avail->idx)
+ virtio_kick (vm, vring, vif);