blob: 3b791ef2cd502222ff01a2edb0605a8c74a46bf7 [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/bitops.h>
#include "api/fs/fs.h"
#include "smt.h"
int smt_on(void)
{
static bool cached;
static int cached_result;
int cpu;
int ncpu;
if (cached)
return cached_result;
ncpu = sysconf(_SC_NPROCESSORS_CONF);
for (cpu = 0; cpu < ncpu; cpu++) {
unsigned long long siblings;
char *str;
size_t strlen;
char fn[256];
snprintf(fn, sizeof fn,
"devices/system/cpu/cpu%d/topology/core_cpus", cpu);
if (access(fn, F_OK) == -1) {
snprintf(fn, sizeof fn,
"devices/system/cpu/cpu%d/topology/thread_siblings",
cpu);
}
if (sysfs__read_str(fn, &str, &strlen) < 0)
continue;
/* Entry is hex, but does not have 0x, so need custom parser */
siblings = strtoull(str, NULL, 16);
free(str);
if (hweight64(siblings) > 1) {
cached_result = 1;
cached = true;
break;
}
}
if (!cached) {
cached_result = 0;
cached = true;
}
return cached_result;
}