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