* turbostat -- Log CPU frequency and C-state residency
* on modern Intel turbo-capable processors for collectd.
*
- * Based on the kernel tools by:
+ * Based on the 'turbostat' tool of the Linux kernel, found at
+ * linux/tools/power/x86/turbostat/turbostat.c:
+ * ----
* Copyright (c) 2013 Intel Corporation.
* Len Brown <len.brown@intel.com>
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- *
+ * ----
* Ported to collectd by Vincent Brillault <git@lerya.net>
*/
#define _GNU_SOURCE
-#include "msr-index.h"
+#include <asm/msr-index.h>
#include <stdarg.h>
#include <stdio.h>
-#include <stdbool.h>
#include <err.h>
#include <unistd.h>
#include <sys/types.h>
#define ODD_COUNTERS thread_odd, core_odd, package_odd
#define EVEN_COUNTERS thread_even, core_even, package_even
-static bool is_even = true;
+static _Bool is_even = 1;
-static bool allocated = false;
-static bool initialized = false;
+static _Bool allocated = 0;
+static _Bool initialized = 0;
#define GET_THREAD(thread_base, thread_no, core_no, pkg_no) \
(thread_base + (pkg_no) * topo.num_cores_per_pkg * \
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;
static void
free_all_buffers(void)
{
- allocated = false;
- initialized = false;
+ allocated = 0;
+ initialized = 0;
CPU_FREE(cpu_present_set);
cpu_present_set = NULL;
/*
* 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;
if ((ret = for_all_cpus(get_counters, EVEN_COUNTERS)) < 0)
return ret;
gettimeofday(&tv_even, (struct timezone *)NULL);
- is_even = true;
- initialized = true;
+ is_even = 1;
+ initialized = 1;
return 0;
}
if ((ret = for_all_cpus(get_counters, ODD_COUNTERS)) < 0)
return ret;
gettimeofday(&tv_odd, (struct timezone *)NULL);
- is_even = false;
+ is_even = 0;
timersub(&tv_odd, &tv_even, &tv_delta);
if ((ret = for_all_cpus_2(delta_cpu, ODD_COUNTERS, EVEN_COUNTERS)) < 0)
return ret;
if ((ret = for_all_cpus(get_counters, EVEN_COUNTERS)) < 0)
return ret;
gettimeofday(&tv_even, (struct timezone *)NULL);
- is_even = true;
+ is_even = 1;
timersub(&tv_even, &tv_odd, &tv_delta);
if ((ret = for_all_cpus_2(delta_cpu, EVEN_COUNTERS, ODD_COUNTERS)) < 0)
return ret;
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;
DO_OR_GOTO_ERR(allocate_counters(&thread_odd, &core_odd, &package_odd));
DO_OR_GOTO_ERR(for_all_proc_cpus(initialize_counters));
- allocated = true;
+ allocated = 1;
return 0;
err:
free_all_buffers();