virtio: Use new buffer optimization 03/17203/5
authorMohsin Kazmi <sykazmi@cisco.com>
Thu, 31 Jan 2019 13:18:00 +0000 (13:18 +0000)
committerDamjan Marion <dmarion@me.com>
Wed, 6 Feb 2019 17:27:44 +0000 (17:27 +0000)
Change-Id: Ifc98373371b967c49a75989eac415ddda1dcf15f
Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
src/vnet/devices/tap/tap.c
src/vnet/devices/virtio/node.c
src/vnet/devices/virtio/pci.c
src/vnet/devices/virtio/virtio.c
src/vnet/devices/virtio/virtio.h

index 4f3066a..101576c 100644 (file)
@@ -392,6 +392,7 @@ 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);
   vif->flags |= VIRTIO_IF_FLAG_ADMIN_UP;
   vnet_hw_interface_set_flags (vnm, vif->hw_if_index,
                               VNET_HW_INTERFACE_FLAG_LINK_UP);
index 6627456..78d071a 100644 (file)
@@ -96,8 +96,10 @@ more:
 
   next = vring->desc_next;
   avail = vring->avail->idx;
-  n_slots = vlib_buffer_alloc_to_ring (vm, vring->buffers, next, vring->size,
-                                      n_slots);
+  n_slots =
+    vlib_buffer_alloc_to_ring_from_pool (vm, vring->buffers, next,
+                                        vring->size, n_slots,
+                                        vring->buffer_pool_index);
 
   if (n_slots == 0)
     return;
index a90dca4..ffc18f4 100644 (file)
@@ -873,6 +873,7 @@ virtio_pci_create_if (vlib_main_t * vm, virtio_pci_create_if_args_t * args)
   vnet_hw_interface_set_input_node (vnm, vif->hw_if_index,
                                    virtio_input_node.index);
   vnet_hw_interface_assign_rx_thread (vnm, vif->hw_if_index, 0, ~0);
+  virtio_vring_set_numa_node (vm, vif, 0);
 
   if (virtio_pci_is_link_up (vm, vif) & VIRTIO_NET_S_LINK_UP)
     {
index 94f140d..cfeb302 100644 (file)
@@ -196,6 +196,21 @@ virtio_vring_free (vlib_main_t * vm, virtio_if_t * vif, u32 idx)
   return 0;
 }
 
+void
+virtio_vring_set_numa_node (vlib_main_t * vm, virtio_if_t * vif, u32 idx)
+{
+  vnet_main_t *vnm = vnet_get_main ();
+  u32 thread_index;
+  virtio_vring_t *vring = vec_elt_at_index (vif->vrings, idx);
+  thread_index =
+    vnet_get_device_input_thread_index (vnm, vif->hw_if_index,
+                                       vring->queue_id);
+  vring->buffer_pool_index =
+    vlib_buffer_pool_get_default_for_numa (vm,
+                                          vlib_mains
+                                          [thread_index]->numa_node);
+}
+
 inline void
 virtio_set_net_hdr_size (virtio_if_t * vif)
 {
index 73bb33f..b2e74be 100644 (file)
@@ -103,6 +103,7 @@ typedef struct
   u16 desc_next;
   int kick_fd;
   int call_fd;
+  u8 buffer_pool_index;
   u16 size;
   u16 queue_id;
   u16 flags;
@@ -188,6 +189,8 @@ clib_error_t *virtio_vring_init (vlib_main_t * vm, virtio_if_t * vif, u16 idx,
                                 u16 sz);
 clib_error_t *virtio_vring_free (vlib_main_t * vm, virtio_if_t * vif,
                                 u32 idx);
+void virtio_vring_set_numa_node (vlib_main_t * vm, virtio_if_t * vif,
+                                u32 idx);
 extern void virtio_free_used_desc (vlib_main_t * vm, virtio_vring_t * vring);
 extern void virtio_free_rx_buffers (vlib_main_t * vm, virtio_vring_t * vring);
 extern void virtio_set_net_hdr_size (virtio_if_t * vif);