diff options
author | Janne Peltonen <janne.peltonen@nokia.com> | 2021-01-29 15:35:40 +0200 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2021-02-05 15:54:39 +0200 |
commit | 11ed8e34d095119a7725975a892c33a6c4e0891a (patch) | |
tree | a5f6b7f7623eb3ba2968d6066b088623cb7d354a | |
parent | 2c7116122a6613e928869e773acbd4337dc585a7 (diff) |
linux-gen: thread: read maximum number of threads from config file
Add system:thread_count_max config parameter that can be used to reduce
the maximum number of threads below the build time configured maximum.
This can be used to reduce thread related resource consumption such
as thread-local memory.
Most code still uses the build time limit, ODP_THREAD_COUNT_MAX, so this
change merely enables possible later optimizations in those cases.
ODP-DPDK will already benefit from this change as the number of queue
pairs for a crypto device can be lowered to match the actual number of
threads without ODP-DPDK having worry about possible sharing of the
queue pairs between threads.
Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
Reviewed-by: Matias Elo <matias.elo@nokia.com>
-rw-r--r-- | config/odp-linux-generic.conf | 8 | ||||
-rw-r--r-- | platform/linux-generic/m4/odp_libconfig.m4 | 2 | ||||
-rw-r--r-- | platform/linux-generic/odp_thread.c | 27 | ||||
-rw-r--r-- | platform/linux-generic/test/inline-timer.conf | 2 | ||||
-rw-r--r-- | platform/linux-generic/test/packet_align.conf | 2 | ||||
-rw-r--r-- | platform/linux-generic/test/process-mode.conf | 2 |
6 files changed, 34 insertions, 9 deletions
diff --git a/config/odp-linux-generic.conf b/config/odp-linux-generic.conf index a03c8568f..bb25c39b2 100644 --- a/config/odp-linux-generic.conf +++ b/config/odp-linux-generic.conf @@ -16,7 +16,7 @@ # Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.14" +config_file_version = "0.1.15" # System options system: { @@ -29,6 +29,12 @@ system: { # odp_cpu_hz_max_id() calls on platforms where max frequency isn't # available using standard Linux methods. cpu_mhz_max = 1400 + + # Maximum number of ODP threads that can be created. + # odp_thread_count_max() returns this value or the build time + # maximum ODP_THREAD_COUNT_MAX, whichever is lower. This setting + # can be used to reduce thread related resource usage. + thread_count_max = 256 } # Shared memory options diff --git a/platform/linux-generic/m4/odp_libconfig.m4 b/platform/linux-generic/m4/odp_libconfig.m4 index 325c62ad0..7a0b45497 100644 --- a/platform/linux-generic/m4/odp_libconfig.m4 +++ b/platform/linux-generic/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], [14]) +m4_define([_odp_config_version_minor], [15]) m4_define([_odp_config_version], [_odp_config_version_generation._odp_config_version_major._odp_config_version_minor]) diff --git a/platform/linux-generic/odp_thread.c b/platform/linux-generic/odp_thread.c index bec7362bf..170bf82b7 100644 --- a/platform/linux-generic/odp_thread.c +++ b/platform/linux-generic/odp_thread.c @@ -1,4 +1,5 @@ /* Copyright (c) 2013-2018, Linaro Limited + * Copyright (c) 2021, Nokia * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause @@ -18,6 +19,7 @@ #include <odp/api/cpu.h> #include <odp_schedule_if.h> #include <odp/api/plat/thread_inlines.h> +#include <odp_libconfig_internal.h> #include <string.h> #include <stdio.h> @@ -35,6 +37,7 @@ typedef struct { uint32_t num; uint32_t num_worker; uint32_t num_control; + uint32_t num_max; odp_spinlock_t lock; } thread_globals_t; @@ -51,6 +54,19 @@ __thread _odp_thread_state_t *_odp_this_thread; int _odp_thread_init_global(void) { odp_shm_t shm; + int num_max = 0; + const char *str = "system.thread_count_max"; + + if (!_odp_libconfig_lookup_int(str, &num_max)) { + ODP_ERR("Config option '%s' not found.\n", str); + return -1; + } + if (num_max <= 0) { + ODP_ERR("Config option '%s' not valid.\n", str); + return -1; + } + if (num_max > ODP_THREAD_COUNT_MAX) + num_max = ODP_THREAD_COUNT_MAX; shm = odp_shm_reserve("_odp_thread_globals", sizeof(thread_globals_t), @@ -63,6 +79,9 @@ int _odp_thread_init_global(void) memset(thread_globals, 0, sizeof(thread_globals_t)); odp_spinlock_init(&thread_globals->lock); + thread_globals->num_max = num_max; + ODP_PRINT("System config:\n"); + ODP_PRINT(" system.thread_count_max: %d\n\n", num_max); return 0; } @@ -83,10 +102,10 @@ static int alloc_id(odp_thread_type_t type) int thr; odp_thrmask_t *all = &thread_globals->all; - if (thread_globals->num >= ODP_THREAD_COUNT_MAX) + if (thread_globals->num >= thread_globals->num_max) return -1; - for (thr = 0; thr < ODP_THREAD_COUNT_MAX; thr++) { + for (thr = 0; thr < (int)thread_globals->num_max; thr++) { if (odp_thrmask_isset(all, thr) == 0) { odp_thrmask_set(all, thr); @@ -110,7 +129,7 @@ static int free_id(int thr) { odp_thrmask_t *all = &thread_globals->all; - if (thr < 0 || thr >= ODP_THREAD_COUNT_MAX) + if (thr < 0 || thr >= (int)thread_globals->num_max) return -1; if (odp_thrmask_isset(all, thr) == 0) @@ -231,7 +250,7 @@ int odp_thread_count(void) int odp_thread_count_max(void) { - return ODP_THREAD_COUNT_MAX; + return thread_globals->num_max; } int odp_thrmask_worker(odp_thrmask_t *mask) diff --git a/platform/linux-generic/test/inline-timer.conf b/platform/linux-generic/test/inline-timer.conf index 096aab055..e4d4af307 100644 --- a/platform/linux-generic/test/inline-timer.conf +++ b/platform/linux-generic/test/inline-timer.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.14" +config_file_version = "0.1.15" timer: { # Enable inline timer implementation diff --git a/platform/linux-generic/test/packet_align.conf b/platform/linux-generic/test/packet_align.conf index 24ed46b56..9b37752ba 100644 --- a/platform/linux-generic/test/packet_align.conf +++ b/platform/linux-generic/test/packet_align.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.14" +config_file_version = "0.1.15" pool: { pkt: { diff --git a/platform/linux-generic/test/process-mode.conf b/platform/linux-generic/test/process-mode.conf index 8e18feb2c..5354cae2f 100644 --- a/platform/linux-generic/test/process-mode.conf +++ b/platform/linux-generic/test/process-mode.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.14" +config_file_version = "0.1.15" # Shared memory options shm: { |