diff options
Diffstat (limited to 'tools/perf/util/smt.c')
| -rw-r--r-- | tools/perf/util/smt.c | 44 | 
1 files changed, 44 insertions, 0 deletions
diff --git a/tools/perf/util/smt.c b/tools/perf/util/smt.c new file mode 100644 index 000000000000..453f6f6f29f3 --- /dev/null +++ b/tools/perf/util/smt.c @@ -0,0 +1,44 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <linux/bitops.h> +#include "api/fs/fs.h" +#include "smt.h" + +int smt_on(void) +{ +	static bool cached; +	static int cached_result; +	int cpu; +	int ncpu; + +	if (cached) +		return cached_result; + +	ncpu = sysconf(_SC_NPROCESSORS_CONF); +	for (cpu = 0; cpu < ncpu; cpu++) { +		unsigned long long siblings; +		char *str; +		size_t strlen; +		char fn[256]; + +		snprintf(fn, sizeof fn, +			"devices/system/cpu/cpu%d/topology/thread_siblings", +			cpu); +		if (sysfs__read_str(fn, &str, &strlen) < 0) +			continue; +		/* Entry is hex, but does not have 0x, so need custom parser */ +		siblings = strtoull(str, NULL, 16); +		free(str); +		if (hweight64(siblings) > 1) { +			cached_result = 1; +			cached = true; +			break; +		} +	} +	if (!cached) { +		cached_result = 0; +		cached = true; +	} +	return cached_result; +}  | 
