Turbostat: extend the configuration options
[collectd.git] / src / turbostat.c
index 4cd1e50..5ee4518 100644 (file)
@@ -81,17 +81,23 @@ static _Bool aperf_mperf_unstable;
  * Currently supported C-states (by this plugin): 3, 6, 7
  */
 static unsigned int do_core_cstate;
+static unsigned int config_core_cstate;
+static _Bool apply_config_core_cstate;
 
 /*
  * Bitmask of the list of pacages C states supported by the processor.
  * Currently supported C-states (by this plugin): 2, 3, 6, 7, 8, 9, 10
  */
 static unsigned int do_pkg_cstate;
+static unsigned int config_pkg_cstate;
+static _Bool apply_config_pkg_cstate;
 
 /*
  * Boolean indicating if the processor supports 'I/O System-Management Interrupt counter'
  */
 static _Bool do_smi;
+static _Bool config_smi;
+static _Bool apply_config_smi;
 
 /*
  * Boolean indicating if the processor supports 'Digital temperature sensor'
@@ -102,6 +108,8 @@ static _Bool do_smi;
  *  - Temperatures above the tcc_activation_temp are not recorded
  */
 static _Bool do_dts;
+static _Bool config_dts;
+static _Bool apply_config_dts;
 
 /*
  * Boolean indicating if the processor supports 'Package thermal management'
@@ -112,6 +120,8 @@ static _Bool do_dts;
  *  - Temperatures above the tcc_activation_temp are not recorded
  */
 static _Bool do_ptm;
+static _Bool config_ptm;
+static _Bool apply_config_ptm;
 
 /*
  * Thermal Control Circuit Activation Temperature as configured by the user.
@@ -121,31 +131,22 @@ static _Bool do_ptm;
 static unsigned int tcc_activation_temp;
 
 static unsigned int do_rapl;
+static unsigned int config_rapl;
+static _Bool apply_config_rapl;
 static double rapl_energy_units;
 
 #define RAPL_PKG               (1 << 0)
                                        /* 0x610 MSR_PKG_POWER_LIMIT */
                                        /* 0x611 MSR_PKG_ENERGY_STATUS */
-#define RAPL_PKG_PERF_STATUS   (1 << 1)
-                                       /* 0x613 MSR_PKG_PERF_STATUS */
-#define RAPL_PKG_POWER_INFO    (1 << 2)
-                                       /* 0x614 MSR_PKG_POWER_INFO */
-
-#define RAPL_DRAM              (1 << 3)
+#define RAPL_DRAM              (1 << 1)
                                        /* 0x618 MSR_DRAM_POWER_LIMIT */
                                        /* 0x619 MSR_DRAM_ENERGY_STATUS */
                                        /* 0x61c MSR_DRAM_POWER_INFO */
-#define RAPL_DRAM_PERF_STATUS  (1 << 4)
-                                       /* 0x61b MSR_DRAM_PERF_STATUS */
-
-#define RAPL_CORES             (1 << 5)
+#define RAPL_CORES             (1 << 2)
                                        /* 0x638 MSR_PP0_POWER_LIMIT */
                                        /* 0x639 MSR_PP0_ENERGY_STATUS */
-#define RAPL_CORE_POLICY       (1 << 6)
-                                       /* 0x63a MSR_PP0_POLICY */
-
 
-#define RAPL_GFX               (1 << 7)
+#define RAPL_GFX               (1 << 3)
                                        /* 0x640 MSR_PP1_POWER_LIMIT */
                                        /* 0x641 MSR_PP1_ENERGY_STATUS */
                                        /* 0x642 MSR_PP1_POLICY */
@@ -187,8 +188,6 @@ static struct pkg_data {
        unsigned int energy_dram;       /* MSR_DRAM_ENERGY_STATUS */
        unsigned int energy_cores;      /* MSR_PP0_ENERGY_STATUS */
        unsigned int energy_gfx;        /* MSR_PP1_ENERGY_STATUS */
-       unsigned int rapl_pkg_perf_status;      /* MSR_PKG_PERF_STATUS */
-       unsigned int rapl_dram_perf_status;     /* MSR_DRAM_PERF_STATUS */
        unsigned int tcc_activation_temp;
        unsigned int pkg_temp_c;
 } *package_delta, *package_even, *package_odd;
@@ -231,7 +230,13 @@ static cdtime_t time_even, time_odd, time_delta;
 
 static const char *config_keys[] =
 {
+       "CoreCstates",
+       "PackageCstates",
+       "SystemManagementInterrupt",
+       "DigitalTemperatureSensor",
+       "PackageThermalManagement",
        "TCCActivationTemp",
+       "RunningAveragePowerLimit",
 };
 static const int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
 
@@ -409,14 +414,6 @@ do {                                                                       \
                READ_MSR(MSR_PP1_ENERGY_STATUS, &msr);
                p->energy_gfx = msr & 0xFFFFFFFF;
        }
