X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Futils_dpdk.c;fp=src%2Futils_dpdk.c;h=77f596ebd7da7352efcb4e1d76b550505a80c61c;hp=4b246c9ecb870b19c2d9d3d588346556776c1ffe;hb=7f38ca96e3a54a4b02475f857c7d79c6a1257ada;hpb=e746ad785774de37a30302fef65f1c4aaf8698ab diff --git a/src/utils_dpdk.c b/src/utils_dpdk.c index 4b246c9e..77f596eb 100644 --- a/src/utils_dpdk.c +++ b/src/utils_dpdk.c @@ -66,7 +66,7 @@ struct dpdk_helper_ctx_s { int eal_initialized; size_t shm_size; - const char *shm_name; + char shm_name[DATA_MAX_NAME_LEN]; sem_t sema_cmd_start; sem_t sema_cmd_complete; @@ -105,7 +105,6 @@ static void dpdk_helper_config_default(dpdk_helper_ctx_t *phc) { snprintf(phc->eal_config.coremask, DATA_MAX_NAME_LEN, "%s", "0xf"); snprintf(phc->eal_config.memory_channels, DATA_MAX_NAME_LEN, "%s", "1"); - snprintf(phc->eal_config.process_type, DATA_MAX_NAME_LEN, "%s", "secondary"); snprintf(phc->eal_config.file_prefix, DATA_MAX_NAME_LEN, "%s", DPDK_DEFAULT_RTE_CONFIG); } @@ -162,6 +161,7 @@ int dpdk_helper_eal_config_parse(dpdk_helper_ctx_t *phc, oconfig_item_t *ci) { int status = 0; for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; + if (strcasecmp("Coremask", child->key) == 0) { status = cf_util_get_string_buffer(child, phc->eal_config.coremask, sizeof(phc->eal_config.coremask)); @@ -176,15 +176,15 @@ int dpdk_helper_eal_config_parse(dpdk_helper_ctx_t *phc, oconfig_item_t *ci) { status = cf_util_get_string_buffer(child, phc->eal_config.socket_memory, sizeof(phc->eal_config.socket_memory)); DEBUG("dpdk_common: EAL:Socket memory %s", phc->eal_config.socket_memory); - } else if (strcasecmp("ProcessType", child->key) == 0) { - status = cf_util_get_string_buffer(child, phc->eal_config.process_type, - sizeof(phc->eal_config.process_type)); - DEBUG("dpdk_common: EAL:Process type %s", phc->eal_config.process_type); - } else if ((strcasecmp("FilePrefix", child->key) == 0) && - (child->values[0].type == OCONFIG_TYPE_STRING)) { - snprintf(phc->eal_config.file_prefix, DATA_MAX_NAME_LEN, - "/var/run/.%s_config", child->values[0].value.string); - DEBUG("dpdk_common: EAL:File prefix %s", phc->eal_config.file_prefix); + } else if (strcasecmp("FilePrefix", child->key) == 0) { + char prefix[DATA_MAX_NAME_LEN]; + + status = cf_util_get_string_buffer(child, prefix, sizeof(prefix)); + if (status == 0) { + snprintf(phc->eal_config.file_prefix, DATA_MAX_NAME_LEN, + "/var/run/.%s_config", prefix); + DEBUG("dpdk_common: EAL:File prefix %s", phc->eal_config.file_prefix); + } } else { ERROR("dpdk_common: Invalid '%s' configuration option", child->key); status = -EINVAL; @@ -242,13 +242,16 @@ static void dpdk_shm_cleanup(const char *name, size_t size, void *map) { DPDK_HELPER_TRACE(name); char errbuf[ERR_BUF_SIZE]; + /* + * Call shm_unlink first, as 'name' might be no longer accessible after munmap + */ + if (shm_unlink(name)) + ERROR("shm_unlink failure %s", sstrerror(errno, errbuf, sizeof(errbuf))); + if (map != NULL) { if (munmap(map, size)) ERROR("munmap failure %s", sstrerror(errno, errbuf, sizeof(errbuf))); } - - if (shm_unlink(name)) - ERROR("shm_unlink failure %s", sstrerror(errno, errbuf, sizeof(errbuf))); } void *dpdk_helper_priv_get(dpdk_helper_ctx_t *phc) { @@ -313,7 +316,7 @@ int dpdk_helper_init(const char *name, size_t data_size, } phc->shm_size = shm_size; - phc->shm_name = name; + sstrncpy(phc->shm_name, name, sizeof(phc->shm_name)); dpdk_helper_config_default(phc); @@ -322,11 +325,9 @@ int dpdk_helper_init(const char *name, size_t data_size, return 0; } -int dpdk_helper_shutdown(dpdk_helper_ctx_t *phc) { - if (phc == NULL) { - ERROR("%s:Invalid argument(phc)", __FUNCTION__); - return -EINVAL; - } +void dpdk_helper_shutdown(dpdk_helper_ctx_t *phc) { + if (phc == NULL) + return; DPDK_HELPER_TRACE(phc->shm_name); @@ -339,8 +340,6 @@ int dpdk_helper_shutdown(dpdk_helper_ctx_t *phc) { sem_destroy(&phc->sema_cmd_start); sem_destroy(&phc->sema_cmd_complete); dpdk_shm_cleanup(phc->shm_name, phc->shm_size, (void *)phc); - - return 0; } static int dpdk_helper_spawn(dpdk_helper_ctx_t *phc) { @@ -471,7 +470,6 @@ static int dpdk_helper_eal_init(dpdk_helper_ctx_t *phc) { /* EAL config must be initialized */ assert(phc->eal_config.coremask[0] != 0); assert(phc->eal_config.memory_channels[0] != 0); - assert(phc->eal_config.process_type[0] != 0); assert(phc->eal_config.file_prefix[0] != 0); argp[argc++] = "collectd-dpdk"; @@ -493,7 +491,7 @@ static int dpdk_helper_eal_init(dpdk_helper_ctx_t *phc) { } argp[argc++] = "--proc-type"; - argp[argc++] = phc->eal_config.process_type; + argp[argc++] = "secondary"; assert(argc <= (DPDK_EAL_ARGC * 2 + 1));