X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fcommon%2Feal_common_proc.c;h=6d1af3c0e756a2975bb1390a5770b916daaf75ca;hb=e863fe3a13da89787fdf3b5c590101a3c0f10af6;hp=7f86c12e98852d781ec4340c8626a8147f8083cf;hpb=edf73dd330729d9892add288da5e73c171553dd8;p=dpdk.git diff --git a/lib/librte_eal/common/eal_common_proc.c b/lib/librte_eal/common/eal_common_proc.c index 7f86c12e98..6d1af3c0e7 100644 --- a/lib/librte_eal/common/eal_common_proc.c +++ b/lib/librte_eal/common/eal_common_proc.c @@ -29,6 +29,7 @@ #include #include +#include "eal_memcfg.h" #include "eal_private.h" #include "eal_filesystem.h" #include "eal_internal_cfg.h" @@ -197,15 +198,17 @@ validate_action_name(const char *name) return 0; } -int __rte_experimental +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_config.no_shconf) { + if (internal_conf->no_shconf) { RTE_LOG(DEBUG, EAL, "No shared files mode enabled, IPC is disabled\n"); rte_errno = ENOTSUP; return -1; @@ -231,14 +234,21 @@ rte_mp_action_register(const char *name, rte_mp_t action) return 0; } -void __rte_experimental +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) { + RTE_LOG(DEBUG, EAL, "No shared files mode enabled, IPC is disabled\n"); + return; + } + pthread_mutex_lock(&mp_mutex_action); entry = find_action_entry_by_name(name); if (entry == NULL) { @@ -278,7 +288,7 @@ read_msg(struct mp_msg_internal *m, struct sockaddr_un *s) } if (msglen != buflen || (msgh.msg_flags & (MSG_TRUNC | MSG_CTRUNC))) { - RTE_LOG(ERR, EAL, "truncted msg\n"); + RTE_LOG(ERR, EAL, "truncated msg\n"); return -1; } @@ -310,6 +320,8 @@ process_msg(struct mp_msg_internal *m, struct sockaddr_un *s) struct action_entry *entry; struct rte_mp_msg *msg = &m->msg; rte_mp_t action = NULL; + const struct internal_config *internal_conf = + eal_get_internal_configuration(); RTE_LOG(DEBUG, EAL, "msg: %s\n", msg->name); @@ -345,7 +357,7 @@ process_msg(struct mp_msg_internal *m, struct sockaddr_un *s) pthread_mutex_unlock(&mp_mutex_action); if (!action) { - if (m->type == MP_REQ && !internal_config.init_complete) { + if (m->type == MP_REQ && !internal_conf->init_complete) { /* if this is a request, and init is not yet complete, * and callback wasn't registered, we should tell the * requester to ignore our existence because we're not @@ -411,7 +423,7 @@ process_async_request(struct pending_request *sr, const struct timespec *now) /* did we timeout? */ timeout = timespec_cmp(¶m->end, now) <= 0; - /* if we received a response, adjust relevant data and copy mesasge. */ + /* if we received a response, adjust relevant data and copy message. */ if (sr->reply_received == 1 && sr->reply) { struct rte_mp_msg *msg, *user_msgs, *tmp; @@ -576,11 +588,13 @@ rte_mp_channel_init(void) char path[PATH_MAX]; int dir_fd; pthread_t mp_handle_tid; + 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_config.no_shconf) { + if (internal_conf->no_shconf) { RTE_LOG(DEBUG, EAL, "No shared files mode enabled, IPC will be disabled\n"); rte_errno = ENOTSUP; return -1; @@ -616,7 +630,7 @@ rte_mp_channel_init(void) if (rte_ctrl_thread_create(&mp_handle_tid, "rte_mp_handle", NULL, mp_handle, NULL) < 0) { - RTE_LOG(ERR, EAL, "failed to create mp thead: %s\n", + RTE_LOG(ERR, EAL, "failed to create mp thread: %s\n", strerror(errno)); close(mp_fd); close(dir_fd); @@ -796,12 +810,21 @@ check_input(const struct rte_mp_msg *msg) return 0; } -int __rte_experimental +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) { + RTE_LOG(DEBUG, EAL, "No shared files mode enabled, IPC is disabled\n"); + rte_errno = ENOTSUP; + return -1; + } + RTE_LOG(DEBUG, EAL, "sendmsg: %s\n", msg->name); return mp_send(msg, NULL, MP_MSG); } @@ -937,7 +960,7 @@ mp_request_sync(const char *dst, struct rte_mp_msg *req, return 0; } -int __rte_experimental +int rte_mp_request_sync(struct rte_mp_msg *req, struct rte_mp_reply *reply, const struct timespec *ts) { @@ -946,6 +969,8 @@ rte_mp_request_sync(struct rte_mp_msg *req, struct rte_mp_reply *reply, struct dirent *ent; struct timeval now; struct timespec end; + const struct internal_config *internal_conf = + eal_get_internal_configuration(); RTE_LOG(DEBUG, EAL, "request: %s\n", req->name); @@ -956,9 +981,10 @@ rte_mp_request_sync(struct rte_mp_msg *req, struct rte_mp_reply *reply, if (check_input(req) != 0) goto end; - if (internal_config.no_shconf) { + if (internal_conf->no_shconf) { RTE_LOG(DEBUG, EAL, "No shared files mode enabled, IPC is disabled\n"); - return 0; + rte_errno = ENOTSUP; + return -1; } if (gettimeofday(&now, NULL) < 0) { @@ -1032,7 +1058,7 @@ end: return ret; } -int __rte_experimental +int rte_mp_request_async(struct rte_mp_msg *req, const struct timespec *ts, rte_mp_async_reply_t clb) { @@ -1046,19 +1072,22 @@ rte_mp_request_async(struct rte_mp_msg *req, const struct timespec *ts, struct timeval now; struct timespec *end; bool dummy_used = false; + const struct internal_config *internal_conf = + eal_get_internal_configuration(); RTE_LOG(DEBUG, EAL, "request: %s\n", req->name); if (check_input(req) != 0) return -1; - if (internal_config.no_shconf) { + if (internal_conf->no_shconf) { RTE_LOG(DEBUG, EAL, "No shared files mode enabled, IPC is disabled\n"); - return 0; + rte_errno = ENOTSUP; + return -1; } if (gettimeofday(&now, NULL) < 0) { - RTE_LOG(ERR, EAL, "Faile to get current time\n"); + RTE_LOG(ERR, EAL, "Failed to get current time\n"); rte_errno = errno; return -1; } @@ -1181,10 +1210,12 @@ fail: return -1; } -int __rte_experimental +int rte_mp_reply(struct rte_mp_msg *msg, const char *peer) { RTE_LOG(DEBUG, EAL, "reply: %s\n", msg->name); + const struct internal_config *internal_conf = + eal_get_internal_configuration(); if (check_input(msg) != 0) return -1; @@ -1195,10 +1226,50 @@ rte_mp_reply(struct rte_mp_msg *msg, const char *peer) return -1; } - if (internal_config.no_shconf) { + if (internal_conf->no_shconf) { RTE_LOG(DEBUG, EAL, "No shared files mode enabled, IPC is disabled\n"); return 0; } return mp_send(msg, peer, MP_REP); } + +/* Internally, the status of the mp feature is represented as a three-state: + * - "unknown" as long as no secondary process attached to a primary process + * and there was no call to rte_mp_disable yet, + * - "enabled" as soon as a secondary process attaches to a primary process, + * - "disabled" when a primary process successfully called rte_mp_disable, + */ +enum mp_status { + MP_STATUS_UNKNOWN, + MP_STATUS_DISABLED, + MP_STATUS_ENABLED, +}; + +static bool +set_mp_status(enum mp_status status) +{ + struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; + uint8_t expected; + uint8_t desired; + + expected = MP_STATUS_UNKNOWN; + desired = status; + if (__atomic_compare_exchange_n(&mcfg->mp_status, &expected, desired, + false, __ATOMIC_RELAXED, __ATOMIC_RELAXED)) + return true; + + return __atomic_load_n(&mcfg->mp_status, __ATOMIC_RELAXED) == desired; +} + +bool +rte_mp_disable(void) +{ + return set_mp_status(MP_STATUS_DISABLED); +} + +bool +__rte_mp_enable(void) +{ + return set_mp_status(MP_STATUS_ENABLED); +}