#include <vnet/ip/ip4_packet.h>
#include <vnet/ip/ip6_packet.h>
#include <vnet/devices/virtio/virtio.h>
+#include <vnet/devices/virtio/virtio_inline.h>
#include <vnet/devices/virtio/pci.h>
#include <vnet/interface/rx_queue_funcs.h>
+#include <vnet/interface/tx_queue_funcs.h>
virtio_main_t virtio_main;
if (idx % 2)
{
- vlib_thread_main_t *thm = vlib_get_thread_main ();
vec_validate_aligned (vif->txq_vrings, TX_QUEUE_ACCESS (idx),
CLIB_CACHE_LINE_BYTES);
vring = vec_elt_at_index (vif->txq_vrings, TX_QUEUE_ACCESS (idx));
- if (thm->n_vlib_mains > vif->num_txqs)
- clib_spinlock_init (&vring->lockp);
+ clib_spinlock_init (&vring->lockp);
}
else
{
return error;
}
+static void
+virtio_vring_fill (vlib_main_t *vm, virtio_if_t *vif, virtio_vring_t *vring)
+{
+ if (vif->is_packed)
+ virtio_refill_vring_packed (vm, vif, vif->type, vring,
+ vif->virtio_net_hdr_sz,
+ virtio_input_node.index);
+ else
+ virtio_refill_vring_split (vm, vif, vif->type, vring,
+ vif->virtio_net_hdr_sz,
+ virtio_input_node.index);
+}
+
void
virtio_vring_set_rx_queues (vlib_main_t *vm, virtio_if_t *vif)
{
file_index);
i++;
}
+ vnet_hw_if_set_rx_queue_mode (vnm, vring->queue_index,
+ VNET_HW_IF_RX_MODE_POLLING);
+ vring->mode = VNET_HW_IF_RX_MODE_POLLING;
+ virtio_vring_fill (vm, vif, vring);
}
vnet_hw_if_update_runtime_data (vnm, vif->hw_if_index);
}
+void
+virtio_vring_set_tx_queues (vlib_main_t *vm, virtio_if_t *vif)
+{
+ vnet_main_t *vnm = vnet_get_main ();
+ virtio_vring_t *vring;
+
+ vec_foreach (vring, vif->txq_vrings)
+ {
+ vring->queue_index = vnet_hw_if_register_tx_queue (
+ vnm, vif->hw_if_index, TX_QUEUE_ACCESS (vring->queue_id));
+ }
+
+ if (vif->num_txqs == 0)
+ {
+ virtio_log_error (vif, "Interface %U has 0 txq",
+ format_vnet_hw_if_index_name, vnm, vif->hw_if_index);
+ return;
+ }
+
+ for (u32 j = 0; j < vlib_get_n_threads (); j++)
+ {
+ u32 qi = vif->txq_vrings[j % vif->num_txqs].queue_index;
+ vnet_hw_if_tx_queue_assign_thread (vnm, qi, j);
+ }
+
+ vnet_hw_if_update_runtime_data (vnm, vif->hw_if_index);
+}
+
inline void
virtio_set_net_hdr_size (virtio_if_t * vif)
{
}
inline void
-virtio_show (vlib_main_t * vm, u32 * hw_if_indices, u8 show_descr, u32 type)
+virtio_show (vlib_main_t *vm, u32 *hw_if_indices, u8 show_descr,
+ virtio_if_type_t type)
{
u32 i, j, hw_if_index;
virtio_if_t *vif;
}
vlib_cli_output (vm, " Number of RX Virtqueue %u", vif->num_rxqs);
vlib_cli_output (vm, " Number of TX Virtqueue %u", vif->num_txqs);
- if (vif->cxq_vring != NULL
- && vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ))
+ if (type == VIRTIO_IF_TYPE_PCI && vif->cxq_vring != NULL &&
+ vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ))
vlib_cli_output (vm, " Number of CTRL Virtqueue 1");
vec_foreach_index (i, vif->rxq_vrings)
{
}
}
}
- if (vif->cxq_vring != NULL
- && vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ))
+ if (type == VIRTIO_IF_TYPE_PCI && vif->cxq_vring != NULL &&
+ vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ))
{
vring = vif->cxq_vring;
vlib_cli_output (vm, " Virtqueue (CTRL) %d", vring->queue_id);
vring->avail->flags, vring->avail->idx,
vring->used->flags, vring->used->idx);
}
- if (type & (VIRTIO_IF_TYPE_TAP | VIRTIO_IF_TYPE_TUN))
- {
- vlib_cli_output (vm, " kickfd %d, callfd %d", vring->kick_fd,
- vring->call_fd);
- }
if (show_descr)
{
vlib_cli_output (vm, "\n descriptor table:\n");
}
}
}
-
}
}