- for (qid = 0; qid < vui->num_qid / 2; qid++)
- {
- vhost_user_vring_t *rxvq = &vui->vrings[VHOST_VRING_IDX_RX (qid)];
- if (!rxvq->started || !rxvq->enabled)
- continue;
-
- vui->per_cpu_tx_qid[thread_index] = qid;
- thread_index++;
- if (thread_index == vlib_get_thread_main ()->n_vlib_mains)
- return;
- }
- //We need to loop, meaning the spinlock has to be used
- vui->use_tx_spinlock = 1;
- if (thread_index == 0)
- {
- //Could not find a single valid one
- for (thread_index = 0;
- thread_index < vlib_get_thread_main ()->n_vlib_mains;
- thread_index++)
- {
- vui->per_cpu_tx_qid[thread_index] = 0;
- }
- return;
- }
+ rxvq->queue_index =
+ vnet_hw_if_register_tx_queue (vnm, vui->hw_if_index, q);
+ rxvq->qid = q;
+ }
+
+ FOR_ALL_VHOST_RXQ (q, vui)
+ {
+ vhost_user_vring_t *rxvq = &vui->vrings[q];
+ u32 qi = rxvq->queue_index;
+
+ if (rxvq->queue_index == ~0)
+ break;
+ for (u32 i = 0; i < vlib_get_n_threads (); i++)
+ vnet_hw_if_tx_queue_unassign_thread (vnm, qi, i);
+ }
+
+ for (u32 i = 0; i < vlib_get_n_threads (); i++)
+ {
+ vhost_user_vring_t *rxvq =
+ &vui->vrings[VHOST_VRING_IDX_RX (i % rxvq_count)];
+ u32 qi = rxvq->queue_index;
+
+ vnet_hw_if_tx_queue_assign_thread (vnm, qi, i);