Andi Kleen | de5077c | 2017-08-11 16:26:22 -0700 | [diff] [blame] | 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 | |
Konstantin Khlebnikov | bb62948 | 2020-04-29 19:23:41 +0300 | [diff] [blame] | 18 | if (sysfs__read_int("devices/system/cpu/smt/active", &cached_result) > 0) |
| 19 | goto done; |
| 20 | |
Andi Kleen | de5077c | 2017-08-11 16:26:22 -0700 | [diff] [blame] | 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, |
Kan Liang | 0ccdb84 | 2019-06-04 15:50:44 -0700 | [diff] [blame] | 29 | "devices/system/cpu/cpu%d/topology/core_cpus", cpu); |
Konstantin Khlebnikov | 846de43 | 2020-04-29 19:19:47 +0300 | [diff] [blame] | 30 | if (sysfs__read_str(fn, &str, &strlen) < 0) { |
Kan Liang | 0ccdb84 | 2019-06-04 15:50:44 -0700 | [diff] [blame] | 31 | snprintf(fn, sizeof fn, |
| 32 | "devices/system/cpu/cpu%d/topology/thread_siblings", |
| 33 | cpu); |
Konstantin Khlebnikov | 846de43 | 2020-04-29 19:19:47 +0300 | [diff] [blame] | 34 | if (sysfs__read_str(fn, &str, &strlen) < 0) |
| 35 | continue; |
Kan Liang | 0ccdb84 | 2019-06-04 15:50:44 -0700 | [diff] [blame] | 36 | } |
Andi Kleen | de5077c | 2017-08-11 16:26:22 -0700 | [diff] [blame] | 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; |
Konstantin Khlebnikov | bb62948 | 2020-04-29 19:23:41 +0300 | [diff] [blame] | 48 | done: |
Andi Kleen | de5077c | 2017-08-11 16:26:22 -0700 | [diff] [blame] | 49 | cached = true; |
| 50 | } |
| 51 | return cached_result; |
| 52 | } |