#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/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; }