IPC and hotplug operations checked --no-shconf incompatible option
but ignored the multi-process status changed by rte_mp_disable().
As a result, IPC was still attempted
and hotplug devargs remained subject to the IPC message size limit
even when secondary processes could no longer attach.
Change the multi-process status when --no-shconf is used,
also covering --in-memory,
so it becomes enough to check this status only.
Allow previously registered IPC actions to be unregistered
after multi-process has been disabled.
Fixes: 5c307ba2a5b1 ("eal: register non-EAL threads as lcores")
Fixes: d2fd16c8b003 ("eal: add multiprocess disable API")
Cc: [email protected]
Signed-off-by: Thomas Monjalon <[email protected]>
---
lib/eal/common/eal_common_dev.c | 8 ++---
lib/eal/common/eal_common_mcfg.c | 3 ++
lib/eal/common/eal_common_proc.c | 56 ++++++++++++--------------------
lib/eal/common/eal_private.h | 5 +++
lib/eal/windows/eal.c | 6 ++++
5 files changed, 37 insertions(+), 41 deletions(-)
diff --git a/lib/eal/common/eal_common_dev.c b/lib/eal/common/eal_common_dev.c
index b43b0a4bb3..f42a8d2349 100644
--- a/lib/eal/common/eal_common_dev.c
+++ b/lib/eal/common/eal_common_dev.c
@@ -267,9 +267,7 @@ RTE_EXPORT_SYMBOL(rte_dev_probe)
int
rte_dev_probe(const char *devargs)
{
- const struct internal_config *internal_conf =
- eal_get_internal_configuration();
- bool do_mp = internal_conf->no_shconf == 0;
+ bool do_mp = eal_mp_is_enabled();
struct eal_dev_mp_req req;
struct rte_device *dev;
int ret;
@@ -426,9 +424,7 @@ RTE_EXPORT_SYMBOL(rte_dev_remove)
int
rte_dev_remove(struct rte_device *dev)
{
- const struct internal_config *internal_conf =
- eal_get_internal_configuration();
- bool do_mp = internal_conf->no_shconf == 0;
+ bool do_mp = eal_mp_is_enabled();
struct eal_dev_mp_req req;
char *devargs;
int ret;
diff --git a/lib/eal/common/eal_common_mcfg.c b/lib/eal/common/eal_common_mcfg.c
index 84ee3f3959..32f5f50015 100644
--- a/lib/eal/common/eal_common_mcfg.c
+++ b/lib/eal/common/eal_common_mcfg.c
@@ -2,6 +2,7 @@
* Copyright(c) 2019 Intel Corporation
*/
+#include <rte_eal.h>
#include <rte_eal_memconfig.h>
#include <rte_version.h>
@@ -66,6 +67,8 @@ eal_mcfg_update_from_internal(void)
mcfg->legacy_mem = internal_conf->legacy_mem;
mcfg->single_file_segments = internal_conf->single_file_segments;
+ if (internal_conf->no_shconf)
+ rte_mp_disable(); /* multi-process requires shared config */
/* record current DPDK version */
mcfg->version = RTE_VERSION;
}
diff --git a/lib/eal/common/eal_common_proc.c b/lib/eal/common/eal_common_proc.c
index 73c6a53013..1e9541d61f 100644
--- a/lib/eal/common/eal_common_proc.c
+++ b/lib/eal/common/eal_common_proc.c
@@ -233,14 +233,12 @@ int
rte_mp_action_register(const char *name, rte_mp_t action)
{
struct action_entry *entry;
- const struct internal_config *internal_conf =
- eal_get_internal_configuration();
if (validate_action_name(name) != 0)
return -1;
- if (internal_conf->no_shconf) {
- EAL_LOG(DEBUG, "No shared files mode enabled, IPC is disabled");
+ if (!eal_mp_is_enabled()) {
+ EAL_LOG(DEBUG, "Multi-process support is disabled");
rte_errno = ENOTSUP;
return -1;
}
@@ -270,17 +268,10 @@ void
rte_mp_action_unregister(const char *name)
{
struct action_entry *entry;
- const struct internal_config *internal_conf =
- eal_get_internal_configuration();
if (validate_action_name(name) != 0)
return;
- if (internal_conf->no_shconf) {
- EAL_LOG(DEBUG, "No shared files mode enabled, IPC is disabled");
- return;
- }
-
pthread_mutex_lock(&mp_mutex_action);
entry = find_action_entry_by_name(name);
if (entry == NULL) {
@@ -656,14 +647,9 @@ rte_mp_channel_init(void)
{
char path[UNIX_PATH_MAX];
int dir_fd;
- const struct internal_config *internal_conf =
- eal_get_internal_configuration();
- /* in no shared files mode, we do not have secondary processes support,
- * so no need to initialize IPC.
- */
- if (internal_conf->no_shconf) {
- EAL_LOG(DEBUG, "No shared files mode enabled, IPC will be
disabled");
+ if (!eal_mp_is_enabled()) {
+ EAL_LOG(DEBUG, "Multi-process support is disabled");
rte_errno = ENOTSUP;
return -1;
}
@@ -912,14 +898,11 @@ RTE_EXPORT_SYMBOL(rte_mp_sendmsg)
int
rte_mp_sendmsg(struct rte_mp_msg *msg)
{
- const struct internal_config *internal_conf =
- eal_get_internal_configuration();
-
if (check_input(msg) != 0)
return -1;
- if (internal_conf->no_shconf) {
- EAL_LOG(DEBUG, "No shared files mode enabled, IPC is disabled");
+ if (!eal_mp_is_enabled()) {
+ EAL_LOG(DEBUG, "Multi-process support is disabled");
rte_errno = ENOTSUP;
return -1;
}
@@ -1073,8 +1056,6 @@ rte_mp_request_sync(struct rte_mp_msg *req, struct
rte_mp_reply *reply,
DIR *mp_dir;
struct dirent *ent;
struct timespec now, end;
- const struct internal_config *internal_conf =
- eal_get_internal_configuration();
EAL_LOG(DEBUG, "request: %s", req->name);
@@ -1085,8 +1066,8 @@ rte_mp_request_sync(struct rte_mp_msg *req, struct
rte_mp_reply *reply,
if (check_input(req) != 0)
goto end;
- if (internal_conf->no_shconf) {
- EAL_LOG(DEBUG, "No shared files mode enabled, IPC is disabled");
+ if (!eal_mp_is_enabled()) {
+ EAL_LOG(DEBUG, "Multi-process support is disabled");
rte_errno = ENOTSUP;
return -1;
}
@@ -1182,16 +1163,14 @@ rte_mp_request_async(struct rte_mp_msg *req, const
struct timespec *ts,
struct timespec now;
struct timespec *end;
bool dummy_used = false;
- const struct internal_config *internal_conf =
- eal_get_internal_configuration();
EAL_LOG(DEBUG, "request: %s", req->name);
if (check_input(req) != 0)
return -1;
- if (internal_conf->no_shconf) {
- EAL_LOG(DEBUG, "No shared files mode enabled, IPC is disabled");
+ if (!eal_mp_is_enabled()) {
+ EAL_LOG(DEBUG, "Multi-process support is disabled");
rte_errno = ENOTSUP;
return -1;
}
@@ -1378,8 +1357,6 @@ int
rte_mp_reply(struct rte_mp_msg *msg, const char *peer)
{
EAL_LOG(DEBUG, "reply: %s", msg->name);
- const struct internal_config *internal_conf =
- eal_get_internal_configuration();
if (check_input(msg) != 0)
return -1;
@@ -1390,8 +1367,8 @@ rte_mp_reply(struct rte_mp_msg *msg, const char *peer)
return -1;
}
- if (internal_conf->no_shconf) {
- EAL_LOG(DEBUG, "No shared files mode enabled, IPC is disabled");
+ if (!eal_mp_is_enabled()) {
+ EAL_LOG(DEBUG, "Multi-process support is disabled");
return 0;
}
@@ -1438,3 +1415,12 @@ __rte_mp_enable(void)
{
return set_mp_status(MP_STATUS_ENABLED);
}
+
+bool
+eal_mp_is_enabled(void)
+{
+ struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
+
+ return rte_atomic_load_explicit(&mcfg->mp_status,
+ rte_memory_order_relaxed) != MP_STATUS_DISABLED;
+}
diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h
index 8905464f64..6a2a16dcb5 100644
--- a/lib/eal/common/eal_private.h
+++ b/lib/eal/common/eal_private.h
@@ -741,6 +741,11 @@ eal_rand_init(void);
*/
bool __rte_mp_enable(void);
+/**
+ * Check whether multi-process is enabled.
+ */
+bool eal_mp_is_enabled(void);
+
/**
* Init per-lcore info in current thread.
*
diff --git a/lib/eal/windows/eal.c b/lib/eal/windows/eal.c
index cac8faa53d..63a24b6a14 100644
--- a/lib/eal/windows/eal.c
+++ b/lib/eal/windows/eal.c
@@ -81,6 +81,12 @@ rte_mp_disable(void)
return true;
}
+bool
+eal_mp_is_enabled(void)
+{
+ return false;
+}
+
static int
sync_func(void *arg __rte_unused)
{
--
2.55.0