1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <linux/bitops.h> 5 #include "api/fs/fs.h" 6 #include "smt.h" 7 8 int smt_on(void) 9 { 10 static bool cached; 11 static int cached_result; 12 int cpu; 13 int ncpu; 14 15 if (cached) 16 return cached_result; 17 18 if (sysfs__read_int("devices/system/cpu/smt/active", &cached_result) > 0) 19 goto done; 20 21 ncpu = sysconf(_SC_NPROCESSORS_CONF); 22 for (cpu = 0; cpu < ncpu; cpu++) { 23 unsigned long long siblings; 24 char *str; 25 size_t strlen; 26 char fn[256]; 27 28 snprintf(fn, sizeof fn, 29 "devices/system/cpu/cpu%d/topology/core_cpus", cpu); 30 if (sysfs__read_str(fn, &str, &strlen) < 0) { 31 snprintf(fn, sizeof fn, 32 "devices/system/cpu/cpu%d/topology/thread_siblings", 33 cpu); 34 if (sysfs__read_str(fn, &str, &strlen) < 0) 35 continue; 36 } 37 /* Entry is hex, but does not have 0x, so need custom parser */ 38 siblings = strtoull(str, NULL, 16); 39 free(str); 40 if (hweight64(siblings) > 1) { 41 cached_result = 1; 42 cached = true; 43 break; 44 } 45 } 46 if (!cached) { 47 cached_result = 0; 48 done: 49 cached = true; 50 } 51 return cached_result; 52 } 53