avf: allocate descriptor memory from local numa

Change-Id: Ic56ee4ce83b282a5f0f5aed500721fe639b941b3
Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:
Damjan Marion
2019-01-07 20:56:04 +01:00
committed by Florin Coras
parent 7c03ed47d5
commit d2bfb78f4f
7 changed files with 52 additions and 14 deletions

View 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;

View 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;

View 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
*/

View 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);

View File

@ -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++)
{

View 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

View 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)