1 // SPDX-License-Identifier: GPL-2.0-only !! 1 #include <stdio.h> 2 #include <string.h> !! 2 #include <stdlib.h> >> 3 #include <unistd.h> >> 4 #include <linux/bitops.h> 3 #include "api/fs/fs.h" 5 #include "api/fs/fs.h" 4 #include "cputopo.h" << 5 #include "smt.h" 6 #include "smt.h" 6 7 7 bool smt_on(void) !! 8 int smt_on(void) 8 { 9 { 9 static bool cached; 10 static bool cached; 10 static bool cached_result; !! 11 static int cached_result; 11 int fs_value; !! 12 int cpu; >> 13 int ncpu; 12 14 13 if (cached) 15 if (cached) 14 return cached_result; 16 return cached_result; 15 17 16 if (sysfs__read_int("devices/system/cp !! 18 if (sysfs__read_int("devices/system/cpu/smt/active", &cached_result) >= 0) 17 cached_result = (fs_value == 1 !! 19 goto done; 18 else << 19 cached_result = cpu_topology__ << 20 20 21 cached = true; !! 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, >> 29 "devices/system/cpu/cpu%d/topology/core_cpus", cpu); >> 30 if (sysfs__read_str(fn, &str, &strlen) < 0) { >> 31 snprintf(fn, sizeof fn, >> 32 "devices/system/cpu/cpu%d/topology/thread_siblings", >> 33 cpu); >> 34 if (sysfs__read_str(fn, &str, &strlen) < 0) >> 35 continue; >> 36 } >> 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; >> 48 done: >> 49 cached = true; >> 50 } 22 return cached_result; 51 return cached_result; 23 } << 24 << 25 bool core_wide(bool system_wide, const char *u << 26 { << 27 /* If not everything running on a core << 28 if (!system_wide) << 29 return false; << 30 << 31 /* Cheap case that SMT is disabled and << 32 if (!smt_on()) << 33 return true; << 34 << 35 return cpu_topology__core_wide(online_ << 36 } 52 } 37 53
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.