X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdpdkevents.c;h=e9f01078492d9c5f9faf80e526032048f01b5685;hb=400c086b0ab8fab8f5248d3b2893144767e60aa7;hp=6be6bc046180f501392fa342e78477a6a5e7b100;hpb=d45f9cdfc084fc5e8783073b993d58b84deb5d58;p=collectd.git diff --git a/src/dpdkevents.c b/src/dpdkevents.c index 6be6bc04..e9f01078 100644 --- a/src/dpdkevents.c +++ b/src/dpdkevents.c @@ -79,6 +79,7 @@ typedef struct dpdk_keep_alive_config_s { dpdk_keepalive_shm_t *shm; char shm_name[DATA_MAX_NAME_LEN]; int notify; + int fd; } dpdk_keep_alive_config_t; typedef struct dpdk_events_config_s { @@ -107,7 +108,7 @@ typedef struct dpdk_events_ctx_s { static dpdk_helper_ctx_t *g_hc; -static int dpdk_event_keep_alive_shm_create(void) { +static int dpdk_event_keep_alive_shm_open(void) { dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc); char *shm_name; @@ -121,23 +122,48 @@ static int dpdk_event_keep_alive_shm_create(void) { } char errbuf[ERR_BUF_SIZE]; - int fd = shm_open(shm_name, O_RDWR, 0); + int fd = shm_open(shm_name, O_RDONLY, 0); if (fd < 0) { ERROR(DPDK_EVENTS_PLUGIN ": Failed to open %s as SHM:%s. Is DPDK KA " "primary application running?", shm_name, sstrerror(errno, errbuf, sizeof(errbuf))); return errno; - } else { - ec->config.keep_alive.shm = - (dpdk_keepalive_shm_t *)mmap(0, sizeof(*(ec->config.keep_alive.shm)), - PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - close(fd); - if (ec->config.keep_alive.shm == MAP_FAILED) { - ERROR(DPDK_EVENTS_PLUGIN ": Failed to mmap KA SHM:%s", - sstrerror(errno, errbuf, sizeof(errbuf))); - return errno; + } + + if (ec->config.keep_alive.fd != -1) { + struct stat stat_old, stat_new; + + if (fstat(ec->config.keep_alive.fd, &stat_old) || fstat(fd, &stat_new)) { + ERROR(DPDK_EVENTS_PLUGIN ": failed to get information about a file"); + close(fd); + return -1; + } + + /* Check if inode number has changed. If yes, then create a new mapping */ + if (stat_old.st_ino == stat_new.st_ino) { + close(fd); + return 0; + } + + if (munmap(ec->config.keep_alive.shm, sizeof(dpdk_keepalive_shm_t)) != 0) { + ERROR(DPDK_EVENTS_PLUGIN ": munmap KA monitor failed"); + close(fd); + return -1; } + + close(ec->config.keep_alive.fd); + ec->config.keep_alive.fd = -1; + } + + ec->config.keep_alive.shm = (dpdk_keepalive_shm_t *)mmap( + 0, sizeof(*(ec->config.keep_alive.shm)), PROT_READ, MAP_SHARED, fd, 0); + if (ec->config.keep_alive.shm == MAP_FAILED) { + ERROR(DPDK_EVENTS_PLUGIN ": Failed to mmap KA SHM:%s", + sstrerror(errno, errbuf, sizeof(errbuf))); + close(fd); + return errno; } + ec->config.keep_alive.fd = fd; return 0; } @@ -147,8 +173,11 @@ static void dpdk_events_default_config(void) { ec->config.interval = plugin_get_interval(); + /* In configless mode when no section is defined in config file + * both link_status and keep_alive should be enabled */ + /* Link Status */ - ec->config.link_status.enabled = 0; + ec->config.link_status.enabled = 1; ec->config.link_status.enabled_port_mask = ~0; ec->config.link_status.send_updated = 1; ec->config.link_status.notify = 0; @@ -158,13 +187,16 @@ static void dpdk_events_default_config(void) { } /* Keep Alive */ - ec->config.keep_alive.enabled = 0; + ec->config.keep_alive.enabled = 1; ec->config.keep_alive.send_updated = 1; ec->config.keep_alive.notify = 0; - memset(&ec->config.keep_alive.lcore_mask, 0, + /* by default enable 128 cores */ + memset(&ec->config.keep_alive.lcore_mask, 1, sizeof(ec->config.keep_alive.lcore_mask)); memset(&ec->config.keep_alive.shm_name, 0, sizeof(ec->config.keep_alive.shm_name)); + ec->config.keep_alive.shm = MAP_FAILED; + ec->config.keep_alive.fd = -1; } static int dpdk_events_preinit(void) { @@ -281,13 +313,18 @@ static int dpdk_events_keep_alive_config(dpdk_events_ctx_t *ec, static int dpdk_events_config(oconfig_item_t *ci) { DPDK_EVENTS_TRACE(); - int ret = dpdk_events_preinit(); if (ret) return ret; dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc); + /* Disabling link_status and keep_alive since config section + * specifies if those should be enabled */ + ec->config.keep_alive.enabled = ec->config.link_status.enabled = 0; + memset(&ec->config.keep_alive.lcore_mask, 0, + sizeof(ec->config.keep_alive.lcore_mask)); + for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("EAL", child->key) == 0) { @@ -517,18 +554,30 @@ static int dpdk_events_read(user_data_t *ud) { } dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc); + int ls_ret = -1, ka_ret = -1; + int cmd_res = 0; if (ec->config.link_status.enabled) { - int cmd_res = 0; - int ret = dpdk_helper_command(g_hc, DPDK_CMD_GET_EVENTS, &cmd_res, - ec->config.interval); - if (cmd_res == 0 && ret == 0) { + ls_ret = dpdk_helper_command(g_hc, DPDK_CMD_GET_EVENTS, &cmd_res, + ec->config.interval); + if (cmd_res == 0 && ls_ret == 0) { dpdk_events_link_status_dispatch(g_hc); } } if (ec->config.keep_alive.enabled) { - dpdk_events_keep_alive_dispatch(g_hc); + ka_ret = dpdk_event_keep_alive_shm_open(); + if (ka_ret) { + ERROR(DPDK_EVENTS_PLUGIN + ": %s : error %d in dpdk_event_keep_alive_shm_open()", + __FUNCTION__, ka_ret); + } else + dpdk_events_keep_alive_dispatch(g_hc); + } + + if (!((cmd_res || ls_ret) == 0 || ka_ret == 0)) { + ERROR(DPDK_EVENTS_PLUGIN ": Read failure for all enabled event types"); + return -1; } return 0; @@ -541,16 +590,6 @@ static int dpdk_events_init(void) { if (ret) return ret; - dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc); - - if (ec->config.keep_alive.enabled) { - ret = dpdk_event_keep_alive_shm_create(); - if (ret) { - ERROR(DPDK_EVENTS_PLUGIN ": %s : error %d in ka_shm_create()", - __FUNCTION__, ret); - return ret; - } - } return 0; } @@ -560,10 +599,17 @@ static int dpdk_events_shutdown(void) { dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc); if (ec->config.keep_alive.enabled) { - ret = munmap(ec->config.keep_alive.shm, sizeof(dpdk_keepalive_shm_t)); - if (ret) { - ERROR(DPDK_EVENTS_PLUGIN ": munmap KA monitor returned %d", ret); - return ret; + if (ec->config.keep_alive.fd != -1) { + close(ec->config.keep_alive.fd); + ec->config.keep_alive.fd = -1; + } + + if (ec->config.keep_alive.shm != MAP_FAILED) { + if (munmap(ec->config.keep_alive.shm, sizeof(dpdk_keepalive_shm_t))) { + ERROR(DPDK_EVENTS_PLUGIN ": munmap KA monitor failed"); + return -1; + } + ec->config.keep_alive.shm = MAP_FAILED; } }