summaryrefslogtreecommitdiffstats
path: root/tools/perf/util/smt.c
diff options
context:
space:
mode:
authorAndi Kleen <ak@linux.intel.com>2017-08-11 16:26:22 -0700
committerArnaldo Carvalho de Melo <acme@redhat.com>2017-08-22 12:09:04 -0300
commitde5077c4e38f2a51f50d28bdd5e4a0f14b3d16ff (patch)
tree95de3aa45603112fa658a9b12f9e2e591bec57e9 /tools/perf/util/smt.c
parent77d0871c76bad1093a3d86870fe76dd1ad0ca397 (diff)
downloadlinux-de5077c4e38f2a51f50d28bdd5e4a0f14b3d16ff.tar.gz
linux-de5077c4e38f2a51f50d28bdd5e4a0f14b3d16ff.tar.xz
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>
Diffstat (limited to 'tools/perf/util/smt.c')
-rw-r--r--tools/perf/util/smt.c44
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;
+}