static int rdt_preinit(void) { int ret; if (g_rdt != NULL) { /* already initialized if config callback was called before init callback */ 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; } struct pqos_config pqos = {.fd_log = -1, .callback_log = rdt_pqos_log, .context_log = NULL, .verbose = 0}; ret = pqos_init(&pqos); if (ret != PQOS_RETVAL_OK) { ERROR(RDT_PLUGIN ": Error initializing PQoS library!"); goto rdt_preinit_error1; } ret = pqos_cap_get(&g_rdt->pqos_cap, &g_rdt->pqos_cpu); if (ret != PQOS_RETVAL_OK) { ERROR(RDT_PLUGIN ": Error retrieving PQoS capabilities."); goto rdt_preinit_error2; } ret = pqos_cap_get_type(g_rdt->pqos_cap, PQOS_CAP_TYPE_MON, &g_rdt->cap_mon); if (ret == PQOS_RETVAL_PARAM) { ERROR(RDT_PLUGIN ": Error retrieving monitoring capabilities."); goto rdt_preinit_error2; } if (g_rdt->cap_mon == NULL) { ERROR( RDT_PLUGIN ": Monitoring capability not detected. Nothing to do for the plugin."); goto rdt_preinit_error2; } /* Reset pqos monitoring groups registers */ pqos_mon_reset(); return 0; rdt_preinit_error2: pqos_fini(); rdt_preinit_error1: sfree(g_rdt); return -1; } static int rdt_config(oconfig_item_t *ci) { if (rdt_preinit() != 0) { g_state = CONFIGURATION_ERROR; /* if we return -1 at this point collectd reports a failure in configuration and aborts */ return (0); } for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("Cores", child->key) == 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 */ return (0); } #if COLLECT_DEBUG rdt_dump_cgroups(); #endif /* COLLECT_DEBUG */ } else { ERROR(RDT_PLUGIN ": Unknown configuration parameter \"%s\".", child->key); } } return 0; } static void rdt_submit_derive(const char *cgroup, const char *type, const char *type_instance, derive_t value) { value_list_t vl = VALUE_LIST_INIT; vl.values = &(value_t){.derive = value}; vl.values_len = 1; sstrncpy(vl.plugin, RDT_PLUGIN, sizeof(vl.plugin)); snprintf(vl.plugin_instance, sizeof(vl.plugin_instance), "%s", cgroup); sstrncpy(vl.type, type, sizeof(vl.type)); if (type_instance) sstrncpy(vl.type_instance, type_instance, sizeof(vl.type_instance)); plugin_dispatch_values(&vl); }
static int rdt_preinit(void) { int ret; if (g_rdt != NULL) { /* already initialized if config callback was called before init callback */ 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); } struct pqos_config pqos = {.fd_log = -1, .callback_log = rdt_pqos_log, .context_log = NULL, .verbose = 0}; ret = pqos_init(&pqos); if (ret != PQOS_RETVAL_OK) { ERROR(RDT_PLUGIN ": Error initializing PQoS library!"); goto rdt_preinit_error1; } ret = pqos_cap_get(&g_rdt->pqos_cap, &g_rdt->pqos_cpu); if (ret != PQOS_RETVAL_OK) { ERROR(RDT_PLUGIN ": Error retrieving PQoS capabilities."); goto rdt_preinit_error2; } ret = pqos_cap_get_type(g_rdt->pqos_cap, PQOS_CAP_TYPE_MON, &g_rdt->cap_mon); if (ret == PQOS_RETVAL_PARAM) { ERROR(RDT_PLUGIN ": Error retrieving monitoring capabilities."); goto rdt_preinit_error2; } if (g_rdt->cap_mon == NULL) { ERROR( RDT_PLUGIN ": Monitoring capability not detected. Nothing to do for the plugin."); goto rdt_preinit_error2; } /* Reset pqos monitoring groups registers */ pqos_mon_reset(); return (0); rdt_preinit_error2: pqos_fini(); rdt_preinit_error1: sfree(g_rdt); return (-1); } static int rdt_config(oconfig_item_t *ci) { int ret = 0; ret = rdt_preinit(); if (ret != 0) { g_state = CONFIGURATION_ERROR; /* if we return -1 at this point collectd reports a failure in configuration and aborts */ goto exit; } 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) { g_state = CONFIGURATION_ERROR; /* if we return -1 at this point collectd reports a failure in configuration and aborts */ goto exit; } #if COLLECT_DEBUG rdt_dump_cgroups(); #endif /* COLLECT_DEBUG */ } else { ERROR(RDT_PLUGIN ": Unknown configuration parameter \"%s\".", child->key); } } exit: return (0); }