* Ported to collectd by Vincent Brillault <git@lerya.net>
*/
+/*
+ * _GNU_SOURCE is required because of the following functions:
+ * - CPU_ISSET_S
+ * - CPU_ZERO_S
+ * - CPU_SET_S
+ * - CPU_FREE
+ * - CPU_ALLOC
+ * - CPU_ALLOC_SIZE
+ */
#define _GNU_SOURCE
+
#include <asm/msr-index.h>
#include <stdarg.h>
#include <stdio.h>
#define PLUGIN_NAME "turbostat"
static const char *proc_stat = "/proc/stat";
-static unsigned int interval_sec = 5; /* set with -i interval_sec */
static unsigned int skip_c0;
static unsigned int skip_c1;
static unsigned int do_nhm_cstates;
ERR_NOT_ROOT,
};
-#define __must_check __attribute__((warn_unused_result))
-
static int setup_all_buffers(void);
static int
* skip non-present cpus
*/
-static int __must_check
+static int __attribute__((warn_unused_result))
for_all_cpus(int (func)(struct thread_data *, struct core_data *, struct pkg_data *),
struct thread_data *thread_base, struct core_data *core_base, struct pkg_data *pkg_base)
{
return 0;
}
-static int __must_check
+static int __attribute__((warn_unused_result))
cpu_migrate(int cpu)
{
CPU_ZERO_S(cpu_affinity_setsize, cpu_affinity_set);
return 0;
}
-static int __must_check
+static int __attribute__((warn_unused_result))
get_msr(int cpu, off_t offset, unsigned long long *msr)
{
ssize_t retval;
char pathname[32];
int fd;
- sprintf(pathname, "/dev/cpu/%d/msr", cpu);
+ ssnprintf(pathname, 32, "/dev/cpu/%d/msr", cpu);
fd = open(pathname, O_RDONLY);
if (fd < 0)
return -1;
/*
* old = new - old
*/
-static int __must_check
+static int __attribute__((warn_unused_result))
delta_thread(struct thread_data *new, struct thread_data *old,
struct core_data *core_delta)
{
return 0;
}
-static int __must_check
+static int __attribute__((warn_unused_result))
delta_cpu(struct thread_data *t, struct core_data *c,
struct pkg_data *p, struct thread_data *t2,
struct core_data *c2, struct pkg_data *p2)
* migrate to cpu
* acquire and record local counters for that cpu
*/
-static int __must_check
+static int __attribute__((warn_unused_result))
get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
{
int cpu = t->cpu_id;
/*
* Parse a file containing a single int.
*/
-static int
+static int __attribute__ ((format(printf,1,2)))
parse_int_file(const char *fmt, ...)
{
va_list args;
int matches;
char character;
- sprintf(path, "/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list", cpu);
+ ssnprintf(path, 80, "/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list", cpu);
filep = fopen(path, "r");
if (!filep) {
ERROR("%s: open failed", path);
*/
-static int __must_check
+static int __attribute__((warn_unused_result))
for_all_cpus_2(int (func)(struct thread_data *, struct core_data *,
struct pkg_data *, struct thread_data *, struct core_data *,
struct pkg_data *), struct thread_data *thread_base,
* run func(cpu) on every cpu in /proc/stat
* return max_cpu number
*/
-static int __must_check
+static int __attribute__((warn_unused_result))
for_all_proc_cpus(int (func)(int))
{
FILE *fp;
return 0;
}
-static int __must_check
+static int __attribute__((warn_unused_result))
check_dev_msr()
{
struct stat sb;
return 0;
}
-static int __must_check
+static int __attribute__((warn_unused_result))
check_super_user()
{
if (getuid() != 0) {
* below this value, including the Digital Thermal Sensor (DTS),
* Package Thermal Management Sensor (PTM), and thermal event thresholds.
*/
-static int __must_check
+static int __attribute__((warn_unused_result))
set_temperature_target(struct thread_data *t, struct core_data *c, struct pkg_data *p)
{
unsigned long long msr;
return 0;
}
-static int __must_check
+static int __attribute__((warn_unused_result))
check_cpuid()
{
unsigned int eax, ebx, ecx, edx, max_level;
-static int __must_check
+static int __attribute__((warn_unused_result))
topology_probe()
{
int i;
turbostat_init(void)
{
int ret;
- struct timespec ts;
DO_OR_GOTO_ERR(check_cpuid());
DO_OR_GOTO_ERR(check_dev_msr());
DO_OR_GOTO_ERR(setup_all_buffers());
DO_OR_GOTO_ERR(for_all_cpus(set_temperature_target, EVEN_COUNTERS));
- ts.tv_sec = interval_sec;
- ts.tv_nsec = 0;
-
- plugin_register_complex_read(NULL, PLUGIN_NAME, turbostat_read, &ts, NULL);
+ plugin_register_complex_read(NULL, PLUGIN_NAME, turbostat_read, NULL, NULL);
return 0;
err:
return ret;
}
-static const char *config_keys[] =
-{
- "Interval",
-};
-static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
-
-static int
-turbostat_config(const char *key, const char *value)
-{
- if (strcasecmp("Interval", key) == 0)
- interval_sec = atoi(value);
- else
- return -1;
- return 0;
-}
-
void module_register(void);
void module_register(void)
{
plugin_register_init(PLUGIN_NAME, turbostat_init);
- plugin_register_config(PLUGIN_NAME, turbostat_config, config_keys, config_keys_num);
}