-       if (do_rapl & RAPL_PKG_PERF_STATUS) {
-               READ_MSR(MSR_PKG_PERF_STATUS, &msr);
-               p->rapl_pkg_perf_status = msr & 0xFFFFFFFF;
-       }
-       if (do_rapl & RAPL_DRAM_PERF_STATUS) {
-               READ_MSR(MSR_DRAM_PERF_STATUS, &msr);
-               p->rapl_dram_perf_status = msr & 0xFFFFFFFF;
-       }
        if (do_ptm) {
                READ_MSR(MSR_IA32_PACKAGE_THERM_STATUS, &msr);
                p->pkg_temp_c = p->tcc_activation_temp - ((msr >> 16) & 0x7F);
@@ -462,8 +459,6 @@ delta_package(struct pkg_data *delta, const struct pkg_data *new, const struct p
        DELTA_WRAP32(delta->energy_cores, new->energy_cores, old->energy_cores);
        DELTA_WRAP32(delta->energy_gfx, new->energy_gfx, old->energy_gfx);
        DELTA_WRAP32(delta->energy_dram, new->energy_dram, old->energy_dram);
-       DELTA_WRAP32(delta->rapl_pkg_perf_status, new->rapl_pkg_perf_status, old->rapl_pkg_perf_status);
-       DELTA_WRAP32(delta->rapl_dram_perf_status, new->rapl_dram_perf_status, old->rapl_dram_perf_status);
 }
 
 /*
@@ -980,16 +975,16 @@ probe_cpu()
                case 0x45: /* HSW */
                case 0x46: /* HSW */
                case 0x3D: /* BDW */
-                       do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_PKG_POWER_INFO | RAPL_GFX;
+                       do_rapl = RAPL_PKG | RAPL_CORES | RAPL_GFX;
                        break;
                case 0x3F: /* HSX */
                case 0x4F: /* BDX */
                case 0x56: /* BDX-DE */
-                       do_rapl = RAPL_PKG | RAPL_PKG_POWER_INFO | RAPL_PKG_PERF_STATUS | RAPL_DRAM | RAPL_DRAM_PERF_STATUS;
+                       do_rapl = RAPL_PKG | RAPL_DRAM ;
                        break;
                case 0x2D: /* SNB Xeon */
                case 0x3E: /* IVB Xeon */
-                       do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_PKG_POWER_INFO | RAPL_PKG_PERF_STATUS | RAPL_DRAM | RAPL_DRAM_PERF_STATUS;
+                       do_rapl = RAPL_PKG | RAPL_CORES | RAPL_DRAM;
                        break;
                case 0x37: /* BYT */
                case 0x4D: /* AVN */
@@ -1004,6 +999,20 @@ probe_cpu()
                return -1;
        }
 
+       /* Override detected values with configuration */
+       if (apply_config_core_cstate)
+               do_core_cstate = config_core_cstate;
+       if (apply_config_pkg_cstate)
+               do_pkg_cstate = config_pkg_cstate;
+       if (apply_config_smi)
+               do_smi = config_smi;
+       if (apply_config_dts)
+               do_dts = config_dts;
+       if (apply_config_ptm)
+               do_ptm = config_ptm;
+       if (apply_config_rapl)
+               do_rapl = config_rapl;
+
        if (do_rapl) {
                unsigned long long msr;
                if (get_msr(0, MSR_RAPL_POWER_UNIT, &msr))
@@ -1560,7 +1569,43 @@ turbostat_config(const char *key, const char *value)
        long unsigned int tmp_val;
        char *end;
 
-       if (strcasecmp("TCCActivationTemp", key) == 0) {
+       if (strcasecmp("CoreCstates", key) == 0) {
+               tmp_val = strtoul(value, &end, 0);
+               if (*end != '\0' || tmp_val > UINT_MAX) {
+                       ERROR("Turbostat plugin: Invalid CoreCstates '%s'",
+                             value);
+                       return -1;
+               }
+               config_core_cstate = (unsigned int) tmp_val;
+               apply_config_core_cstate = 1;
+       } else if (strcasecmp("PackageCstates", key) == 0) {
+               tmp_val = strtoul(value, &end, 0);
+               if (*end != '\0' || tmp_val > UINT_MAX) {
+                       ERROR("Turbostat plugin: Invalid PackageCstates '%s'",
+                             value);
+                       return -1;
+               }
+               config_pkg_cstate = (unsigned int) tmp_val;
+               apply_config_pkg_cstate = 1;
+       } else if (strcasecmp("SystemManagementInterrupt", key) == 0) {
+               config_smi = IS_TRUE(value);
+               apply_config_smi = 1;
+       } else if (strcasecmp("DigitalTemperatureSensor", key) == 0) {
+               config_dts = IS_TRUE(value);
+               apply_config_dts = 1;
+       } else if (strcasecmp("PackageThermalManagement", key) == 0) {
+               config_ptm = IS_TRUE(value);
+               apply_config_ptm = 1;
+       } else if (strcasecmp("RunningAveragePowerLimit", key) == 0) {
+               tmp_val = strtoul(value, &end, 0);
+               if (*end != '\0' || tmp_val > UINT_MAX) {
+                       ERROR("Turbostat plugin: Invalid RunningAveragePowerLimit '%s'",
+                             value);
+                       return -1;
+               }
+               config_rapl = (unsigned int) tmp_val;
+               apply_config_rapl = 1;
+       } else if (strcasecmp("TCCActivationTemp", key) == 0) {
                tmp_val = strtoul(value, &end, 0);
                if (*end != '\0' || tmp_val > UINT_MAX) {
                        ERROR("Turbostat plugin: Invalid TCCActivationTemp '%s'",