1 // SPDX-License-Identifier: GPL-2.0-only 2 #include <string.h> 3 #include "api/fs/fs.h" 4 #include "cputopo.h" 5 #include "smt.h" 6 7 bool smt_on(const struct cpu_topology *topology) 8 { 9 static bool cached; 10 static bool cached_result; 11 int fs_value; 12 13 if (cached) 14 return cached_result; 15 16 if (sysfs__read_int("devices/system/cpu/smt/active", &fs_value) >= 0) 17 cached_result = (fs_value == 1); 18 else 19 cached_result = cpu_topology__smt_on(topology); 20 21 cached = true; 22 return cached_result; 23 } 24 25 bool core_wide(bool system_wide, const char *user_requested_cpu_list, 26 const struct cpu_topology *topology) 27 { 28 /* If not everything running on a core is being recorded then we can't use core_wide. */ 29 if (!system_wide) 30 return false; 31 32 /* Cheap case that SMT is disabled and therefore we're inherently core_wide. */ 33 if (!smt_on(topology)) 34 return true; 35 36 return cpu_topology__core_wide(topology, user_requested_cpu_list); 37 } 38