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 ncpu = sysconf(_SC_NPROCESSORS_CONF); 19 for (cpu = 0; cpu < ncpu; cpu++) { 20 unsigned long long siblings; 21 char *str; 22 size_t strlen; 23 char fn[256]; 24 25 snprintf(fn, sizeof fn, 26 "devices/system/cpu/cpu%d/topology/core_cpus", cpu); 27 if (access(fn, F_OK) == -1) { 28 snprintf(fn, sizeof fn, 29 "devices/system/cpu/cpu%d/topology/thread_siblings", 30 cpu); 31 } 32 if (sysfs__read_str(fn, &str, &strlen) < 0) 33 continue; 34 /* Entry is hex, but does not have 0x, so need custom parser */ 35 siblings = strtoull(str, NULL, 16); 36 free(str); 37 if (hweight64(siblings) > 1) { 38 cached_result = 1; 39 cached = true; 40 break; 41 } 42 } 43 if (!cached) { 44 cached_result = 0; 45 cached = true; 46 } 47 return cached_result; 48 } 49