xref: /openbmc/linux/tools/perf/util/smt.c (revision c4a7b9b5)
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