summaryrefslogtreecommitdiffstats
path: root/tools/perf/util/smt.c
diff options
context:
space:
mode:
authorMark Brown2017-09-19 15:12:47 +0200
committerMark Brown2017-09-19 15:12:47 +0200
commite9331ee9b164d58b4dd0abc882ba7e23d2f404b3 (patch)
tree903d078e53a59ed65708193f2486ad0b9a8109d8 /tools/perf/util/smt.c
parentASoC: rockchip: Add dapm route for HDMI (diff)
parentLinux 4.14-rc1 (diff)
downloadkernel-qcow2-linux-e9331ee9b164d58b4dd0abc882ba7e23d2f404b3.tar.gz
kernel-qcow2-linux-e9331ee9b164d58b4dd0abc882ba7e23d2f404b3.tar.xz
kernel-qcow2-linux-e9331ee9b164d58b4dd0abc882ba7e23d2f404b3.zip
Merge tag 'v4.14-rc1' into asoc-rockchip
Linux 4.14-rc1
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;
+}