]>
Commit | Line | Data |
---|---|---|
de5077c4 AK |
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, | |
0ccdb840 KL |
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 | } | |
de5077c4 AK |
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 | } |