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