Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [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 | |
Olivier Deprez | 157378f | 2022-04-04 15:47:50 +0200 | [diff] [blame^] | 18 | if (sysfs__read_int("devices/system/cpu/smt/active", &cached_result) >= 0) |
| 19 | goto done; |
| 20 | |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [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, |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame] | 29 | "devices/system/cpu/cpu%d/topology/core_cpus", cpu); |
Olivier Deprez | 157378f | 2022-04-04 15:47:50 +0200 | [diff] [blame^] | 30 | if (sysfs__read_str(fn, &str, &strlen) < 0) { |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame] | 31 | snprintf(fn, sizeof fn, |
| 32 | "devices/system/cpu/cpu%d/topology/thread_siblings", |
| 33 | cpu); |
Olivier Deprez | 157378f | 2022-04-04 15:47:50 +0200 | [diff] [blame^] | 34 | if (sysfs__read_str(fn, &str, &strlen) < 0) |
| 35 | continue; |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame] | 36 | } |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [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; |
Olivier Deprez | 157378f | 2022-04-04 15:47:50 +0200 | [diff] [blame^] | 48 | done: |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 49 | cached = true; |
| 50 | } |
| 51 | return cached_result; |
| 52 | } |