From 09a3bc50b581c72693ff6270da20a68f5781a468 Mon Sep 17 00:00:00 2001 From: Mohsin Kazmi Date: Tue, 2 Apr 2019 11:45:08 +0000 Subject: virtio: Add support for multiqueue Change-Id: Id71ffa77e977651f219ac09d1feef334851209e1 Signed-off-by: Mohsin Kazmi --- src/vnet/devices/tap/tap.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) (limited to 'src/vnet/devices/tap') diff --git a/src/vnet/devices/tap/tap.c b/src/vnet/devices/tap/tap.c index 2649f68713e..388cfa34c37 100644 --- a/src/vnet/devices/tap/tap.c +++ b/src/vnet/devices/tap/tap.c @@ -334,23 +334,25 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args) vhost_mem->regions[0].memory_size = (1ULL << 47) - 4096; _IOCTL (vif->fd, VHOST_SET_MEM_TABLE, vhost_mem); - if ((args->error = virtio_vring_init (vm, vif, 0, args->rx_ring_sz))) + if ((args->error = + virtio_vring_init (vm, vif, RX_QUEUE (0), args->rx_ring_sz))) { args->rv = VNET_API_ERROR_INIT_FAILED; goto error; } + vif->num_rxqs = 1; - if ((args->error = virtio_vring_init (vm, vif, 1, args->tx_ring_sz))) + if ((args->error = + virtio_vring_init (vm, vif, TX_QUEUE (0), args->tx_ring_sz))) { args->rv = VNET_API_ERROR_INIT_FAILED; goto error; } + vif->num_txqs = 1; if (!args->mac_addr_set) ethernet_mac_address_generate (args->mac_addr); - vif->rx_ring_sz = args->rx_ring_sz != 0 ? args->rx_ring_sz : 256; - vif->tx_ring_sz = args->tx_ring_sz != 0 ? args->tx_ring_sz : 256; clib_memcpy (vif->mac_addr, args->mac_addr, 6); vif->host_if_name = args->host_if_name; @@ -396,10 +398,12 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args) vnet_hw_interface_set_rx_mode (vnm, vif->hw_if_index, 0, VNET_HW_INTERFACE_RX_MODE_DEFAULT); vif->per_interface_next_index = ~0; - virtio_vring_set_numa_node (vm, vif, 0); + virtio_vring_set_numa_node (vm, vif, RX_QUEUE (0)); vif->flags |= VIRTIO_IF_FLAG_ADMIN_UP; vnet_hw_interface_set_flags (vnm, vif->hw_if_index, VNET_HW_INTERFACE_FLAG_LINK_UP); + vif->cxq_vring = NULL; + if (thm->n_vlib_mains > 1) clib_spinlock_init (&vif->lockp); goto done; @@ -415,8 +419,12 @@ error: close (vif->tap_fd); if (vif->fd != -1) close (vif->fd); - vec_foreach_index (i, vif->vrings) virtio_vring_free (vm, vif, i); - vec_free (vif->vrings); + vec_foreach_index (i, vif->rxq_vrings) virtio_vring_free_rx (vm, vif, + RX_QUEUE (i)); + vec_foreach_index (i, vif->txq_vrings) virtio_vring_free_tx (vm, vif, + TX_QUEUE (i)); + vec_free (vif->rxq_vrings); + vec_free (vif->txq_vrings); clib_memset (vif, 0, sizeof (virtio_if_t)); pool_put (vim->interfaces, vif); @@ -455,7 +463,7 @@ tap_delete_if (vlib_main_t * vm, u32 sw_if_index) /* bring down the interface */ vnet_hw_interface_set_flags (vnm, vif->hw_if_index, 0); vnet_sw_interface_set_flags (vnm, vif->sw_if_index, 0); - vnet_hw_interface_unassign_rx_thread (vnm, vif->hw_if_index, 0); + vnet_hw_interface_unassign_rx_thread (vnm, vif->hw_if_index, RX_QUEUE (0)); ethernet_delete_interface (vnm, vif->hw_if_index); vif->hw_if_index = ~0; @@ -465,8 +473,12 @@ tap_delete_if (vlib_main_t * vm, u32 sw_if_index) if (vif->fd != -1) close (vif->fd); - vec_foreach_index (i, vif->vrings) virtio_vring_free (vm, vif, i); - vec_free (vif->vrings); + vec_foreach_index (i, vif->rxq_vrings) virtio_vring_free_rx (vm, vif, + RX_QUEUE (i)); + vec_foreach_index (i, vif->txq_vrings) virtio_vring_free_tx (vm, vif, + TX_QUEUE (i)); + vec_free (vif->rxq_vrings); + vec_free (vif->txq_vrings); tm->tap_ids = clib_bitmap_set (tm->tap_ids, vif->id, 0); clib_spinlock_free (&vif->lockp); @@ -528,6 +540,7 @@ tap_dump_ifs (tap_interface_details_t ** out_tapids) vnet_main_t *vnm = vnet_get_main (); virtio_main_t *mm = &virtio_main; virtio_if_t *vif; + virtio_vring_t *vring; vnet_hw_interface_t *hi; tap_interface_details_t *r_tapids = NULL; tap_interface_details_t *tapid = NULL; @@ -544,8 +557,10 @@ tap_dump_ifs (tap_interface_details_t ** out_tapids) clib_memcpy(tapid->dev_name, hi->name, MIN (ARRAY_LEN (tapid->dev_name) - 1, strlen ((const char *) hi->name))); - tapid->rx_ring_sz = vif->rx_ring_sz; - tapid->tx_ring_sz = vif->tx_ring_sz; + vring = vec_elt_at_index (vif->rxq_vrings, RX_QUEUE_ACCESS(0)); + tapid->rx_ring_sz = vring->size; + vring = vec_elt_at_index (vif->txq_vrings, TX_QUEUE_ACCESS(0)); + tapid->tx_ring_sz = vring->size; clib_memcpy(tapid->host_mac_addr, vif->host_mac_addr, 6); if (vif->host_if_name) { -- cgit 1.2.3-korg