buffers: support per-numa-domain buffer size 35/41035/3
authorLukas Stockner <[email protected]>
Tue, 4 Jun 2024 14:14:55 +0000 (16:14 +0200)
committerDamjan Marion <[email protected]>
Wed, 5 Jun 2024 12:28:27 +0000 (12:28 +0000)
Currently, buffers-per-numa is used for all NUMA domains, and there's
no way to allocate different amounts for each domain.

Therefore, this adds a per-NUMA-domain buffer config section, which
currently has a single option to set the number of buffers.

If it's not specified or set to zero, the code falls back to
buffers-per-numa as before.

Type: improvement
Change-Id: If35d7a9eff6f8d1d78063ea7873dbf50780d0ec3
Signed-off-by: Lukas Stockner <[email protected]>
docs/configuration/reference.rst
src/vlib/buffer.c
src/vlib/buffer.h

index 598e195..d288a6d 100644 (file)
@@ -497,6 +497,9 @@ The buffers Section
       buffers-per-numa 128000
       default data-size 2048
       page-size default-hugepage
+      numa 1 {
+         buffers 64000
+      }
    }
 
 buffers-per-numa number
@@ -532,6 +535,31 @@ Set the page size for buffer allocation
    page-size default
    page-size default-hugepage
 
+numa <numa index> { .. }
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Settings specific to a single NUMA domain.
+
+.. code-block:: console
+
+   buffers {
+      numa 0 {
+         buffers 32768
+      }
+   }
+
+buffers <n>
+^^^^^^^^^^^^^^^
+
+The number of buffers allocated for this specific NUMA domain.
+Default is 0, which falls back to the value configured in **buffers-per-numa**.
+
+.. code-block:: console
+
+   numa 0 {
+      buffers 32768
+   }
+
 
 The dpdk Section
 ----------------
index 674f15d..5ba4227 100644 (file)
@@ -663,7 +663,7 @@ vlib_buffer_main_init_numa_alloc (struct vlib_main_t *vm, u32 numa_node,
                                  u8 unpriv)
 {
   vlib_buffer_main_t *bm = vm->buffer_main;
-  u32 buffers_per_numa = bm->buffers_per_numa;
+  u32 buffers_per_numa = bm->buffers_per_numa[numa_node];
   clib_error_t *error;
   u32 buffer_size;
   uword n_pages, pagesize;
@@ -679,6 +679,9 @@ 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 "
                              "size (%llu)", buffer_size, pagesize);
 
+  if (buffers_per_numa == 0)
+    buffers_per_numa = bm->default_buffers_per_numa;
+
   if (buffers_per_numa == 0)
     buffers_per_numa = unpriv ? VLIB_BUFFER_DEFAULT_BUFFERS_PER_NUMA_UNPRIV :
       VLIB_BUFFER_DEFAULT_BUFFERS_PER_NUMA;
@@ -905,19 +908,49 @@ done:
   return err;
 }
 
+static clib_error_t *
+vlib_buffers_numa_configure (vlib_buffer_main_t *bm, u32 numa_node,
+                            unformat_input_t *input)
+{
+  u32 buffers = 0;
+
+  if (numa_node >= VLIB_BUFFER_MAX_NUMA_NODES)
+    return clib_error_return (0, "invalid numa node");
+
+  if (!input)
+    return 0;
+
+  unformat_skip_white_space (input);
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "buffers %u", &buffers))
+       ;
+      else
+       return unformat_parse_error (input);
+    }
+
+  bm->buffers_per_numa[numa_node] = buffers;
+  return 0;
+}
+
 static clib_error_t *
 vlib_buffers_configure (vlib_main_t * vm, unformat_input_t * input)
 {
   vlib_buffer_main_t *bm;
+  u32 numa_node;
+  unformat_input_t sub_input;
+  clib_error_t *error = 0;
 
   vlib_buffer_main_alloc (vm);
 
   bm = vm->buffer_main;
   bm->log2_page_size = CLIB_MEM_PAGE_SZ_UNKNOWN;
+  memset (bm->buffers_per_numa, 0, sizeof (bm->buffers_per_numa));
 
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat (input, "buffers-per-numa %u", &bm->buffers_per_numa))
+      if (unformat (input, "buffers-per-numa %u",
+                   &bm->default_buffers_per_numa))
        ;
       else if (unformat (input, "page-size %U", unformat_log2_page_size,
                         &bm->log2_page_size))
@@ -925,6 +958,15 @@ vlib_buffers_configure (vlib_main_t * vm, unformat_input_t * input)
       else if (unformat (input, "default data-size %u",
                         &bm->default_data_size))
        ;
+      else if (unformat (input, "numa %u %U", &numa_node,
+                        unformat_vlib_cli_sub_input, &sub_input))
+       {
+         error = vlib_buffers_numa_configure (bm, numa_node, &sub_input);
+         unformat_free (&sub_input);
+
+         if (error)
+           return error;
+       }
       else
        return unformat_parse_error (input);
     }
index 7d45689..aad9701 100644 (file)
@@ -508,7 +508,8 @@ typedef struct
   u8 default_buffer_pool_index_for_numa[VLIB_BUFFER_MAX_NUMA_NODES];
 
   /* config */
-  u32 buffers_per_numa;
+  u32 default_buffers_per_numa;
+  u32 buffers_per_numa[VLIB_BUFFER_MAX_NUMA_NODES];
   u16 ext_hdr_size;
   u32 default_data_size;
   clib_mem_page_sz_t log2_page_size;