X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdpdkstat.c;h=6b057f214e3276412dd56a3aa402048c6bb6d369;hb=64b8150edec2271bb110f36e70915fdd87d9cac2;hp=fd11097628afcce554c3f2ece05796b093c04bb3;hpb=126b35ee8786a3aca1bcc1346a60bc528d06c414;p=collectd.git diff --git a/src/dpdkstat.c b/src/dpdkstat.c index fd110976..6b057f21 100644 --- a/src/dpdkstat.c +++ b/src/dpdkstat.c @@ -94,12 +94,12 @@ typedef struct dpdk_stats_ctx_s dpdk_stats_ctx_t; #define DPDK_STATS_CTX_GET(a) ((dpdk_stats_ctx_t *)dpdk_helper_priv_get(a)) dpdk_helper_ctx_t *g_hc = NULL; - +static char g_shm_name[DATA_MAX_NAME_LEN] = DPDK_STATS_NAME; +static int dpdk_stats_reinit_helper(); static void dpdk_stats_default_config(void) { dpdk_stats_ctx_t *ec = DPDK_STATS_CTX_GET(g_hc); ec->config.interval = plugin_get_interval(); - for (int i = 0; i < RTE_MAX_ETHPORTS; i++) { ec->config.port_name[i][0] = 0; } @@ -114,16 +114,15 @@ static int dpdk_stats_preinit(void) { return 0; } - int ret = dpdk_helper_init(DPDK_STATS_NAME, sizeof(dpdk_stats_ctx_t), &g_hc); + int ret = dpdk_helper_init(g_shm_name, sizeof(dpdk_stats_ctx_t), &g_hc); if (ret != 0) { char errbuf[ERR_BUF_SIZE]; ERROR("%s: failed to initialize %s helper(error: %s)", DPDK_STATS_PLUGIN, - DPDK_STATS_NAME, sstrerror(errno, errbuf, sizeof(errbuf))); + g_shm_name, sstrerror(errno, errbuf, sizeof(errbuf))); return ret; } dpdk_stats_default_config(); - return ret; } @@ -144,6 +143,10 @@ static int dpdk_stats_config(oconfig_item_t *ci) { ctx->config.enabled_port_mask = child->values[0].value.number; DEBUG("%s: Enabled Port Mask 0x%X", DPDK_STATS_PLUGIN, ctx->config.enabled_port_mask); + } else if (strcasecmp("SharedMemObj", child->key) == 0) { + cf_util_get_string_buffer(child, g_shm_name, sizeof(g_shm_name)); + DEBUG("%s: Shared memory object %s", DPDK_STATS_PLUGIN, g_shm_name); + dpdk_stats_reinit_helper(); } else if (strcasecmp("EAL", child->key) == 0) { ret = dpdk_helper_eal_config_parse(g_hc, child); if (ret) @@ -175,73 +178,56 @@ static int dpdk_stats_config(oconfig_item_t *ci) { } static int dpdk_helper_stats_get(dpdk_helper_ctx_t *phc) { - dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(phc); - - /* get stats from DPDK */ - - uint8_t ports_count = rte_eth_dev_count(); - if (ports_count == 0) { - DPDK_CHILD_LOG("%s: No DPDK ports available. " - "Check bound devices to DPDK driver.\n", - DPDK_STATS_PLUGIN); - return -ENODEV; - } - - if (ports_count > RTE_MAX_ETHPORTS) - ports_count = RTE_MAX_ETHPORTS; - - ctx->ports_count = ports_count; - int len = 0; int ret = 0; int stats = 0; + dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(phc); - for (uint8_t i = 0; i < ports_count; i++) { + /* get stats from DPDK */ + for (uint8_t i = 0; i < ctx->ports_count; i++) { if (!(ctx->config.enabled_port_mask & (1 << i))) continue; + ctx->port_read_time[i] = cdtime(); + /* Store available stats array length for port */ len = ctx->port_stats_count[i]; + ret = rte_eth_xstats_get(i, &ctx->xstats[stats], len); - if (ret < 0 || ret != len) { - DPDK_CHILD_LOG("%s: Error reading stats (port=%d; len=%d)\n", - DPDK_STATS_PLUGIN, i, len); + if (ret < 0 || ret > len) { + DPDK_CHILD_LOG(DPDK_STATS_PLUGIN + ": Error reading stats (port=%d; len=%d, ret=%d)\n", + i, len, ret); + ctx->port_stats_count[i] = 0; return -1; } #if RTE_VERSION >= RTE_VERSION_16_07 ret = rte_eth_xstats_get_names(i, &ctx->xnames[stats], len); - if (ret < 0 || ret != len) { - DPDK_CHILD_LOG("%s: Error reading stat names (port=%d; len=%d)\n", - DPDK_STATS_PLUGIN, i, len); + if (ret < 0 || ret > len) { + DPDK_CHILD_LOG(DPDK_STATS_PLUGIN + ": Error reading stat names (port=%d; len=%d ret=%d)\n", + i, len, ret); + ctx->port_stats_count[i] = 0; return -1; } #endif - stats += len; + ctx->port_stats_count[i] = ret; + stats += ctx->port_stats_count[i]; } - assert(stats == ctx->stats_count); - + assert(stats <= ctx->stats_count); return 0; } static int dpdk_helper_stats_count_get(dpdk_helper_ctx_t *phc) { - dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(phc); - - uint8_t ports = rte_eth_dev_count(); - if (ports == 0) { - DPDK_CHILD_LOG("%s: No DPDK ports available. " - "Check bound devices to DPDK driver.\n", - DPDK_STATS_PLUGIN); + uint8_t ports = dpdk_helper_eth_dev_count(); + if (ports == 0) return -ENODEV; - } - - if (ports > RTE_MAX_ETHPORTS) - ports = RTE_MAX_ETHPORTS; + dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(phc); ctx->ports_count = ports; int len = 0; int stats_count = 0; - for (int i = 0; i < ports; i++) { if (!(ctx->config.enabled_port_mask & (1 << i))) continue; @@ -264,9 +250,12 @@ static int dpdk_helper_stats_count_get(dpdk_helper_ctx_t *phc) { return stats_count; } +static int dpdk_stats_get_size(dpdk_helper_ctx_t *phc) { + return (dpdk_helper_data_size_get(phc) - sizeof(dpdk_stats_ctx_t)); +} + int dpdk_helper_command_handler(dpdk_helper_ctx_t *phc, enum DPDK_CMD cmd) { /* this function is called from helper context */ - int ret = 0; if (phc == NULL) { DPDK_CHILD_LOG("%s: Invalid argument(phc)\n", DPDK_STATS_PLUGIN); @@ -278,34 +267,23 @@ int dpdk_helper_command_handler(dpdk_helper_ctx_t *phc, enum DPDK_CMD cmd) { return -EINVAL; } - dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(phc); - - if (ctx->stats_count == 0) { - - int stats_count = dpdk_helper_stats_count_get(phc); + int stats_count = dpdk_helper_stats_count_get(phc); + if (stats_count < 0) { + return stats_count; + } - if (stats_count < 0) { - return stats_count; - } + DPDK_STATS_CTX_GET(phc)->stats_count = stats_count; + int stats_size = stats_count * DPDK_STATS_CTX_GET_XSTAT_SIZE; - int stats_size = stats_count * DPDK_STATS_CTX_GET_XSTAT_SIZE; - ctx->stats_count = stats_count; - - if ((dpdk_helper_data_size_get(phc) - sizeof(dpdk_stats_ctx_t)) < - stats_size) { - DPDK_CHILD_LOG( - "%s:%s:%d not enough space for stats (available=%d, " - "needed=%d)\n", - DPDK_STATS_PLUGIN, __FUNCTION__, __LINE__, - (int)(dpdk_helper_data_size_get(phc) - sizeof(dpdk_stats_ctx_t)), - stats_size); - return -ENOBUFS; - } + if (dpdk_stats_get_size(phc) < stats_size) { + DPDK_CHILD_LOG( + DPDK_STATS_PLUGIN + ":%s:%d not enough space for stats (available=%d, needed=%d)\n", + __FUNCTION__, __LINE__, (int)dpdk_stats_get_size(phc), stats_size); + return -ENOBUFS; } - ret = dpdk_helper_stats_get(phc); - - return ret; + return dpdk_helper_stats_get(phc); } static void dpdk_stats_resolve_cnt_type(char *cnt_type, size_t cnt_type_len, @@ -444,11 +422,11 @@ static int dpdk_stats_reinit_helper() { g_hc = NULL; int ret; - ret = dpdk_helper_init(DPDK_STATS_NAME, data_size, &g_hc); + ret = dpdk_helper_init(g_shm_name, data_size, &g_hc); if (ret != 0) { char errbuf[ERR_BUF_SIZE]; ERROR("%s: failed to initialize %s helper(error: %s)", DPDK_STATS_PLUGIN, - DPDK_STATS_NAME, sstrerror(errno, errbuf, sizeof(errbuf))); + g_shm_name, sstrerror(errno, errbuf, sizeof(errbuf))); return ret; } @@ -492,7 +470,6 @@ static int dpdk_stats_read(user_data_t *ud) { static int dpdk_stats_init(void) { DPDK_STATS_TRACE(); - int ret = 0; ret = dpdk_stats_preinit(); @@ -511,8 +488,7 @@ static int dpdk_stats_shutdown(void) { ret = dpdk_helper_shutdown(g_hc); g_hc = NULL; if (ret != 0) { - ERROR("%s: failed to cleanup %s helper", DPDK_STATS_PLUGIN, - DPDK_STATS_NAME); + ERROR("%s: failed to cleanup %s helper", DPDK_STATS_PLUGIN, g_shm_name); return ret; }