X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fturbostat.c;h=fc1b5dccc0dd3c4b2c2c848b1de1f9a57c95c156;hb=f14825411d74f8e01d68e3c22cfd541e0cad3aa5;hp=80650dff38539c781bf106a2cdcc462ceaaf3300;hpb=0beb06563c5681975fd4f743c547e15f4facb29f;p=collectd.git diff --git a/src/turbostat.c b/src/turbostat.c index 80650dff..fc1b5dcc 100644 --- a/src/turbostat.c +++ b/src/turbostat.c @@ -457,7 +457,7 @@ delta_core(struct core_data *delta, const struct core_data *new, const struct co */ static inline int __attribute__((warn_unused_result)) delta_thread(struct thread_data *delta, const struct thread_data *new, const struct thread_data *old, - const struct core_data *core_delta) + const struct core_data *cdelta) { delta->tsc = new->tsc - old->tsc; @@ -491,12 +491,12 @@ delta_thread(struct thread_data *delta, const struct thread_data *new, const str * it is possible for mperf's non-halted cycles + idle states * to exceed TSC's all cycles: show c1 = 0% in that case. */ - if ((delta->mperf + core_delta->c3 + core_delta->c6 + core_delta->c7) > delta->tsc) + if ((delta->mperf + cdelta->c3 + cdelta->c6 + cdelta->c7) > delta->tsc) delta->c1 = 0; else { /* normal case, derive c1 */ - delta->c1 = delta->tsc - delta->mperf - core_delta->c3 - - core_delta->c6 - core_delta->c7; + delta->c1 = delta->tsc - delta->mperf - cdelta->c3 + - cdelta->c6 - cdelta->c7; } if (delta->mperf == 0) { @@ -805,7 +805,7 @@ guess: * Identify the functionality of the CPU */ static int __attribute__((warn_unused_result)) -probe_cpu() +probe_cpu(void) { unsigned int eax, ebx, ecx, edx, max_level; unsigned int fms, family, model; @@ -1037,6 +1037,7 @@ parse_int_file(const char *fmt, ...) } if (fscanf(filep, "%d", &value) != 1) { ERROR("turbostat plugin: Failed to parse number from '%s'", path); + fclose(filep); return -1; } fclose(filep); @@ -1146,7 +1147,7 @@ allocate_cpu_set(cpu_set_t ** set, size_t * size) { * Build a local representation of the cpu distribution */ static int __attribute__((warn_unused_result)) -topology_probe() +topology_probe(void) { unsigned int i; int ret; @@ -1253,10 +1254,22 @@ allocate_counters(struct thread_data **threads, struct core_data **cores, struct unsigned int i; unsigned int total_threads, total_cores; + if ((topology.num_threads == 0) + || (topology.num_cores == 0) + || (topology.num_packages == 0)) + { + ERROR ("turbostat plugin: Invalid topology: %u threads, %u cores, %u packages", + topology.num_threads, topology.num_cores, topology.num_packages); + return -1; + } + total_threads = topology.num_threads * topology.num_cores * topology.num_packages; *threads = calloc(total_threads, sizeof(struct thread_data)); if (*threads == NULL) - goto err; + { + ERROR ("turbostat plugin: calloc failed"); + return -1; + } for (i = 0; i < total_threads; ++i) (*threads)[i].cpu_id = topology.max_cpu_id + 1; @@ -1264,21 +1277,22 @@ allocate_counters(struct thread_data **threads, struct core_data **cores, struct total_cores = topology.num_cores * topology.num_packages; *cores = calloc(total_cores, sizeof(struct core_data)); if (*cores == NULL) - goto err_clean_threads; + { + ERROR ("turbostat plugin: calloc failed"); + sfree (threads); + return -1; + } *packages = calloc(topology.num_packages, sizeof(struct pkg_data)); if (*packages == NULL) - goto err_clean_cores; + { + ERROR ("turbostat plugin: calloc failed"); + sfree (cores); + sfree (threads); + return -1; + } return 0; - -err_clean_cores: - free(*cores); -err_clean_threads: - free(*threads); -err: - ERROR("turbostat plugin: Failled to allocate memory for counters"); - return -1; } static void @@ -1502,7 +1516,7 @@ check_permissions(void) } if (euidaccess("/dev/cpu/0/msr", R_OK)) { - WARNING("turbostat plugin: Collectd cannot open" + WARNING("turbostat plugin: Collectd cannot open " "/dev/cpu/0/msr. If you don't want to run collectd as " "root, you need to change the ownership (chown) and " "permissions on /dev/cpu/*/msr to allow such access"); @@ -1525,8 +1539,8 @@ turbostat_init(void) int ret; if (stat("/dev/cpu/0/msr", &sb)) { - ERROR("turbostat plugin: Initialization failed: /dev/cpu/0/msr" - " does not exist while the CPU supports MSR. You may be " + ERROR("turbostat plugin: Initialization failed: /dev/cpu/0/msr " + "does not exist while the CPU supports MSR. You may be " "missing the corresponding kernel module, please try '# " "modprobe msr'"); return -1;