Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf tools: Add utility function to detect SMT status

Add an smt_on() function to return if SMT is enabled or disabled. Used
in the next patch.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20170811232634.30465-7-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Andi Kleen and committed by
Arnaldo Carvalho de Melo
de5077c4 77d0871c

+51
+1
tools/perf/util/Build
··· 22 22 libperf-y += libstring.o 23 23 libperf-y += bitmap.o 24 24 libperf-y += hweight.o 25 + libperf-y += smt.o 25 26 libperf-y += quote.o 26 27 libperf-y += strbuf.o 27 28 libperf-y += string.o
+44
tools/perf/util/smt.c
··· 1 + #include <stdio.h> 2 + #include <stdlib.h> 3 + #include <unistd.h> 4 + #include <linux/bitops.h> 5 + #include "api/fs/fs.h" 6 + #include "smt.h" 7 + 8 + int smt_on(void) 9 + { 10 + static bool cached; 11 + static int cached_result; 12 + int cpu; 13 + int ncpu; 14 + 15 + if (cached) 16 + return cached_result; 17 + 18 + ncpu = sysconf(_SC_NPROCESSORS_CONF); 19 + for (cpu = 0; cpu < ncpu; cpu++) { 20 + unsigned long long siblings; 21 + char *str; 22 + size_t strlen; 23 + char fn[256]; 24 + 25 + snprintf(fn, sizeof fn, 26 + "devices/system/cpu/cpu%d/topology/thread_siblings", 27 + cpu); 28 + if (sysfs__read_str(fn, &str, &strlen) < 0) 29 + continue; 30 + /* Entry is hex, but does not have 0x, so need custom parser */ 31 + siblings = strtoull(str, NULL, 16); 32 + free(str); 33 + if (hweight64(siblings) > 1) { 34 + cached_result = 1; 35 + cached = true; 36 + break; 37 + } 38 + } 39 + if (!cached) { 40 + cached_result = 0; 41 + cached = true; 42 + } 43 + return cached_result; 44 + }
+6
tools/perf/util/smt.h
··· 1 + #ifndef SMT_H 2 + #define SMT_H 1 3 + 4 + int smt_on(void); 5 + 6 + #endif