#include #include #include #include #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; if (sysfs__read_int("devices/system/cpu/smt/active", &cached_result) > 0) goto done; 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 (sysfs__read_str(fn, &str, &strlen) < 0) { 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; done: cached = true; } return cached_result; }