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 ncpu = sysconf(_SC_NPROCESSORS_CONF); 17 cached_result = (fs_value == 1 !! 19 for (cpu = 0; cpu < ncpu; cpu++) { 18 else !! 20 unsigned long long siblings; 19 cached_result = cpu_topology__ !! 21 char *str; 20 !! 22 size_t strlen; 21 cached = true; !! 23 char fn[256]; >> 24 >> 25 snprintf(fn, sizeof fn, >> 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 } >> 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 } 22 return cached_result; 47 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 } 48 } 37 49
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.