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
committed by
Florin Coras
parent
7c03ed47d5
commit
d2bfb78f4f
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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);
|
||||
|
@ -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++)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user