buffers: support disabling allocation per numa domain

Currently, the per-numa buffer allocation doesn't support skipping the
allocation altogether for a particular NUMA domain - if it's set to
zero, it instead uses the default allocation.

Therefore, this changes the behavior so that the default is only used
if no per-numa allocation is specified, and an allocation of zero
is honored by not allocating a buffer at all.

Type: improvement
Change-Id: Ie9133b179a88eb884aa3da921e65292daea0df2d
Signed-off-by: Lukas Stockner <lstockner@genesiscloud.com>
This commit is contained in:
Lukas Stockner
2024-06-18 14:52:52 +02:00
committed by Damjan Marion
parent ff17350ae0
commit b4808de247
2 changed files with 16 additions and 8 deletions

View File

@ -552,7 +552,9 @@ buffers <n>
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
The number of buffers allocated for this specific NUMA domain. The number of buffers allocated for this specific NUMA domain.
Default is 0, which falls back to the value configured in **buffers-per-numa**. If this is set to zero, no buffers are allocated for this domain.
By default, the value configured in **buffers-per-numa** is used.
.. code-block:: console .. code-block:: console

View File

@ -663,6 +663,7 @@ vlib_buffer_main_init_numa_alloc (struct vlib_main_t *vm, u32 numa_node,
u8 unpriv) u8 unpriv)
{ {
vlib_buffer_main_t *bm = vm->buffer_main; vlib_buffer_main_t *bm = vm->buffer_main;
u32 default_buffers_per_numa = bm->default_buffers_per_numa;
u32 buffers_per_numa = bm->buffers_per_numa[numa_node]; u32 buffers_per_numa = bm->buffers_per_numa[numa_node];
clib_error_t *error; clib_error_t *error;
u32 buffer_size; u32 buffer_size;
@ -679,12 +680,13 @@ vlib_buffer_main_init_numa_alloc (struct vlib_main_t *vm, u32 numa_node,
return clib_error_return (0, "buffer size (%llu) is greater than page " return clib_error_return (0, "buffer size (%llu) is greater than page "
"size (%llu)", buffer_size, pagesize); "size (%llu)", buffer_size, pagesize);
if (buffers_per_numa == 0) if (default_buffers_per_numa == 0)
buffers_per_numa = bm->default_buffers_per_numa; default_buffers_per_numa = unpriv ?
VLIB_BUFFER_DEFAULT_BUFFERS_PER_NUMA_UNPRIV :
VLIB_BUFFER_DEFAULT_BUFFERS_PER_NUMA;
if (buffers_per_numa == 0) if (buffers_per_numa == ~0)
buffers_per_numa = unpriv ? VLIB_BUFFER_DEFAULT_BUFFERS_PER_NUMA_UNPRIV : buffers_per_numa = default_buffers_per_numa;
VLIB_BUFFER_DEFAULT_BUFFERS_PER_NUMA;
name = format (0, "buffers-numa-%d%c", numa_node, 0); name = format (0, "buffers-numa-%d%c", numa_node, 0);
n_pages = (buffers_per_numa - 1) / (pagesize / buffer_size) + 1; n_pages = (buffers_per_numa - 1) / (pagesize / buffer_size) + 1;
@ -856,6 +858,10 @@ vlib_buffer_main_init (struct vlib_main_t * vm)
{ {
u8 *index = bm->default_buffer_pool_index_for_numa + numa_node; u8 *index = bm->default_buffer_pool_index_for_numa + numa_node;
index[0] = ~0; index[0] = ~0;
if (bm->buffers_per_numa[numa_node] == 0)
continue;
if ((err = vlib_buffer_main_init_numa_node (vm, numa_node, index))) if ((err = vlib_buffer_main_init_numa_node (vm, numa_node, index)))
{ {
clib_error_report (err); clib_error_report (err);
@ -912,7 +918,7 @@ static clib_error_t *
vlib_buffers_numa_configure (vlib_buffer_main_t *bm, u32 numa_node, vlib_buffers_numa_configure (vlib_buffer_main_t *bm, u32 numa_node,
unformat_input_t *input) unformat_input_t *input)
{ {
u32 buffers = 0; u32 buffers = ~0;
if (numa_node >= VLIB_BUFFER_MAX_NUMA_NODES) if (numa_node >= VLIB_BUFFER_MAX_NUMA_NODES)
return clib_error_return (0, "invalid numa node"); return clib_error_return (0, "invalid numa node");
@ -945,7 +951,7 @@ vlib_buffers_configure (vlib_main_t * vm, unformat_input_t * input)
bm = vm->buffer_main; bm = vm->buffer_main;
bm->log2_page_size = CLIB_MEM_PAGE_SZ_UNKNOWN; bm->log2_page_size = CLIB_MEM_PAGE_SZ_UNKNOWN;
memset (bm->buffers_per_numa, 0, sizeof (bm->buffers_per_numa)); memset (bm->buffers_per_numa, ~0, sizeof (bm->buffers_per_numa));
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{ {