* [PATCH v5 00/10] support reinit flow
@ 2023-08-17 4:28 okaya
2023-08-17 4:28 ` [PATCH v5 01/10] eal: cleanup plugins data okaya
` (9 more replies)
0 siblings, 10 replies; 12+ messages in thread
From: okaya @ 2023-08-17 4:28 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.
Why?
It is not always ideal to reinitialize a DPDK process. Memory needs
to be reinitialized, hugetables need to warm up etc.
Limitations:
This sequence could only be done by main lcore, and never ever in a signal handler.
Do not try and trap signals like abort, bus error, illegal instruction and try to
use this for recovery. It is a recipe for failure.
Changed from
v1:
Fix checkpatch warnings
v2:
rebase to most recent DPDK.
v3:
pick up Stephen's "eal: cleanup plugins data" as a pre-requisite
patch.
v4:
fix windows build
rename variables to run_once where possible
move run_once inside the functions where possible
Graham Whyte (1):
eal: fixes for re-initialization issues
Sinan Kaya (8):
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
eal: declare the reinit via cleanup/init feature unsupported
test: remove double registration check
Stephen Hemminger (1):
eal: cleanup plugins data
app/test/test_tailq.c | 5 ---
lib/eal/common/eal_common_memory.c | 6 +++
lib/eal/common/eal_common_memzone.c | 6 +++
lib/eal/common/eal_common_options.c | 21 +++++++++
lib/eal/common/eal_common_tailqs.c | 20 ++++++---
lib/eal/common/eal_options.h | 1 +
lib/eal/common/malloc_heap.c | 7 +++
lib/eal/include/rte_eal.h | 5 +++
lib/eal/linux/eal.c | 66 ++++++++++++++++-------------
lib/eal/linux/eal_interrupts.c | 6 +++
lib/eal/linux/eal_memory.c | 12 +++++-
11 files changed, 113 insertions(+), 42 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v5 01/10] eal: cleanup plugins data
2023-08-17 4:28 [PATCH v5 00/10] support reinit flow okaya
@ 2023-08-17 4:28 ` okaya
2023-08-17 4:28 ` [PATCH v5 02/10] eal: fixes for re-initialization issues okaya
` (8 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: okaya @ 2023-08-17 4:28 UTC (permalink / raw)
Cc: dev, Stephen Hemminger, Sinan Kaya
From: Stephen Hemminger <stephen@networkplumber.org>
When rte_eal_cleanup is called walk through the list of shared
objects loaded, and close them and free the data structure.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Sinan Kaya <okaya@kernel.org>
---
lib/eal/common/eal_common_options.c | 14 ++++++++++++++
lib/eal/common/eal_options.h | 1 +
lib/eal/linux/eal.c | 2 ++
3 files changed, 17 insertions(+)
diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c
index 062f1d8d9c..a509adc78b 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -244,6 +244,20 @@ eal_save_args(int argc, char **argv)
}
#endif
+void
+eal_plugins_cleanup(void)
+{
+#ifndef RTE_EXEC_ENV_WINDOWS
+ struct shared_driver *solib, *tmp;
+
+ RTE_TAILQ_FOREACH_SAFE(solib, &solib_list, next, tmp) {
+ if (solib->lib_handle)
+ dlclose(solib->lib_handle);
+ free(solib);
+ }
+#endif
+}
+
static int
eal_option_device_add(enum rte_devtype type, const char *optarg)
{
diff --git a/lib/eal/common/eal_options.h b/lib/eal/common/eal_options.h
index 3cc9cb6412..ddbaafc4f1 100644
--- a/lib/eal/common/eal_options.h
+++ b/lib/eal/common/eal_options.h
@@ -105,6 +105,7 @@ int eal_check_common_options(struct internal_config *internal_cfg);
void eal_common_usage(void);
enum rte_proc_type_t eal_proc_type_detect(void);
int eal_plugins_init(void);
+void eal_plugins_cleanup(void);
int eal_save_args(int argc, char **argv);
int handle_eal_info_request(const char *cmd, const char *params __rte_unused,
struct rte_tel_data *d);
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index c6efd92014..dee649bab3 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -1398,6 +1398,8 @@ rte_eal_cleanup(void)
eal_trace_fini();
eal_mp_dev_hotplug_cleanup();
rte_eal_alarm_cleanup();
+ eal_plugins_cleanup();
+
/* after this point, any DPDK pointers will become dangling */
rte_eal_memory_detach();
rte_eal_malloc_heap_cleanup();
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 02/10] eal: fixes for re-initialization issues
2023-08-17 4:28 [PATCH v5 00/10] support reinit flow okaya
2023-08-17 4:28 ` [PATCH v5 01/10] eal: cleanup plugins data okaya
@ 2023-08-17 4:28 ` okaya
2023-08-17 4:28 ` [PATCH v5 03/10] tailq: skip init if already initialized okaya
` (7 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: okaya @ 2023-08-17 4:28 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 a509adc78b..630d06f918 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -256,6 +256,13 @@ eal_plugins_cleanup(void)
free(solib);
}
#endif
+
+ /* Reinitialize solib_list */
+ TAILQ_INIT(&solib_list);
+
+ main_lcore_parsed = 0;
+ mem_parsed = 0;
+ core_parsed = 0;
}
static int
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index dee649bab3..584c78e640 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -79,6 +79,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)
{
@@ -505,6 +507,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;
}
@@ -967,7 +970,6 @@ int
rte_eal_init(int argc, char **argv)
{
int i, fctret, ret;
- static uint32_t run_once;
uint32_t has_run = 0;
char cpuset[RTE_CPU_AFFINITY_STR_LEN];
char thread_name[RTE_MAX_THREAD_NAME_LEN];
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 03/10] tailq: skip init if already initialized
2023-08-17 4:28 [PATCH v5 00/10] support reinit flow okaya
2023-08-17 4:28 ` [PATCH v5 01/10] eal: cleanup plugins data okaya
2023-08-17 4:28 ` [PATCH v5 02/10] eal: fixes for re-initialization issues okaya
@ 2023-08-17 4:28 ` okaya
2023-08-17 4:28 ` [PATCH v5 04/10] eal_memzone: bail out on initialized okaya
` (6 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: okaya @ 2023-08-17 4:28 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 related [flat|nested] 12+ messages in thread
* [PATCH v5 04/10] eal_memzone: bail out on initialized
2023-08-17 4:28 [PATCH v5 00/10] support reinit flow okaya
` (2 preceding siblings ...)
2023-08-17 4:28 ` [PATCH v5 03/10] tailq: skip init if already initialized okaya
@ 2023-08-17 4:28 ` okaya
2023-08-17 4:28 ` [PATCH v5 05/10] memseg: init once okaya
` (5 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: okaya @ 2023-08-17 4:28 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 | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/lib/eal/common/eal_common_memzone.c b/lib/eal/common/eal_common_memzone.c
index 1f3e701499..d2fac4be01 100644
--- a/lib/eal/common/eal_common_memzone.c
+++ b/lib/eal/common/eal_common_memzone.c
@@ -425,6 +425,10 @@ rte_eal_memzone_init(void)
{
struct rte_mem_config *mcfg;
int ret = 0;
+ static bool run_once;
+
+ if (run_once)
+ return 0;
/* get pointer to global configuration */
mcfg = rte_eal_get_configuration()->mem_config;
@@ -444,6 +448,8 @@ rte_eal_memzone_init(void)
rte_rwlock_write_unlock(&mcfg->mlock);
+ run_once = true;
+
return ret;
}
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 05/10] memseg: init once
2023-08-17 4:28 [PATCH v5 00/10] support reinit flow okaya
` (3 preceding siblings ...)
2023-08-17 4:28 ` [PATCH v5 04/10] eal_memzone: bail out on initialized okaya
@ 2023-08-17 4:28 ` okaya
2023-08-17 4:28 ` [PATCH v5 06/10] eal_memory: skip initialization okaya
` (4 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: okaya @ 2023-08-17 4:28 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 9b6f08fba8..693a56649b 100644
--- a/lib/eal/linux/eal_memory.c
+++ b/lib/eal/linux/eal_memory.c
@@ -1920,6 +1920,11 @@ rte_eal_memseg_init(void)
{
/* increase rlimit to maximum */
struct rlimit lim;
+ int ret;
+ static bool run_once;
+
+ if (run_once)
+ return 0;
#ifndef RTE_EAL_NUMA_AWARE_HUGEPAGES
const struct internal_config *internal_conf =
@@ -1948,11 +1953,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)
+ run_once = true;
+
+ return ret;
}
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 06/10] eal_memory: skip initialization
2023-08-17 4:28 [PATCH v5 00/10] support reinit flow okaya
` (4 preceding siblings ...)
2023-08-17 4:28 ` [PATCH v5 05/10] memseg: init once okaya
@ 2023-08-17 4:28 ` okaya
2023-08-17 4:28 ` [PATCH v5 07/10] eal_interrupts: don't reinitialize threads okaya
` (3 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: okaya @ 2023-08-17 4:28 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 | 6 ++++++
lib/eal/common/malloc_heap.c | 7 +++++++
2 files changed, 13 insertions(+)
diff --git a/lib/eal/common/eal_common_memory.c b/lib/eal/common/eal_common_memory.c
index d9433db623..1ba2007f76 100644
--- a/lib/eal/common/eal_common_memory.c
+++ b/lib/eal/common/eal_common_memory.c
@@ -1083,6 +1083,10 @@ rte_eal_memory_init(void)
const struct internal_config *internal_conf =
eal_get_internal_configuration();
int retval;
+ static bool run_once;
+
+ if (run_once)
+ return 0;
RTE_LOG(DEBUG, EAL, "Setting up physically contiguous memory...\n");
@@ -1101,6 +1105,8 @@ rte_eal_memory_init(void)
if (internal_conf->no_shconf == 0 && rte_eal_memdevice_init() < 0)
goto fail;
+ run_once = true;
+
return 0;
fail:
return -1;
diff --git a/lib/eal/common/malloc_heap.c b/lib/eal/common/malloc_heap.c
index 6b6cf9174c..5f01735520 100644
--- a/lib/eal/common/malloc_heap.c
+++ b/lib/eal/common/malloc_heap.c
@@ -31,6 +31,7 @@
#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 unsigned
check_hugepage_sz(unsigned flags, uint64_t hugepage_sz)
{
@@ -1409,6 +1410,10 @@ rte_eal_malloc_heap_init(void)
unsigned int i;
const struct internal_config *internal_conf =
eal_get_internal_configuration();
+ static bool run_once;
+
+ if (run_once)
+ return 0;
if (internal_conf->match_allocations)
RTE_LOG(DEBUG, EAL, "Hugepages will be freed exactly as allocated.\n");
@@ -1435,6 +1440,8 @@ rte_eal_malloc_heap_init(void)
return -1;
}
+ run_once = true;
+
return 0;
}
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 07/10] eal_interrupts: don't reinitialize threads
2023-08-17 4:28 [PATCH v5 00/10] support reinit flow okaya
` (5 preceding siblings ...)
2023-08-17 4:28 ` [PATCH v5 06/10] eal_memory: skip initialization okaya
@ 2023-08-17 4:28 ` okaya
2023-08-17 4:28 ` [PATCH v5 08/10] eal: initialize worker threads once okaya
` (2 subsequent siblings)
9 siblings, 0 replies; 12+ messages in thread
From: okaya @ 2023-08-17 4:28 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 | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/lib/eal/linux/eal_interrupts.c b/lib/eal/linux/eal_interrupts.c
index c9881143be..7adf4076ae 100644
--- a/lib/eal/linux/eal_interrupts.c
+++ b/lib/eal/linux/eal_interrupts.c
@@ -1174,6 +1174,10 @@ int
rte_eal_intr_init(void)
{
int ret = 0;
+ static bool run_once;
+
+ if (run_once)
+ return 0;
/* init the global interrupt source head */
TAILQ_INIT(&intr_sources);
@@ -1196,6 +1200,8 @@ rte_eal_intr_init(void)
"Failed to create thread for interrupt handling\n");
}
+ run_once = true;
+
return ret;
}
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 08/10] eal: initialize worker threads once
2023-08-17 4:28 [PATCH v5 00/10] support reinit flow okaya
` (6 preceding siblings ...)
2023-08-17 4:28 ` [PATCH v5 07/10] eal_interrupts: don't reinitialize threads okaya
@ 2023-08-17 4:28 ` okaya
2023-08-17 4:28 ` [PATCH v5 09/10] eal: declare the reinit via cleanup/init feature unsupported okaya
2024-09-25 21:08 ` [PATCH v5 00/10] support reinit flow Stephen Hemminger
9 siblings, 0 replies; 12+ messages in thread
From: okaya @ 2023-08-17 4:28 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 | 60 ++++++++++++++++++++++++---------------------
1 file changed, 32 insertions(+), 28 deletions(-)
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index 584c78e640..1305e1df54 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -80,6 +80,7 @@ int rte_cycles_vmware_tsc_map;
static uint32_t run_once;
+static bool worker_initialized;
int
eal_clean_runtime_dir(void)
@@ -1254,42 +1255,45 @@ 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);
- rte_thread_set_name(lcore_config[i].thread_id, thread_name);
+ 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);
+ rte_thread_set_name(lcore_config[i].thread_id, thread_name);
+
+ ret = rte_thread_set_affinity_by_id(lcore_config[i].thread_id,
+ &lcore_config[i].cpuset);
+ if (ret != 0)
+ rte_panic("Cannot set affinity\n");
+ }
- ret = rte_thread_set_affinity_by_id(lcore_config[i].thread_id,
- &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 related [flat|nested] 12+ messages in thread
* [PATCH v5 09/10] eal: declare the reinit via cleanup/init feature unsupported
2023-08-17 4:28 [PATCH v5 00/10] support reinit flow okaya
` (7 preceding siblings ...)
2023-08-17 4:28 ` [PATCH v5 08/10] eal: initialize worker threads once okaya
@ 2023-08-17 4:28 ` okaya
2023-08-17 13:59 ` Stephen Hemminger
2024-09-25 21:08 ` [PATCH v5 00/10] support reinit flow Stephen Hemminger
9 siblings, 1 reply; 12+ messages in thread
From: okaya @ 2023-08-17 4:28 UTC (permalink / raw)
Cc: dev, Sinan Kaya
From: Sinan Kaya <okaya@kernel.org>
Call of rte_eal_init() api after rte_eal_cleanup() possible for
certain application types but this is not an officially supported
feature.
Signed-off-by: Sinan Kaya <okaya@kernel.org>
---
lib/eal/include/rte_eal.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/lib/eal/include/rte_eal.h b/lib/eal/include/rte_eal.h
index 53c4a5519e..348b340f00 100644
--- a/lib/eal/include/rte_eal.h
+++ b/lib/eal/include/rte_eal.h
@@ -67,6 +67,11 @@ int rte_eal_iopl_init(void);
* as possible in the application's main() function.
* It puts the WORKER lcores in the WAIT state.
*
+ * @warning
+ * It maybe possisble to call it again after rte_eal_cleanup().
+ * But this usage is dependent on libraries and drivers support which
+ * may not work. Use at your own risk.
+ *
* @param argc
* A non-negative value. If it is greater than 0, the array members
* for argv[0] through argv[argc] (non-inclusive) shall contain pointers
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v5 09/10] eal: declare the reinit via cleanup/init feature unsupported
2023-08-17 4:28 ` [PATCH v5 09/10] eal: declare the reinit via cleanup/init feature unsupported okaya
@ 2023-08-17 13:59 ` Stephen Hemminger
0 siblings, 0 replies; 12+ messages in thread
From: Stephen Hemminger @ 2023-08-17 13:59 UTC (permalink / raw)
To: okaya; +Cc: dev
On Thu, 17 Aug 2023 00:28:20 -0400
okaya@kernel.org wrote:
> + * @warning
> + * It maybe possisble to call it again after rte_eal_cleanup().
> + * But this usage is dependent on libraries and drivers support which
> + * may not work. Use at y
Sorry, my spelling error made it in here...
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 00/10] support reinit flow
2023-08-17 4:28 [PATCH v5 00/10] support reinit flow okaya
` (8 preceding siblings ...)
2023-08-17 4:28 ` [PATCH v5 09/10] eal: declare the reinit via cleanup/init feature unsupported okaya
@ 2024-09-25 21:08 ` Stephen Hemminger
9 siblings, 0 replies; 12+ messages in thread
From: Stephen Hemminger @ 2024-09-25 21:08 UTC (permalink / raw)
To: dev
On Thu, 17 Aug 2023 00:28:11 -0400
okaya@kernel.org wrote:
> 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.
>
> Why?
>
> It is not always ideal to reinitialize a DPDK process. Memory needs
> to be reinitialized, hugetables need to warm up etc.
>
> Limitations:
>
> This sequence could only be done by main lcore, and never ever in a signal handler.
> Do not try and trap signals like abort, bus error, illegal instruction and try to
> use this for recovery. It is a recipe for failure.
>
This patch series suffers bit rot and does not apply anymore. Needs to be rebase
and resubmit.
There probably needs to be more unit-tests for restart.
Also some documentation for example, for which NIC's does this work?
Probably not all.
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-09-25 21:08 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-17 4:28 [PATCH v5 00/10] support reinit flow okaya
2023-08-17 4:28 ` [PATCH v5 01/10] eal: cleanup plugins data okaya
2023-08-17 4:28 ` [PATCH v5 02/10] eal: fixes for re-initialization issues okaya
2023-08-17 4:28 ` [PATCH v5 03/10] tailq: skip init if already initialized okaya
2023-08-17 4:28 ` [PATCH v5 04/10] eal_memzone: bail out on initialized okaya
2023-08-17 4:28 ` [PATCH v5 05/10] memseg: init once okaya
2023-08-17 4:28 ` [PATCH v5 06/10] eal_memory: skip initialization okaya
2023-08-17 4:28 ` [PATCH v5 07/10] eal_interrupts: don't reinitialize threads okaya
2023-08-17 4:28 ` [PATCH v5 08/10] eal: initialize worker threads once okaya
2023-08-17 4:28 ` [PATCH v5 09/10] eal: declare the reinit via cleanup/init feature unsupported okaya
2023-08-17 13:59 ` Stephen Hemminger
2024-09-25 21:08 ` [PATCH v5 00/10] support reinit flow Stephen Hemminger
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.