X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fintel_rdt.c;h=29c02fe58587cc04d83d72f4dc74e6318e750c36;hp=7328836694dee755dbdeaa38c51413286dfa6c52;hb=a9e50e9e30ecde17e167e271060c8183bfcbf407;hpb=5cf242b078f236b003f609c6419b13b099e0d2a5 diff --git a/src/intel_rdt.c b/src/intel_rdt.c index 73288366..29c02fe5 100644 --- a/src/intel_rdt.c +++ b/src/intel_rdt.c @@ -25,8 +25,8 @@ * Serhiy Pshyk **/ -#include "common.h" #include "collectd.h" +#include "common.h" #include @@ -80,10 +80,10 @@ static int strtouint64(const char *s, uint64_t *n) { if (!(*s != '\0' && *endptr == '\0')) { DEBUG(RDT_PLUGIN ": Error converting '%s' to unsigned number.", s); - return (-EINVAL); + return -EINVAL; } - return (0); + return 0; } /* @@ -136,12 +136,12 @@ static size_t strlisttonums(char *s, uint64_t *nums, size_t max) { *p = '\0'; ret = strtouint64(token, &start); if (ret < 0) - return (0); + return 0; ret = strtouint64(p + 1, &end); if (ret < 0) - return (0); + return 0; if (start > end) { - return (0); + return 0; } for (n = start; n <= end; n++) { if (!(isdup(nums, index, n))) { @@ -156,7 +156,7 @@ static size_t strlisttonums(char *s, uint64_t *nums, size_t max) { ret = strtouint64(token, &val); if (ret < 0) - return (0); + return 0; if (!(isdup(nums, index, val))) { nums[index] = val; @@ -223,14 +223,14 @@ static int cgroup_set(rdt_core_group_t *cg, char *desc, uint64_t *cores, cg->cores = calloc(num_cores, sizeof(unsigned)); if (cg->cores == NULL) { ERROR(RDT_PLUGIN ": Error allocating core group table"); - return (-ENOMEM); + return -ENOMEM; } cg->num_cores = num_cores; cg->desc = strdup(desc); if (cg->desc == NULL) { ERROR(RDT_PLUGIN ": Error allocating core group description"); sfree(cg->cores); - return (-ENOMEM); + return -ENOMEM; } for (size_t i = 0; i < num_cores; i++) @@ -252,14 +252,13 @@ static int cgroup_set(rdt_core_group_t *cg, char *desc, uint64_t *cores, * `item' Config option containing core groups. * `groups' Table of core groups to set values in. * `max_groups' Maximum number of core groups allowed. - * `max_core' Maximum allowed core value. * * RETURN VALUE * On success, the number of core groups set up. On error, appropriate * negative error value. */ static int oconfig_to_cgroups(oconfig_item_t *item, rdt_core_group_t *groups, - size_t max_groups, uint64_t max_core) { + size_t max_groups) { int index = 0; assert(groups != NULL); @@ -282,15 +281,7 @@ static int oconfig_to_cgroups(oconfig_item_t *item, rdt_core_group_t *groups, if (n == 0) { ERROR(RDT_PLUGIN ": Error parsing core group (%s)", item->values[j].value.string); - return (-EINVAL); - } - - for (int i = 0; i < n; i++) { - if (cores[i] > max_core) { - ERROR(RDT_PLUGIN ": Core group (%s) contains invalid core id (%d)", - item->values[j].value.string, (int)cores[i]); - return (-EINVAL); - } + return -EINVAL; } /* set core group info */ @@ -317,7 +308,7 @@ static void rdt_dump_cgroups(void) { return; DEBUG(RDT_PLUGIN ": Core Groups Dump"); - DEBUG(RDT_PLUGIN ": groups count: %zu", g_rdt->num_groups); + DEBUG(RDT_PLUGIN ": groups count: %" PRIsz, g_rdt->num_groups); for (int i = 0; i < g_rdt->num_groups; i++) { @@ -384,7 +375,7 @@ static int rdt_default_cgroups(void) { char desc[DATA_MAX_NAME_LEN]; uint64_t core = i; - ssnprintf(desc, sizeof(desc), "%d", g_rdt->pqos_cpu->cores[i].lcore); + snprintf(desc, sizeof(desc), "%d", g_rdt->pqos_cpu->cores[i].lcore); /* set core group info */ ret = cgroup_set(&g_rdt->cgroups[i], desc, &core, 1); @@ -395,30 +386,52 @@ static int rdt_default_cgroups(void) { return g_rdt->pqos_cpu->num_cores; } +static int rdt_is_core_id_valid(int core_id) { + + for (int i = 0; i < g_rdt->pqos_cpu->num_cores; i++) + if (core_id == g_rdt->pqos_cpu->cores[i].lcore) + return 1; + + return 0; +} + static int rdt_config_cgroups(oconfig_item_t *item) { int n = 0; enum pqos_mon_event events = 0; if (item == NULL) { DEBUG(RDT_PLUGIN ": cgroups_config: Invalid argument."); - return (-EINVAL); + return -EINVAL; } DEBUG(RDT_PLUGIN ": Core groups [%d]:", item->values_num); for (int j = 0; j < item->values_num; j++) { if (item->values[j].type != OCONFIG_TYPE_STRING) { ERROR(RDT_PLUGIN ": given core group value is not a string [idx=%d]", j); - return (-EINVAL); + return -EINVAL; } DEBUG(RDT_PLUGIN ": [%d]: %s", j, item->values[j].value.string); } - n = oconfig_to_cgroups(item, g_rdt->cgroups, RDT_MAX_CORES, - g_rdt->pqos_cpu->num_cores - 1); + n = oconfig_to_cgroups(item, g_rdt->cgroups, g_rdt->pqos_cpu->num_cores); if (n < 0) { rdt_free_cgroups(); ERROR(RDT_PLUGIN ": Error parsing core groups configuration."); - return (-EINVAL); + return -EINVAL; + } + + /* validate configured core id values */ + for (int group_idx = 0; group_idx < n; group_idx++) { + for (int core_idx = 0; core_idx < g_rdt->cgroups[group_idx].num_cores; + core_idx++) { + if (!rdt_is_core_id_valid(g_rdt->cgroups[group_idx].cores[core_idx])) { + ERROR(RDT_PLUGIN ": Core group '%s' contains invalid core id '%d'", + g_rdt->cgroups[group_idx].desc, + (int)g_rdt->cgroups[group_idx].cores[core_idx]); + rdt_free_cgroups(); + return -EINVAL; + } + } } if (n == 0) { @@ -451,7 +464,7 @@ static int rdt_config_cgroups(oconfig_item_t *item) { if (found != 0) { rdt_free_cgroups(); ERROR(RDT_PLUGIN ": Cannot monitor same cores in different groups."); - return (-EINVAL); + return -EINVAL; } } @@ -460,11 +473,15 @@ static int rdt_config_cgroups(oconfig_item_t *item) { if (g_rdt->pgroups[i] == NULL) { rdt_free_cgroups(); ERROR(RDT_PLUGIN ": Failed to allocate memory for monitoring data."); - return (-ENOMEM); + return -ENOMEM; } } - return (0); + return 0; +} + +static void rdt_pqos_log(void *context, const size_t size, const char *msg) { + DEBUG(RDT_PLUGIN ": %s", msg); } static int rdt_preinit(void) { @@ -472,24 +489,21 @@ static int rdt_preinit(void) { if (g_rdt != NULL) { /* already initialized if config callback was called before init callback */ - return (0); + return 0; } g_rdt = calloc(1, sizeof(*g_rdt)); if (g_rdt == NULL) { ERROR(RDT_PLUGIN ": Failed to allocate memory for rdt context."); - return (-ENOMEM); + return -ENOMEM; } - /* In case previous instance of the application was not closed properly - * call fini and ignore return code. */ - pqos_fini(); + struct pqos_config pqos = {.fd_log = -1, + .callback_log = rdt_pqos_log, + .context_log = NULL, + .verbose = 0}; - /* TODO: - * stdout should not be used here. Will be reworked when support of log - * callback is added to PQoS library. - */ - ret = pqos_init(&(struct pqos_config){.fd_log = STDOUT_FILENO}); + ret = pqos_init(&pqos); if (ret != PQOS_RETVAL_OK) { ERROR(RDT_PLUGIN ": Error initializing PQoS library!"); goto rdt_preinit_error1; @@ -514,7 +528,10 @@ static int rdt_preinit(void) { goto rdt_preinit_error2; } - return (0); + /* Reset pqos monitoring groups registers */ + pqos_mon_reset(); + + return 0; rdt_preinit_error2: pqos_fini(); @@ -523,48 +540,41 @@ rdt_preinit_error1: sfree(g_rdt); - return (-1); + return -1; } static int rdt_config(oconfig_item_t *ci) { - int ret = 0; - - ret = rdt_preinit(); - if (ret != 0) { + if (rdt_preinit() != 0) { g_state = CONFIGURATION_ERROR; /* if we return -1 at this point collectd reports a failure in configuration and aborts */ - goto exit; + return (0); } for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("Cores", child->key) == 0) { - - ret = rdt_config_cgroups(child); - if (ret != 0) { + if (rdt_config_cgroups(child) != 0) { g_state = CONFIGURATION_ERROR; /* if we return -1 at this point collectd reports a failure in configuration and aborts */ - goto exit; + return (0); } #if COLLECT_DEBUG rdt_dump_cgroups(); #endif /* COLLECT_DEBUG */ - } else { ERROR(RDT_PLUGIN ": Unknown configuration parameter \"%s\".", child->key); } } -exit: - return (0); + return 0; } static void rdt_submit_derive(char *cgroup, char *type, char *type_instance, @@ -604,13 +614,13 @@ static int rdt_read(__attribute__((unused)) user_data_t *ud) { if (g_rdt == NULL) { ERROR(RDT_PLUGIN ": rdt_read: plugin not initialized."); - return (-EINVAL); + return -EINVAL; } ret = pqos_mon_poll(&g_rdt->pgroups[0], (unsigned)g_rdt->num_groups); if (ret != PQOS_RETVAL_OK) { ERROR(RDT_PLUGIN ": Failed to poll monitoring data."); - return (-1); + return -1; } #if COLLECT_DEBUG @@ -640,14 +650,14 @@ static int rdt_read(__attribute__((unused)) user_data_t *ud) { } } - return (0); + return 0; } static int rdt_init(void) { int ret; - if(g_state == CONFIGURATION_ERROR) - return (-1); + if (g_state == CONFIGURATION_ERROR) + return -1; ret = rdt_preinit(); if (ret != 0) @@ -665,7 +675,7 @@ static int rdt_init(void) { cg->desc, ret); } - return (0); + return 0; } static int rdt_shutdown(void) { @@ -674,7 +684,7 @@ static int rdt_shutdown(void) { DEBUG(RDT_PLUGIN ": rdt_shutdown."); if (g_rdt == NULL) - return (0); + return 0; /* Stop monitoring */ for (int i = 0; i < g_rdt->num_groups; i++) { @@ -688,7 +698,7 @@ static int rdt_shutdown(void) { rdt_free_cgroups(); sfree(g_rdt); - return (0); + return 0; } void module_register(void) {