* [PATCH v2 0/7] support reinit flow
@ 2023-08-15 3:13 okaya
2023-08-15 3:13 ` [PATCH v2 1/7] eal: fixes for re-initialization issues okaya
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: okaya @ 2023-08-15 3:13 UTC (permalink / raw)
Cc: dev, Sinan Kaya
From: Sinan Kaya <okaya@kernel.org>
We want to be able to call rte_eal_init() and rte_eal_cleanup()
APIs back to back for maintanance reasons.
Here is a summary of the code we have seen so far:
1. some code support getting called multiple times by keeping
a static variable.
2. some code initializes once but never clean up after them and
don't have a cleanup API.
3. some code assumes that they only get called once during the
lifecycle of the process.
Most changes in this patch center around following the #1 design
principle.
Graham Whyte (1):
eal: fixes for re-initialization issues
Sinan Kaya (6):
tailq: skip init if already initialized
eal_memzone: bail out on initialized
memseg: init once
eal_memory: skip initialization
eal_interrupts: don't reinitialize threads
eal: initialize worker threads once
lib/eal/common/eal_common_memory.c | 5 ++
lib/eal/common/eal_common_memzone.c | 7 +++
lib/eal/common/eal_common_options.c | 7 +++
lib/eal/common/eal_common_tailqs.c | 20 +++++---
lib/eal/common/malloc_heap.c | 7 +++
lib/eal/linux/eal.c | 72 ++++++++++++++++-------------
lib/eal/linux/eal_interrupts.c | 7 +++
lib/eal/linux/eal_memory.c | 12 ++++-
8 files changed, 96 insertions(+), 41 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/7] eal: fixes for re-initialization issues
2023-08-15 3:13 [PATCH v2 0/7] support reinit flow okaya
@ 2023-08-15 3:13 ` okaya
2023-08-15 3:13 ` [PATCH v2 2/7] tailq: skip init if already initialized okaya
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: okaya @ 2023-08-15 3:13 UTC (permalink / raw)
Cc: dev, Graham Whyte, Sinan Kaya
From: Graham Whyte <grwhyte@microsoft.com>
reinitialize the solib link list and clean the globals holding
state for parsing.
Signed-off-by: Sinan Kaya <okaya@kernel.org>
Signed-off-by: Graham Whyte <grwhyte@microsoft.com>
---
lib/eal/common/eal_common_options.c | 7 +++++++
lib/eal/linux/eal.c | 4 +++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c
index 2d6535781b..e15e8ced5d 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -1983,6 +1983,13 @@ compute_ctrl_threads_cpuset(struct internal_config *internal_cfg)
memcpy(cpuset, &lcore_config[rte_get_main_lcore()].cpuset,
sizeof(*cpuset));
}
+
+ // Reinitialize solib_list
+ TAILQ_INIT(&solib_list);
+
+ main_lcore_parsed = 0;
+ mem_parsed = 0;
+ core_parsed = 0;
}
int
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index 8c118d0d9f..385a3427d4 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -78,6 +78,8 @@ struct lcore_config lcore_config[RTE_MAX_LCORE];
int rte_cycles_vmware_tsc_map;
+static uint32_t run_once;
+
int
eal_clean_runtime_dir(void)
{
@@ -504,6 +506,7 @@ eal_parse_socket_arg(char *strval, volatile uint64_t *socket_arg)
socket_arg[i] = val;
}
+ __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
return 0;
}
@@ -960,7 +963,6 @@ int
rte_eal_init(int argc, char **argv)
{
int i, fctret, ret;
- static uint32_t run_once;
uint32_t has_run = 0;
const char *p;
static char logid[PATH_MAX];
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 2/7] tailq: skip init if already initialized
2023-08-15 3:13 [PATCH v2 0/7] support reinit flow okaya
2023-08-15 3:13 ` [PATCH v2 1/7] eal: fixes for re-initialization issues okaya
@ 2023-08-15 3:13 ` okaya
2023-08-15 3:13 ` [PATCH v2 3/7] eal_memzone: bail out on initialized okaya
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: okaya @ 2023-08-15 3:13 UTC (permalink / raw)
Cc: dev, Sinan Kaya
From: Sinan Kaya <okaya@kernel.org>
Allows tailq to be reinitialied multiple times
by looking up previously registered tailqs
Signed-off-by: Sinan Kaya <okaya@kernel.org>
---
lib/eal/common/eal_common_tailqs.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/lib/eal/common/eal_common_tailqs.c b/lib/eal/common/eal_common_tailqs.c
index 580fbf24bc..75c0235438 100644
--- a/lib/eal/common/eal_common_tailqs.c
+++ b/lib/eal/common/eal_common_tailqs.c
@@ -73,9 +73,10 @@ rte_eal_tailq_create(const char *name)
strlcpy(head->name, name, sizeof(head->name) - 1);
TAILQ_INIT(&head->tailq_head);
rte_tailqs_count++;
+ return head;
}
- return head;
+ return rte_eal_tailq_lookup(name);
}
/* local register, used to store "early" tailqs before rte_eal_init() and to
@@ -99,7 +100,9 @@ rte_eal_tailq_update(struct rte_tailq_elem *t)
{
if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
/* primary process is the only one that creates */
- t->head = rte_eal_tailq_create(t->name);
+ t->head = rte_eal_tailq_lookup(t->name);
+ if (t->head == NULL)
+ t->head = rte_eal_tailq_create(t->name);
} else {
t->head = rte_eal_tailq_lookup(t->name);
}
@@ -108,15 +111,13 @@ rte_eal_tailq_update(struct rte_tailq_elem *t)
int
rte_eal_tailq_register(struct rte_tailq_elem *t)
{
- if (rte_eal_tailq_local_register(t) < 0) {
- RTE_LOG(ERR, EAL,
- "%s tailq is already registered\n", t->name);
- goto error;
- }
+ rte_eal_tailq_local_register(t);
/* if a register happens after rte_eal_tailqs_init(), then we can update
* tailq head */
if (rte_tailqs_count >= 0) {
+ RTE_LOG(INFO, EAL,
+ "%s tailq is registered\n", t->name);
rte_eal_tailq_update(t);
if (t->head == NULL) {
RTE_LOG(ERR, EAL,
@@ -138,6 +139,11 @@ rte_eal_tailqs_init(void)
{
struct rte_tailq_elem *t;
+ if (rte_tailqs_count > 0) {
+ RTE_LOG(INFO, EAL, "tailq already initialized\n");
+ return 0;
+ }
+
rte_tailqs_count = 0;
TAILQ_FOREACH(t, &rte_tailq_elem_head, next) {
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 3/7] eal_memzone: bail out on initialized
2023-08-15 3:13 [PATCH v2 0/7] support reinit flow okaya
2023-08-15 3:13 ` [PATCH v2 1/7] eal: fixes for re-initialization issues okaya
2023-08-15 3:13 ` [PATCH v2 2/7] tailq: skip init if already initialized okaya
@ 2023-08-15 3:13 ` okaya
2023-08-15 3:13 ` [PATCH v2 4/7] memseg: init once okaya
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: okaya @ 2023-08-15 3:13 UTC (permalink / raw)
To: Anatoly Burakov; +Cc: dev, Sinan Kaya
From: Sinan Kaya <okaya@kernel.org>
Initialize memzone once and bail out if someone calls init
multiple times.
Signed-off-by: Sinan Kaya <okaya@kernel.org>
---
lib/eal/common/eal_common_memzone.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/lib/eal/common/eal_common_memzone.c b/lib/eal/common/eal_common_memzone.c
index 930fee5fdc..3a10aa02dd 100644
--- a/lib/eal/common/eal_common_memzone.c
+++ b/lib/eal/common/eal_common_memzone.c
@@ -22,6 +22,8 @@
#include "eal_private.h"
#include "eal_memcfg.h"
+static bool memzone_initialized;
+
static inline const struct rte_memzone *
memzone_lookup_thread_unsafe(const char *name)
{
@@ -397,6 +399,9 @@ rte_eal_memzone_init(void)
struct rte_mem_config *mcfg;
int ret = 0;
+ if (memzone_initialized)
+ return 0;
+
/* get pointer to global configuration */
mcfg = rte_eal_get_configuration()->mem_config;
@@ -415,6 +420,8 @@ rte_eal_memzone_init(void)
rte_rwlock_write_unlock(&mcfg->mlock);
+ memzone_initialized = true;
+
return ret;
}
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 4/7] memseg: init once
2023-08-15 3:13 [PATCH v2 0/7] support reinit flow okaya
` (2 preceding siblings ...)
2023-08-15 3:13 ` [PATCH v2 3/7] eal_memzone: bail out on initialized okaya
@ 2023-08-15 3:13 ` okaya
2023-08-15 3:13 ` [PATCH v2 5/7] eal_memory: skip initialization okaya
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: okaya @ 2023-08-15 3:13 UTC (permalink / raw)
To: Anatoly Burakov; +Cc: dev, Sinan Kaya
From: Sinan Kaya <okaya@kernel.org>
Initialize memory segments just once and bail out if called
multiple times.
Signed-off-by: Sinan Kaya <okaya@kernel.org>
---
lib/eal/linux/eal_memory.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/lib/eal/linux/eal_memory.c b/lib/eal/linux/eal_memory.c
index 60fc8cc6ca..b998b366d2 100644
--- a/lib/eal/linux/eal_memory.c
+++ b/lib/eal/linux/eal_memory.c
@@ -57,6 +57,7 @@
*/
static int phys_addrs_available = -1;
+static bool memseg_initialized;
#define RANDOMIZE_VA_SPACE_FILE "/proc/sys/kernel/randomize_va_space"
@@ -1902,6 +1903,10 @@ rte_eal_memseg_init(void)
{
/* increase rlimit to maximum */
struct rlimit lim;
+ int ret;
+
+ if (memseg_initialized)
+ return 0;
#ifndef RTE_EAL_NUMA_AWARE_HUGEPAGES
const struct internal_config *internal_conf =
@@ -1930,11 +1935,16 @@ rte_eal_memseg_init(void)
}
#endif
- return rte_eal_process_type() == RTE_PROC_PRIMARY ?
+ ret = rte_eal_process_type() == RTE_PROC_PRIMARY ?
#ifndef RTE_ARCH_64
memseg_primary_init_32() :
#else
memseg_primary_init() :
#endif
memseg_secondary_init();
+
+ if (!ret)
+ memseg_initialized = true;
+
+ return ret;
}
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 5/7] eal_memory: skip initialization
2023-08-15 3:13 [PATCH v2 0/7] support reinit flow okaya
` (3 preceding siblings ...)
2023-08-15 3:13 ` [PATCH v2 4/7] memseg: init once okaya
@ 2023-08-15 3:13 ` okaya
2023-08-15 3:13 ` [PATCH v2 6/7] eal_interrupts: don't reinitialize threads okaya
2023-08-15 3:13 ` [PATCH v2 7/7] eal: initialize worker threads once okaya
6 siblings, 0 replies; 8+ messages in thread
From: okaya @ 2023-08-15 3:13 UTC (permalink / raw)
To: Anatoly Burakov; +Cc: dev, Sinan Kaya
From: Sinan Kaya <okaya@kernel.org>
Initialize heap area just once.
Signed-off-by: Sinan Kaya <okaya@kernel.org>
---
lib/eal/common/eal_common_memory.c | 5 +++++
lib/eal/common/malloc_heap.c | 7 +++++++
2 files changed, 12 insertions(+)
diff --git a/lib/eal/common/eal_common_memory.c b/lib/eal/common/eal_common_memory.c
index 688dc615d7..b6fcc293be 100644
--- a/lib/eal/common/eal_common_memory.c
+++ b/lib/eal/common/eal_common_memory.c
@@ -39,6 +39,7 @@
static void *next_baseaddr;
static uint64_t system_page_sz;
+static bool memory_initialized;
#define MAX_MMAP_WITH_DEFINED_ADDR_TRIES 5
void *
@@ -1088,6 +1089,9 @@ rte_eal_memory_init(void)
if (!mcfg)
return -1;
+ if (memory_initialized)
+ return 0;
+
/* lock mem hotplug here, to prevent races while we init */
rte_mcfg_mem_read_lock();
@@ -1106,6 +1110,7 @@ rte_eal_memory_init(void)
if (internal_conf->no_shconf == 0 && rte_eal_memdevice_init() < 0)
goto fail;
+ memory_initialized = true;
return 0;
fail:
rte_mcfg_mem_read_unlock();
diff --git a/lib/eal/common/malloc_heap.c b/lib/eal/common/malloc_heap.c
index 6eb6fcda5e..facc16a802 100644
--- a/lib/eal/common/malloc_heap.c
+++ b/lib/eal/common/malloc_heap.c
@@ -31,6 +31,8 @@
#define CONST_MAX(a, b) (a > b ? a : b) /* RTE_MAX is not a constant */
#define EXTERNAL_HEAP_MIN_SOCKET_ID (CONST_MAX((1 << 8), RTE_MAX_NUMA_NODES))
+static bool heap_initialized;
+
static unsigned
check_hugepage_sz(unsigned flags, uint64_t hugepage_sz)
{
@@ -1406,6 +1408,9 @@ rte_eal_malloc_heap_init(void)
const struct internal_config *internal_conf =
eal_get_internal_configuration();
+ if (heap_initialized)
+ return 0;
+
if (internal_conf->match_allocations)
RTE_LOG(DEBUG, EAL, "Hugepages will be freed exactly as allocated.\n");
@@ -1443,6 +1448,8 @@ rte_eal_malloc_heap_init(void)
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return 0;
+ heap_initialized = true;
+
/* add all IOVA-contiguous areas to the heap */
return rte_memseg_contig_walk(malloc_add_seg, NULL);
}
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 6/7] eal_interrupts: don't reinitialize threads
2023-08-15 3:13 [PATCH v2 0/7] support reinit flow okaya
` (4 preceding siblings ...)
2023-08-15 3:13 ` [PATCH v2 5/7] eal_memory: skip initialization okaya
@ 2023-08-15 3:13 ` okaya
2023-08-15 3:13 ` [PATCH v2 7/7] eal: initialize worker threads once okaya
6 siblings, 0 replies; 8+ messages in thread
From: okaya @ 2023-08-15 3:13 UTC (permalink / raw)
To: Harman Kalra; +Cc: dev, Sinan Kaya
From: Sinan Kaya <okaya@kernel.org>
Initialize interrupt thread once and keep a flag
for further init.
Signed-off-by: Sinan Kaya <okaya@kernel.org>
---
lib/eal/linux/eal_interrupts.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/lib/eal/linux/eal_interrupts.c b/lib/eal/linux/eal_interrupts.c
index d52ec8eb4c..f141711f12 100644
--- a/lib/eal/linux/eal_interrupts.c
+++ b/lib/eal/linux/eal_interrupts.c
@@ -91,6 +91,9 @@ static struct rte_intr_source_list intr_sources;
/* interrupt handling thread */
static pthread_t intr_thread;
+/* flag for initialization */
+static bool intr_initialized;
+
/* VFIO interrupts */
#ifdef VFIO_PRESENT
@@ -1175,6 +1178,9 @@ rte_eal_intr_init(void)
{
int ret = 0;
+ if (intr_initialized)
+ return 0;
+
/* init the global interrupt source head */
TAILQ_INIT(&intr_sources);
@@ -1196,6 +1202,7 @@ rte_eal_intr_init(void)
"Failed to create thread for interrupt handling\n");
}
+ intr_initialized = true;
return ret;
}
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 7/7] eal: initialize worker threads once
2023-08-15 3:13 [PATCH v2 0/7] support reinit flow okaya
` (5 preceding siblings ...)
2023-08-15 3:13 ` [PATCH v2 6/7] eal_interrupts: don't reinitialize threads okaya
@ 2023-08-15 3:13 ` okaya
6 siblings, 0 replies; 8+ messages in thread
From: okaya @ 2023-08-15 3:13 UTC (permalink / raw)
Cc: dev, Sinan Kaya
From: Sinan Kaya <okaya@kernel.org>
Initialize worker threads once and keep a flag
for other init calls.
Signed-off-by: Sinan Kaya <okaya@kernel.org>
---
lib/eal/linux/eal.c | 68 ++++++++++++++++++++++++---------------------
1 file changed, 36 insertions(+), 32 deletions(-)
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index 385a3427d4..d12b438d2b 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -79,6 +79,7 @@ int rte_cycles_vmware_tsc_map;
static uint32_t run_once;
+static bool worker_initialized;
int
eal_clean_runtime_dir(void)
@@ -1236,46 +1237,49 @@ rte_eal_init(int argc, char **argv)
config->main_lcore, (uintptr_t)pthread_self(), cpuset,
ret == 0 ? "" : "...");
- RTE_LCORE_FOREACH_WORKER(i) {
+ if (worker_initialized == false) {
+ RTE_LCORE_FOREACH_WORKER(i) {
/*
* create communication pipes between main thread
* and children
*/
- if (pipe(lcore_config[i].pipe_main2worker) < 0)
- rte_panic("Cannot create pipe\n");
- if (pipe(lcore_config[i].pipe_worker2main) < 0)
- rte_panic("Cannot create pipe\n");
-
- lcore_config[i].state = WAIT;
-
- /* create a thread for each lcore */
- ret = eal_worker_thread_create(i);
- if (ret != 0)
- rte_panic("Cannot create thread\n");
-
- /* Set thread_name for aid in debugging. */
- snprintf(thread_name, sizeof(thread_name),
- "rte-worker-%d", i);
- ret = rte_thread_setname(lcore_config[i].thread_id,
- thread_name);
- if (ret != 0)
- RTE_LOG(DEBUG, EAL,
- "Cannot set name for lcore thread\n");
+ if (pipe(lcore_config[i].pipe_main2worker) < 0)
+ rte_panic("Cannot create pipe\n");
+ if (pipe(lcore_config[i].pipe_worker2main) < 0)
+ rte_panic("Cannot create pipe\n");
+
+ lcore_config[i].state = WAIT;
+
+ /* create a thread for each lcore */
+ ret = eal_worker_thread_create(i);
+ if (ret != 0)
+ rte_panic("Cannot create thread\n");
+
+ /* Set thread_name for aid in debugging. */
+ snprintf(thread_name, sizeof(thread_name),
+ "rte-worker-%d", i);
+ ret = rte_thread_setname(lcore_config[i].thread_id,
+ thread_name);
+ if (ret != 0)
+ RTE_LOG(DEBUG, EAL,
+ "Cannot set name for lcore thread\n");
+
+ ret = pthread_setaffinity_np(lcore_config[i].thread_id,
+ sizeof(rte_cpuset_t), &lcore_config[i].cpuset);
+ if (ret != 0)
+ rte_panic("Cannot set affinity\n");
+ }
- ret = pthread_setaffinity_np(lcore_config[i].thread_id,
- sizeof(rte_cpuset_t), &lcore_config[i].cpuset);
- if (ret != 0)
- rte_panic("Cannot set affinity\n");
+ /*
+ * Launch a dummy function on all worker lcores, so that main lcore
+ * knows they are all ready when this function returns.
+ */
+ rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MAIN);
+ rte_eal_mp_wait_lcore();
+ worker_initialized = true;
}
- /*
- * Launch a dummy function on all worker lcores, so that main lcore
- * knows they are all ready when this function returns.
- */
- rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MAIN);
- rte_eal_mp_wait_lcore();
-
/* initialize services so vdevs register service during bus_probe. */
ret = rte_service_init();
if (ret) {
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-08-15 3:13 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-15 3:13 [PATCH v2 0/7] support reinit flow okaya
2023-08-15 3:13 ` [PATCH v2 1/7] eal: fixes for re-initialization issues okaya
2023-08-15 3:13 ` [PATCH v2 2/7] tailq: skip init if already initialized okaya
2023-08-15 3:13 ` [PATCH v2 3/7] eal_memzone: bail out on initialized okaya
2023-08-15 3:13 ` [PATCH v2 4/7] memseg: init once okaya
2023-08-15 3:13 ` [PATCH v2 5/7] eal_memory: skip initialization okaya
2023-08-15 3:13 ` [PATCH v2 6/7] eal_interrupts: don't reinitialize threads okaya
2023-08-15 3:13 ` [PATCH v2 7/7] eal: initialize worker threads once okaya
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).