162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci#include <string.h> 362306a36Sopenharmony_ci#include "api/fs/fs.h" 462306a36Sopenharmony_ci#include "cputopo.h" 562306a36Sopenharmony_ci#include "smt.h" 662306a36Sopenharmony_ci 762306a36Sopenharmony_cibool smt_on(void) 862306a36Sopenharmony_ci{ 962306a36Sopenharmony_ci static bool cached; 1062306a36Sopenharmony_ci static bool cached_result; 1162306a36Sopenharmony_ci int fs_value; 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci if (cached) 1462306a36Sopenharmony_ci return cached_result; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci if (sysfs__read_int("devices/system/cpu/smt/active", &fs_value) >= 0) 1762306a36Sopenharmony_ci cached_result = (fs_value == 1); 1862306a36Sopenharmony_ci else 1962306a36Sopenharmony_ci cached_result = cpu_topology__smt_on(online_topology()); 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci cached = true; 2262306a36Sopenharmony_ci return cached_result; 2362306a36Sopenharmony_ci} 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cibool core_wide(bool system_wide, const char *user_requested_cpu_list) 2662306a36Sopenharmony_ci{ 2762306a36Sopenharmony_ci /* If not everything running on a core is being recorded then we can't use core_wide. */ 2862306a36Sopenharmony_ci if (!system_wide) 2962306a36Sopenharmony_ci return false; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci /* Cheap case that SMT is disabled and therefore we're inherently core_wide. */ 3262306a36Sopenharmony_ci if (!smt_on()) 3362306a36Sopenharmony_ci return true; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci return cpu_topology__core_wide(online_topology(), user_requested_cpu_list); 3662306a36Sopenharmony_ci} 37