avf: allocate descriptor memory from local numa 17/16717/2
authorDamjan Marion <damarion@cisco.com>
Mon, 7 Jan 2019 19:56:04 +0000 (20:56 +0100)
committerFlorin Coras <florin.coras@gmail.com>
Mon, 7 Jan 2019 21:57:17 +0000 (21:57 +0000)
Change-Id: Ic56ee4ce83b282a5f0f5aed500721fe639b941b3
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/plugins/avf/avf.h
src/plugins/avf/device.c
src/vlib/linux/pci.c
src/vlib/pci/pci.h
src/vlib/physmem.c
src/vlib/physmem.h
src/vlib/physmem_funcs.h

index 60d49e7..518c7d8 100644 (file)
@@ -127,6 +127,7 @@ typedef struct
   u32 sw_if_index;
   u32 hw_if_index;
   vlib_pci_dev_handle_t pci_dev_handle;
+  u32 numa_node;
   void *bar0;
   u8 *name;
 
index f6a00a1..38af1cb 100644 (file)
@@ -224,9 +224,11 @@ avf_rxq_init (vlib_main_t * vm, avf_device_t * ad, u16 qid, u16 rxq_size)
   rxq = vec_elt_at_index (ad->rxqs, qid);
   rxq->size = rxq_size;
   rxq->next = 0;
-  rxq->descs = vlib_physmem_alloc_aligned (vm, rxq->size *
-                                          sizeof (avf_rx_desc_t),
-                                          2 * CLIB_CACHE_LINE_BYTES);
+  rxq->descs = vlib_physmem_alloc_aligned_on_numa (vm, rxq->size *
+                                                  sizeof (avf_rx_desc_t),
+                                                  2 * CLIB_CACHE_LINE_BYTES,
+                                                  ad->numa_node);
+
   if (rxq->descs == 0)
     return vlib_physmem_last_error (vm);
 
@@ -278,9 +280,10 @@ avf_txq_init (vlib_main_t * vm, avf_device_t * ad, u16 qid, u16 txq_size)
   txq = vec_elt_at_index (ad->txqs, qid);
   txq->size = txq_size;
   txq->next = 0;
-  txq->descs = vlib_physmem_alloc_aligned (vm, txq->size *
-                                          sizeof (avf_tx_desc_t),
-                                          2 * CLIB_CACHE_LINE_BYTES);
+  txq->descs = vlib_physmem_alloc_aligned_on_numa (vm, txq->size *
+                                                  sizeof (avf_tx_desc_t),
+                                                  2 * CLIB_CACHE_LINE_BYTES,
+                                                  ad->numa_node);
   if (txq->descs == 0)
     return vlib_physmem_last_error (vm);
 
@@ -1223,6 +1226,7 @@ avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args)
       return;
     }
   ad->pci_dev_handle = h;
+  ad->numa_node = vlib_pci_get_numa_node (vm, h);
 
   vlib_pci_set_private_data (vm, h, ad->dev_instance);
 
@@ -1243,8 +1247,11 @@ avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args)
   if ((error = vlib_pci_enable_msix_irq (vm, h, 0, 2)))
     goto error;
 
-  if (!(ad->atq = vlib_physmem_alloc (vm, sizeof (avf_aq_desc_t) *
-                                     AVF_MBOX_LEN)))
+  ad->atq = vlib_physmem_alloc_aligned_on_numa (vm, sizeof (avf_aq_desc_t) *
+                                               AVF_MBOX_LEN,
+                                               CLIB_CACHE_LINE_BYTES,
+                                               ad->numa_node);
+  if (ad->atq == 0)
     {
       error = vlib_physmem_last_error (vm);
       goto error;
@@ -1253,8 +1260,11 @@ avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args)
   if ((error = vlib_pci_map_dma (vm, h, ad->atq)))
     goto error;
 
-  if (!(ad->arq = vlib_physmem_alloc (vm, sizeof (avf_aq_desc_t) *
-                                     AVF_MBOX_LEN)))
+  ad->arq = vlib_physmem_alloc_aligned_on_numa (vm, sizeof (avf_aq_desc_t) *
+                                               AVF_MBOX_LEN,
+                                               CLIB_CACHE_LINE_BYTES,
+                                               ad->numa_node);
+  if (ad->arq == 0)
     {
       error = vlib_physmem_last_error (vm);
       goto error;
@@ -1263,8 +1273,11 @@ avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args)
   if ((error = vlib_pci_map_dma (vm, h, ad->arq)))
     goto error;
 
