Run clang-format after removing ssnprintf
[collectd.git] / src / turbostat.c
index 1e3578a..1049fb2 100644 (file)
 static _Bool aperf_mperf_unstable;
 
 /*
+ * If set, use kernel logical core numbering for all "per core" metrics.
+ */
+static _Bool config_lcn;
+
+/*
  * Bitmask of the list of core C states supported by the processor.
  * Currently supported C-states (by this plugin): 3, 6, 7
  */
@@ -227,6 +232,7 @@ static const char *config_keys[] = {
     "PackageThermalManagement",
     "TCCActivationTemp",
     "RunningAveragePowerLimit",
+    "LogicalCoreNames",
 };
 static const int config_keys_num = STATIC_ARRAY_SIZE(config_keys);
 
@@ -260,7 +266,7 @@ open_msr(unsigned int cpu, _Bool multiple_read) {
     }
   }
 
-  ssnprintf(pathname, sizeof(pathname), "/dev/cpu/%d/msr", cpu);
+  snprintf(pathname, sizeof(pathname), "/dev/cpu/%d/msr", cpu);
   fd = open(pathname, O_RDONLY);
   if (fd < 0) {
     ERROR("turbostat plugin: failed to open %s", pathname);
@@ -519,12 +525,9 @@ delta_thread(struct thread_data *delta, const struct thread_data *new,
 static void turbostat_submit(const char *plugin_instance, const char *type,
                              const char *type_instance, gauge_t value) {
   value_list_t vl = VALUE_LIST_INIT;
-  value_t v;
 
-  v.gauge = value;
-  vl.values = &v;
+  vl.values = &(value_t){.gauge = value};
   vl.values_len = 1;
-  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
   sstrncpy(vl.plugin, PLUGIN_NAME, sizeof(vl.plugin));
   if (plugin_instance != NULL)
     sstrncpy(vl.plugin_instance, plugin_instance, sizeof(vl.plugin_instance));
@@ -550,7 +553,10 @@ static int submit_counters(struct thread_data *t, struct core_data *c,
 
   interval_float = CDTIME_T_TO_DOUBLE(time_delta);
 
-  ssnprintf(name, sizeof(name), "cpu%02d", t->cpu_id);
+  DEBUG("turbostat plugin: submit stats for cpu: %d, core: %d, pkg: %d",
+        t->cpu_id, c->core_id, p->package_id);
+
+  snprintf(name, sizeof(name), "cpu%02d", t->cpu_id);
 
   if (!aperf_mperf_unstable)
     turbostat_submit(name, "percent", "c0", 100.0 * t->mperf / t->tsc);
@@ -561,9 +567,9 @@ static int submit_counters(struct thread_data *t, struct core_data *c,
                    1.0 / 1000000 * t->aperf / interval_float);
 
   if ((!aperf_mperf_unstable) || (!(t->aperf > t->tsc || t->mperf > t->tsc)))
-    turbostat_submit(name, "frequency", "busy", 1.0 * t->tsc / 1000000 *
-                                                    t->aperf / t->mperf /
-                                                    interval_float);
+    turbostat_submit(name, "frequency", "busy",
+                     1.0 * t->tsc / 1000000 * t->aperf / t->mperf /
+                         interval_float);
 
   /* Sanity check (should stay stable) */
   turbostat_submit(name, "gauge", "TSC",
@@ -577,7 +583,10 @@ static int submit_counters(struct thread_data *t, struct core_data *c,
   if (!(t->flags & CPU_IS_FIRST_THREAD_IN_CORE))
     goto done;
 
-  ssnprintf(name, sizeof(name), "core%02d", c->core_id);
+  /* If not using logical core numbering, set core id */
+  if (!config_lcn) {
+    snprintf(name, sizeof(name), "core%02d", c->core_id);
+  }
 
   if (do_core_cstate & (1 << 3))
     turbostat_submit(name, "percent", "c3", 100.0 * c->c3 / t->tsc);
@@ -593,7 +602,7 @@ static int submit_counters(struct thread_data *t, struct core_data *c,
   if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE))
     goto done;
 
-  ssnprintf(name, sizeof(name), "pkg%02d", p->package_id);
+  snprintf(name, sizeof(name), "pkg%02d", p->package_id);
 
   if (do_ptm)
     turbostat_submit(name, "temperature", NULL, p->pkg_temp_c);
@@ -1029,8 +1038,7 @@ static int __attribute__((format(printf, 1, 2)))
 parse_int_file(const char *fmt, ...) {
   va_list args;
   char path[PATH_MAX];
-  FILE *filep;
-  int len, value;
+  int len;
 
   va_start(args, fmt);
   len = vsnprintf(path, sizeof(path), fmt, args);
@@ -1040,18 +1048,13 @@ parse_int_file(const char *fmt, ...) {
     return -1;
   }
 
-  filep = fopen(path, "r");
-  if (!filep) {
-    ERROR("turbostat plugin: Failed to open '%s'", path);
-    return -1;
-  }
-  if (fscanf(filep, "%d", &value) != 1) {
-    ERROR("turbostat plugin: Failed to parse number from '%s'", path);
-    fclose(filep);
+  value_t v;
+  if (parse_value_file(path, &v, DS_TYPE_DERIVE) != 0) {
+    ERROR("turbostat plugin: Parsing \"%s\" failed.", path);
     return -1;
   }
-  fclose(filep);
-  return value;
+
+  return (int)v.derive;
 }
 
 static int get_threads_on_core(unsigned int cpu) {
@@ -1061,8 +1064,8 @@ static int get_threads_on_core(unsigned int cpu) {
   int matches;
   char character;
 
-  ssnprintf(path, sizeof(path),
-            "/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list", cpu);
+  snprintf(path, sizeof(path),
+           "/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list", cpu);
   filep = fopen(path, "r");
   if (!filep) {
     ERROR("turbostat plugin: Failed to open '%s'", path);
@@ -1115,7 +1118,7 @@ for_all_proc_cpus(int(func)(unsigned int)) {
     retval = func(cpu_num);
     if (retval) {
       fclose(fp);
-      return (retval);
+      return retval;
     }
   }
   fclose(fp);
@@ -1564,6 +1567,8 @@ static int turbostat_config(const char *key, const char *value) {
   } else if (strcasecmp("PackageThermalManagement", key) == 0) {
     config_ptm = IS_TRUE(value);
     apply_config_ptm = 1;
+  } else if (strcasecmp("LogicalCoreNames", key) == 0) {
+    config_lcn = IS_TRUE(value);
   } else if (strcasecmp("RunningAveragePowerLimit", key) == 0) {
     tmp_val = strtoul(value, &end, 0);
     if (*end != '\0' || tmp_val > UINT_MAX) {