From d2bfb78f4f8fbfae204424467a4106530b89e608 Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Mon, 7 Jan 2019 20:56:04 +0100 Subject: [PATCH] avf: allocate descriptor memory from local numa Change-Id: Ic56ee4ce83b282a5f0f5aed500721fe639b941b3 Signed-off-by: Damjan Marion --- src/plugins/avf/avf.h | 1 + src/plugins/avf/device.c | 44 ++++++++++++++++++++++++++++++-------------- src/vlib/linux/pci.c | 9 +++++++++ src/vlib/pci/pci.h | 1 + src/vlib/physmem.c | 1 + src/vlib/physmem.h | 1 + src/vlib/physmem_funcs.h | 9 +++++++++ 7 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/plugins/avf/avf.h b/src/plugins/avf/avf.h index 60d49e7ce18..518c7d8329a 100644 --- a/src/plugins/avf/avf.h +++ b/src/plugins/avf/avf.h @@ -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; diff --git a/src/plugins/avf/device.c b/src/plugins/avf/device.c index f6a00a1d30a..38af1cbcf8b 100644 --- a/src/plugins/avf/device.c +++ b/src/plugins/avf/device.c @@ -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; diff --git a/src/vlib/linux/pci.c b/src/vlib/linux/pci.c index ed43580ffc0..b99f54f2a62 100644 --- a/src/vlib/linux/pci.c +++ b/src/vlib/linux/pci.c @@ -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 */ diff --git a/src/vlib/pci/pci.h b/src/vlib/pci/pci.h index 1c70cc7bb80..71d4baedd20 100644 --- a/src/vlib/pci/pci.h +++ b/src/vlib/pci/pci.h @@ -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); diff --git a/src/vlib/physmem.c b/src/vlib/physmem.c index 37bf693f182..21fe44fc1ca 100755 --- a/src/vlib/physmem.c +++ b/src/vlib/physmem.c @@ -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++) { diff --git a/src/vlib/physmem.h b/src/vlib/physmem.h index 3e73a1b03f0..a986a50b1cb 100644 --- a/src/vlib/physmem.h +++ b/src/vlib/physmem.h @@ -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 diff --git a/src/vlib/physmem_funcs.h b/src/vlib/physmem_funcs.h index 70fb8e74fc7..18daeebabd9 100644 --- a/src/vlib/physmem_funcs.h +++ b/src/vlib/physmem_funcs.h @@ -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) -- 2.16.6