-  if (!(ad->atq_bufs = vlib_physmem_alloc (vm, AVF_MBOX_BUF_SZ *
-                                          AVF_MBOX_LEN)))
+  ad->atq_bufs = vlib_physmem_alloc_aligned_on_numa (vm, AVF_MBOX_BUF_SZ *
+                                                    AVF_MBOX_LEN,
+                                                    CLIB_CACHE_LINE_BYTES,
+                                                    ad->numa_node);
+  if (ad->atq_bufs == 0)
     {
       error = vlib_physmem_last_error (vm);
       goto error;
@@ -1273,8 +1286,11 @@ avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args)
   if ((error = vlib_pci_map_dma (vm, h, ad->atq_bufs)))
     goto error;
 
-  if (!(ad->arq_bufs = vlib_physmem_alloc (vm, AVF_MBOX_BUF_SZ *
-                                          AVF_MBOX_LEN)))
+  ad->arq_bufs = vlib_physmem_alloc_aligned_on_numa (vm, AVF_MBOX_BUF_SZ *
+                                                    AVF_MBOX_LEN,
+                                                    CLIB_CACHE_LINE_BYTES,
+                                                    ad->numa_node);
+  if (ad->arq_bufs == 0)
     {
       error = vlib_physmem_last_error (vm);
       goto error;
index ed43580..b99f54f 100644 (file)
@@ -97,6 +97,7 @@ typedef struct
   linux_pci_device_type_t type;
   vlib_pci_dev_handle_t handle;
   vlib_pci_addr_t addr;
+  u32 numa_node;
 
   /* Resource file descriptors. */
   linux_pci_region_t *regions;
@@ -165,6 +166,13 @@ vlib_pci_get_addr (vlib_main_t * vm, vlib_pci_dev_handle_t h)
   return &d->addr;
 }
 
+u32
+vlib_pci_get_numa_node (vlib_main_t * vm, vlib_pci_dev_handle_t h)
+{
+  linux_pci_device_t *d = linux_pci_get_device (h);
+  return d->numa_node;
+}
+
 /* Call to allocate/initialize the pci subsystem.
    This is not an init function so that users can explicitly enable
    pci only when it's needed. */
@@ -1210,6 +1218,7 @@ vlib_pci_device_open (vlib_main_t * vm, vlib_pci_addr_t * addr,
   p->handle = p - lpm->linux_pci_devices;
   p->addr.as_u32 = di->addr.as_u32;
   p->intx_irq.fd = -1;
+  p->numa_node = di->numa_node;
   /*
    * pci io bar read/write fd
    */
index 1c70cc7..71d4bae 100644 (file)
@@ -102,6 +102,7 @@ vlib_pci_device_info_t *vlib_pci_get_device_info (vlib_main_t * vm,
 vlib_pci_addr_t *vlib_pci_get_all_dev_addrs ();
 vlib_pci_addr_t *vlib_pci_get_addr (vlib_main_t * vm,
                                    vlib_pci_dev_handle_t h);
+u32 vlib_pci_get_numa_node (vlib_main_t * vm, vlib_pci_dev_handle_t h);
 uword vlib_pci_get_private_data (vlib_main_t * vm, vlib_pci_dev_handle_t h);
 void vlib_pci_set_private_data (vlib_main_t * vm, vlib_pci_dev_handle_t h,
                                uword private_data);
index 37bf693..21fe44f 100755 (executable)
@@ -57,6 +57,7 @@ vlib_physmem_shared_map_create (vlib_main_t * vm, char *name, uword size,
   map->fd = a->fd;
   map->n_pages = a->n_pages * a->subpages_per_page;
   map->log2_page_size = a->log2_subpage_sz;
+  map->numa_node = a->numa_node;
 
   for (i = 0; i < a->n_pages; i++)
     {
index 3e73a1b..a986a50 100644 (file)
@@ -50,6 +50,7 @@ typedef struct
   u32 n_pages;
   uword *page_table;
   u32 log2_page_size;
+  u32 numa_node;
 } vlib_physmem_map_t;
 
 typedef struct
index 70fb8e7..18daeeb 100644 (file)
@@ -54,6 +54,15 @@ vlib_physmem_alloc_aligned (vlib_main_t * vm, uword n_bytes, uword alignment)
   return clib_pmalloc_alloc_aligned (pm, n_bytes, alignment);
 }
 
+always_inline void *
+vlib_physmem_alloc_aligned_on_numa (vlib_main_t * vm, uword n_bytes,
+                                   uword alignment, u32 numa_node)
+{
+  clib_pmalloc_main_t *pm = vm->physmem_main.pmalloc_main;
+  return clib_pmalloc_alloc_aligned_on_numa (pm, n_bytes, alignment,
+                                            numa_node);
+}
+
 /* By default allocate I/O memory with cache line alignment. */
 always_inline void *
 vlib_physmem_alloc (vlib_main_t * vm, uword n_bytes)