aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2021-04-16 12:49:33 +0300
committerMatias Elo <matias.elo@nokia.com>2021-04-27 15:25:42 +0300
commit02665acfcb2c2821eb99da5e70fd8980fa713721 (patch)
tree759f19c0030f8eb6fb53ec4f480e247282c19807
parent5b6bb50de0c0383a88d6367d0b64759e5a5d24a4 (diff)
linux-dpdk: preallocate dpdk memory in process mode
DPDK memory needs to be preallocated to support process mode. The amount of preallocated memory can be adjusted with dpdk.process_mode_memory_mb configuration file option. Signed-off-by: Matias Elo <matias.elo@nokia.com> Reviewed-by: Jere Leppänen <jere.leppanen@nokia.com>
-rw-r--r--config/odp-linux-dpdk.conf12
-rw-r--r--platform/linux-dpdk/m4/odp_libconfig.m42
-rw-r--r--platform/linux-dpdk/odp_init.c28
3 files changed, 36 insertions, 6 deletions
diff --git a/config/odp-linux-dpdk.conf b/config/odp-linux-dpdk.conf
index 7242bc32f..0c541fdd5 100644
--- a/config/odp-linux-dpdk.conf
+++ b/config/odp-linux-dpdk.conf
@@ -16,7 +16,7 @@
# Mandatory fields
odp_implementation = "linux-dpdk"
-config_file_version = "0.1.10"
+config_file_version = "0.1.11"
# System options
system: {
@@ -37,6 +37,16 @@ system: {
thread_count_max = 256
}
+# DPDK options
+dpdk: {
+ # Amount of preallocated memory for process mode usage in megabytes
+ #
+ # NOTE: Process mode is not officially supported by DPDK. Application
+ # should reserve all shared resources and configure the system before
+ # forking child processes for the best success probability.
+ process_mode_memory_mb = 512
+}
+
# Pool options
pool: {
# Packet pool options
diff --git a/platform/linux-dpdk/m4/odp_libconfig.m4 b/platform/linux-dpdk/m4/odp_libconfig.m4
index 7f9ca3d6e..f56946ec5 100644
--- a/platform/linux-dpdk/m4/odp_libconfig.m4
+++ b/platform/linux-dpdk/m4/odp_libconfig.m4
@@ -3,7 +3,7 @@
##########################################################################
m4_define([_odp_config_version_generation], [0])
m4_define([_odp_config_version_major], [1])
-m4_define([_odp_config_version_minor], [10])
+m4_define([_odp_config_version_minor], [11])
m4_define([_odp_config_version],
[_odp_config_version_generation._odp_config_version_major._odp_config_version_minor])
diff --git a/platform/linux-dpdk/odp_init.c b/platform/linux-dpdk/odp_init.c
index 98f7d3926..1f39c4377 100644
--- a/platform/linux-dpdk/odp_init.c
+++ b/platform/linux-dpdk/odp_init.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2013-2018, Linaro Limited
- * Copyright (c) 2019, Nokia
+ * Copyright (c) 2019-2021, Nokia
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
@@ -18,6 +18,7 @@
#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
+#include <inttypes.h>
#include <rte_config.h>
#include <rte_eal.h>
@@ -80,6 +81,20 @@ static int _odp_init_dpdk(const char *cmdline)
{
int dpdk_argc;
int i, cmdlen;
+ const char *str;
+ uint32_t mem_prealloc;
+ int val = 0;
+
+ ODP_PRINT("DPDK config:\n");
+
+ str = "dpdk.process_mode_memory_mb";
+ if (!_odp_libconfig_lookup_int(str, &val)) {
+ ODP_ERR("Config option '%s' not found.\n", str);
+ return -1;
+ }
+ mem_prealloc = val;
+
+ ODP_PRINT(" %s: %" PRIu32 "\n\n", str, mem_prealloc);
if (cmdline == NULL) {
cmdline = getenv("ODP_PLATFORM_PARAMS");
@@ -87,12 +102,17 @@ static int _odp_init_dpdk(const char *cmdline)
cmdline = "";
}
- cmdlen = snprintf(NULL, 0, "odpdpdk %s ", cmdline);
+ cmdlen = snprintf(NULL, 0, "odpdpdk -m %" PRIu32 " %s ", mem_prealloc, cmdline);
char full_cmdline[cmdlen];
- /* first argument is facility log, simply bind it to odpdpdk for now.*/
- cmdlen = snprintf(full_cmdline, cmdlen, "odpdpdk %s", cmdline);
+ /* First argument is facility log, simply bind it to odpdpdk for now. In
+ * process mode DPDK memory has to be preallocated. */
+ if (odp_global_ro.init_param.mem_model == ODP_MEM_MODEL_PROCESS)
+ cmdlen = snprintf(full_cmdline, cmdlen, "odpdpdk -m %" PRIu32 " %s",
+ mem_prealloc, cmdline);
+ else
+ cmdlen = snprintf(full_cmdline, cmdlen, "odpdpdk %s", cmdline);
for (i = 0, dpdk_argc = 1; i < cmdlen; ++i) {
if (isspace(full_cmdline[i]))