Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1479499 > unrolled thread
| Started by | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| First post | 2016-09-08 22:50 +0200 |
| Last post | 2016-09-09 07:50 +0200 |
| Articles | 11 — 2 participants |
Back to article view | Back to linux.kernel
[GIT PULL 00/12] perf/core improvements and fixes Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-09-08 22:50 +0200
[PATCH 07/12] tools lib api fs: Add hugetlbfs filesystem detector Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-09-08 22:50 +0200
[PATCH 02/12] perf top: Remove old kernel-only symbol filter Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-09-08 22:50 +0200
[PATCH 06/12] perf tools: Recognize hugetlb mapping as anon mapping Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-09-08 22:50 +0200
[PATCH 11/12] perf pmu: Support alternative sysfs cpumask Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-09-08 22:50 +0200
[PATCH 12/12] perf powerpc: Fix build-test failure Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-09-08 22:50 +0200
[PATCH 08/12] perf record: Mark MAP_HUGETLB when synthesizing mmap events Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-09-08 22:50 +0200
[PATCH 04/12] perf test vmlinux: Remove dead symbol_filter_t code Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-09-08 22:50 +0200
[PATCH 10/12] perf evlist: Only open events on CPUs an evsel permits Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-09-08 22:50 +0200
[PATCH 03/12] perf machine: Remove machine->symbol_filter and friends Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-09-08 22:50 +0200
Re: [GIT PULL 00/12] perf/core improvements and fixes Ingo Molnar <mingo@kernel.org> - 2016-09-09 07:50 +0200
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-09-08 22:50 +0200 |
| Subject | [GIT PULL 00/12] perf/core improvements and fixes |
| Message-ID | <sfeqJ-2at-3@gated-at.bofh.it> |
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit c0b172e5b6770048751b2c0a4fe44346c2080c5d:
Merge tag 'perf-core-for-mingo-20160901' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2016-09-05 15:15:49 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-20160908
for you to fetch changes up to 25b8592e912f085ce2ff736a2927584ddeab238c:
perf powerpc: Fix build-test failure (2016-09-08 13:44:07 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
User visible:
- Add branch stack / basic block info to 'perf annotate --stdio', where for
each branch, we add an asm comment after the instruction with information on
how often it was taken and predicted. See example with color output at:
http://vger.kernel.org/~acme/perf/annotate_basic_blocks.png
(Peter Zijlstra)
- Only open an evsel in CPUs in its cpu map, fixing some use cases in
systems with multiple PMUs with different CPU maps (Mark Rutland)
- Fix handling of huge TLB maps, recognizing it as anonymous (Wang Nan)
Infrastructure:
- Remove the symbol filtering code, i.e. the callbacks passed to all functions
that could end up loading a DSO symtab, simplifying the code, eventually
allowing what we should have had since day one: removing the 'map' parameter
from dso__load() functions (Arnaldo Carvalho de Melo)
Arch specific build fixes:
- Fix detached tarball build on powerpc, where we were still accessing a
file outside tools/ (Ravi Bangoria)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Arnaldo Carvalho de Melo (5):
perf symbols: Mark if a symbol is idle in the library
perf top: Remove old kernel-only symbol filter
perf machine: Remove machine->symbol_filter and friends
perf test vmlinux: Remove dead symbol_filter_t code
perf symbols: Remove symbol_filter_t machinery
Mark Rutland (2):
perf evlist: Only open events on CPUs an evsel permits
perf pmu: Support alternative sysfs cpumask
Peter Zijlstra (1):
perf annotate: Add branch stack / basic block
Ravi Bangoria (1):
perf powerpc: Fix build-test failure
Wang Nan (3):
perf tools: Recognize hugetlb mapping as anon mapping
tools lib api fs: Add hugetlbfs filesystem detector
perf record: Mark MAP_HUGETLB when synthesizing mmap events
tools/lib/api/fs/fs.c | 15 ++
tools/lib/api/fs/fs.h | 1 +
tools/perf/arch/powerpc/util/sym-handling.c | 2 +-
tools/perf/builtin-annotate.c | 104 +++++++++
tools/perf/builtin-inject.c | 2 +-
tools/perf/builtin-kmem.c | 10 +-
tools/perf/builtin-script.c | 4 +-
tools/perf/builtin-top.c | 30 ---
tools/perf/perf-sys.h | 1 -
tools/perf/tests/code-reading.c | 4 +-
tools/perf/tests/vmlinux-kallsyms.c | 17 +-
tools/perf/ui/browsers/annotate.c | 2 +-
tools/perf/ui/browsers/map.c | 4 +-
tools/perf/util/Build | 1 +
tools/perf/util/annotate.c | 95 +++++++-
tools/perf/util/annotate.h | 1 +
tools/perf/util/block-range.c | 328 ++++++++++++++++++++++++++++
tools/perf/util/block-range.h | 71 ++++++
tools/perf/util/event.c | 21 +-
tools/perf/util/evlist.c | 8 +-
tools/perf/util/intel-bts.c | 2 +-
tools/perf/util/intel-pt.c | 4 +-
tools/perf/util/machine.c | 38 +---
tools/perf/util/machine.h | 34 +--
tools/perf/util/map.c | 50 ++---
tools/perf/util/map.h | 32 +--
tools/perf/util/pmu.c | 15 +-
tools/perf/util/probe-event.c | 17 +-
tools/perf/util/symbol-elf.c | 32 +--
tools/perf/util/symbol-minimal.c | 4 +-
tools/perf/util/symbol.c | 134 ++++++------
tools/perf/util/symbol.h | 20 +-
32 files changed, 817 insertions(+), 286 deletions(-)
create mode 100644 tools/perf/util/block-range.c
create mode 100644 tools/perf/util/block-range.h
Build stats:
[root@jouet ~]# time dm
1 69.078 alpine:3.4: Ok
2 24.055 android-ndk:r12b-arm: Ok
3 71.911 archlinux:latest: Ok
4 41.209 centos:5: Ok
5 58.240 centos:6: Ok
6 67.238 centos:7: Ok
7 62.040 debian:7: Ok
8 69.061 debian:8: Ok
9 38.124 debian:experimental: Ok
10 67.623 fedora:20: Ok
11 71.458 fedora:21: Ok
12 70.807 fedora:22: Ok
13 71.013 fedora:23: Ok
14 73.330 fedora:24: Ok
15 30.062 fedora:24-x-ARC-uClibc: Ok
16 77.616 fedora:rawhide: Ok
17 73.663 mageia:5: Ok
18 69.264 opensuse:13.2: Ok
19 71.532 opensuse:42.1: Ok
20 76.282 opensuse:tumbleweed: Ok
21 54.666 ubuntu:12.04.5: Ok
22 37.170 ubuntu:14.04: Ok
23 66.101 ubuntu:14.04.4: Ok
24 68.881 ubuntu:15.10: Ok
25 62.698 ubuntu:16.04: Ok
26 53.046 ubuntu:16.04-x-arm: Ok
27 51.609 ubuntu:16.04-x-arm64: Ok
28 51.842 ubuntu:16.04-x-powerpc64: Ok
29 53.347 ubuntu:16.04-x-powerpc64el: Ok
30 72.280 ubuntu:16.10: Ok
31 54.078 ubuntu:16.10-x-s390: Ok
real 31m19.919s
user 0m1.890s
sys 0m2.201s
[root@jouet ~]#
[toc] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-09-08 22:50 +0200 |
| Subject | [PATCH 07/12] tools lib api fs: Add hugetlbfs filesystem detector |
| Message-ID | <sfeqJ-2at-11@gated-at.bofh.it> |
| In reply to | #1479499 |
From: Wang Nan <wangnan0@huawei.com>
Detect hugetlbfs. hugetlbfs__mountpoint() will be used during recording
to help identifying hugetlb mmaps: which should be recognized as anon
mapping.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Reviewed-by: Nilay Vaish <nilayvaish@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Hou Pengyang <houpengyang@huawei.com>
Cc: Zefan Li <lizefan@huawei.com>
Link: http://lkml.kernel.org/r/1473137909-142064-3-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/lib/api/fs/fs.c | 15 +++++++++++++++
tools/lib/api/fs/fs.h | 1 +
2 files changed, 16 insertions(+)
diff --git a/tools/lib/api/fs/fs.c b/tools/lib/api/fs/fs.c
index ba7094b945ff..f99f49e4a31e 100644
--- a/tools/lib/api/fs/fs.c
+++ b/tools/lib/api/fs/fs.c
@@ -34,6 +34,10 @@
#define TRACEFS_MAGIC 0x74726163
#endif
+#ifndef HUGETLBFS_MAGIC
+#define HUGETLBFS_MAGIC 0x958458f6
+#endif
+
static const char * const sysfs__fs_known_mountpoints[] = {
"/sys",
0,
@@ -67,6 +71,10 @@ static const char * const tracefs__known_mountpoints[] = {
0,
};
+static const char * const hugetlbfs__known_mountpoints[] = {
+ 0,
+};
+
struct fs {
const char *name;
const char * const *mounts;
@@ -80,6 +88,7 @@ enum {
FS__PROCFS = 1,
FS__DEBUGFS = 2,
FS__TRACEFS = 3,
+ FS__HUGETLBFS = 4,
};
#ifndef TRACEFS_MAGIC
@@ -107,6 +116,11 @@ static struct fs fs__entries[] = {
.mounts = tracefs__known_mountpoints,
.magic = TRACEFS_MAGIC,
},
+ [FS__HUGETLBFS] = {
+ .name = "hugetlbfs",
+ .mounts = hugetlbfs__known_mountpoints,
+ .magic = HUGETLBFS_MAGIC,
+ },
};
static bool fs__read_mounts(struct fs *fs)
@@ -265,6 +279,7 @@ FS(sysfs, FS__SYSFS);
FS(procfs, FS__PROCFS);
FS(debugfs, FS__DEBUGFS);
FS(tracefs, FS__TRACEFS);
+FS(hugetlbfs, FS__HUGETLBFS);
int filename__read_int(const char *filename, int *value)
{
diff --git a/tools/lib/api/fs/fs.h b/tools/lib/api/fs/fs.h
index 16c9c2ed7c5b..a63269f5d20c 100644
--- a/tools/lib/api/fs/fs.h
+++ b/tools/lib/api/fs/fs.h
@@ -21,6 +21,7 @@ FS(sysfs)
FS(procfs)
FS(debugfs)
FS(tracefs)
+FS(hugetlbfs)
#undef FS
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-09-08 22:50 +0200 |
| Subject | [PATCH 02/12] perf top: Remove old kernel-only symbol filter |
| Message-ID | <sfeqK-2at-23@gated-at.bofh.it> |
| In reply to | #1479499 |
From: Arnaldo Carvalho de Melo <acme@redhat.com>
Not needed, we already have code to prune aliases.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-1ysyce7qjgui93gi1efbjwhf@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-top.c | 27 ---------------------------
1 file changed, 27 deletions(-)
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 6f48df14e277..400785702566 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -657,31 +657,6 @@ repeat:
return NULL;
}
-static int symbol_filter(struct map *map, struct symbol *sym)
-{
- const char *name = sym->name;
-
- if (!__map__is_kernel(map))
- return 0;
- /*
- * ppc64 uses function descriptors and appends a '.' to the
- * start of every instruction address. Remove it.
- */
- if (name[0] == '.')
- name++;
-
- if (!strcmp(name, "_text") ||
- !strcmp(name, "_etext") ||
- !strcmp(name, "_sinittext") ||
- !strncmp("init_module", name, 11) ||
- !strncmp("cleanup_module", name, 14) ||
- strstr(name, "_text_start") ||
- strstr(name, "_text_end"))
- return 1;
-
- return 0;
-}
-
static int hist_iter__top_callback(struct hist_entry_iter *iter,
struct addr_location *al, bool single,
void *arg)
@@ -946,8 +921,6 @@ static int __cmd_top(struct perf_top *top)
if (top->session == NULL)
return -1;
- machines__set_symbol_filter(&top->session->machines, symbol_filter);
-
if (!objdump_path) {
ret = perf_env__lookup_objdump(&top->session->header.env);
if (ret)
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-09-08 22:50 +0200 |
| Subject | [PATCH 06/12] perf tools: Recognize hugetlb mapping as anon mapping |
| Message-ID | <sfeqK-2at-15@gated-at.bofh.it> |
| In reply to | #1479499 |
From: Wang Nan <wangnan0@huawei.com>
Hugetlbfs mapping should be recognized as anon mapping so user has a
chance to create /tmp/perf-<pid>.map file for symbol resolving. This
patch utilizes MAP_HUGETLB to identify hugetlb mapping.
After this patch, if perf is started before a program starts using huge
pages (so perf gets MMAP2 events from kernel), perf is able to recognize
hugetlb mapping as anon mapping.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Nilay Vaish <nilayvaish@gmail.com>
Cc: Zefan Li <lizefan@huawei.com>
Link: http://lkml.kernel.org/r/1473137909-142064-2-git-send-email-wangnan0@huawei.com
Signed-off-by: Hou Pengyang <houpengyang@huawei.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/map.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index 0c54adb07ae9..d51a1257973b 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -6,6 +6,7 @@
#include <string.h>
#include <stdio.h>
#include <unistd.h>
+#include <sys/mman.h>
#include "map.h"
#include "thread.h"
#include "strlist.h"
@@ -24,9 +25,15 @@ const char *map_type__name[MAP__NR_TYPES] = {
[MAP__VARIABLE] = "Variables",
};
-static inline int is_anon_memory(const char *filename)
+static inline int is_anon_memory(const char *filename, u32 flags)
{
- return !strcmp(filename, "//anon") ||
+ u32 anon_flags = 0;
+
+#ifdef MAP_HUGETLB
+ anon_flags |= MAP_HUGETLB;
+#endif
+ return flags & anon_flags ||
+ !strcmp(filename, "//anon") ||
!strncmp(filename, "/dev/zero", sizeof("/dev/zero") - 1) ||
!strncmp(filename, "/anon_hugepage", sizeof("/anon_hugepage") - 1);
}
@@ -155,7 +162,7 @@ struct map *map__new(struct machine *machine, u64 start, u64 len,
int anon, no_dso, vdso, android;
android = is_android_lib(filename);
- anon = is_anon_memory(filename);
+ anon = is_anon_memory(filename, flags);
vdso = is_vdso_map(filename);
no_dso = is_no_dso_memory(filename);
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-09-08 22:50 +0200 |
| Subject | [PATCH 11/12] perf pmu: Support alternative sysfs cpumask |
| Message-ID | <sfeqK-2at-21@gated-at.bofh.it> |
| In reply to | #1479499 |
From: Mark Rutland <mark.rutland@arm.com>
The perf tools can read a cpumask file for a PMU, describing a subset of
CPUs which that PMU covers. So far this has only been used to cater for
uncore PMUs, which in practice happen to only have a single CPU
described in the mask.
Until recently, the perf tools only correctly handled cpumask containing
a single CPU, and only when monitoring in system-wide mode. For example,
prior to commit 00e727bb389359c8 ("perf stat: Balance opening and
reading events"), a mask with more than a single CPU could cause perf
stat to hang. When a CPU PMU covers a subset of CPUs, but lacks a
cpumask, perf record will fail to open events (on the cores the PMU does
not support), and gives up.
For systems with heterogeneous CPUs such as ARM big.LITTLE systems, this
presents a problem. We have a PMU for each microarchitecture (e.g. a big
PMU and a little PMU), and would like to expose a cpumask for each (so
as to allow perf record and other tools to do the right thing). However,
doing so kernel-side will cause old perf binaries to not function (e.g.
hitting the issue solved by 00e727bb389359c8), and thus commits the
cardinal sin of breaking (existing) userspace.
To address this chicken-and-egg problem, this patch adds support got a
new file, cpus, which is largely identical to the existing cpumask file.
A kernel can expose this file, knowing that new perf binaries will
correctly support it, while old perf binaries will not look for it (and
thus will not be broken).
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Will Deacon <will.deacon@arm.com>
Link: http://lkml.kernel.org/r/1473330112-28528-8-git-send-email-mark.rutland@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/pmu.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index ddb0261b2577..2babcdf62839 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -445,14 +445,23 @@ static struct cpu_map *pmu_cpumask(const char *name)
FILE *file;
struct cpu_map *cpus;
const char *sysfs = sysfs__mountpoint();
+ const char *templates[] = {
+ "%s/bus/event_source/devices/%s/cpumask",
+ "%s/bus/event_source/devices/%s/cpus",
+ NULL
+ };
+ const char **template;
if (!sysfs)
return NULL;
- snprintf(path, PATH_MAX,
- "%s/bus/event_source/devices/%s/cpumask", sysfs, name);
+ for (template = templates; *template; template++) {
+ snprintf(path, PATH_MAX, *template, sysfs, name);
+ if (stat(path, &st) == 0)
+ break;
+ }
- if (stat(path, &st) < 0)
+ if (!*template)
return NULL;
file = fopen(path, "r");
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-09-08 22:50 +0200 |
| Subject | [PATCH 12/12] perf powerpc: Fix build-test failure |
| Message-ID | <sfeqK-2at-25@gated-at.bofh.it> |
| In reply to | #1479499 |
From: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
'make -C tools/perf build-test' is failing with below log for poewrpc.
In file included from /tmp/tmp.3eEwmGlYaF/perf-4.8.0-rc4/tools/perf/perf.h:15:0,
from util/cpumap.h:8,
from util/env.c:1:
/tmp/tmp.3eEwmGlYaF/perf-4.8.0-rc4/tools/perf/perf-sys.h:23:56:
fatal error: ../../arch/powerpc/include/uapi/asm/unistd.h: No such file or directory
compilation terminated.
I bisected it and found it's failing from commit ad430729ae00 ("Remove:
kernel unistd*h files from perf's MANIFEST, not used").
Header file '../../arch/powerpc/include/uapi/asm/unistd.h' is included
only for powerpc in tools/perf/perf-sys.h.
By looking closly at commit history, I found little weird thing:
Commit f2d9cae9ea9e ("perf powerpc: Use uapi/unistd.h to fix build
error") replaced 'asm/unistd.h' with 'uapi/asm/unistd.h'
Commit d2709c7ce4c5 ("perf: Make perf build for x86 with UAPI
disintegration applied") removes all arch specific 'uapi/asm/unistd.h'
for all archs and adds generic <asm/unistd.h>.
Commit f0b9abfb0446 ("Merge branch 'linus' into perf/core") again
includes 'uapi/asm/unistd.h' for powerpc. Don't know how exactly this
happened as this change is not part of commit also.
Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1472630591-5089-1-git-send-email-ravi.bangoria@linux.vnet.ibm.com
Fixes: ad430729ae00 ("Remove: kernel unistd*h files from perf's MANIFEST, not used")
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/perf-sys.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/tools/perf/perf-sys.h b/tools/perf/perf-sys.h
index 7ed72a475c57..e4b717e9eb6c 100644
--- a/tools/perf/perf-sys.h
+++ b/tools/perf/perf-sys.h
@@ -20,7 +20,6 @@
#endif
#ifdef __powerpc__
-#include "../../arch/powerpc/include/uapi/asm/unistd.h"
#define CPUINFO_PROC {"cpu"}
#endif
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-09-08 22:50 +0200 |
| Subject | [PATCH 08/12] perf record: Mark MAP_HUGETLB when synthesizing mmap events |
| Message-ID | <sfeqK-2at-27@gated-at.bofh.it> |
| In reply to | #1479499 |
From: Wang Nan <wangnan0@huawei.com>
When synthesizing mmap events, add MAP_HUGETLB map flag if the source of
mapping is file in hugetlbfs.
After this patch, perf can identify hugetlb mapping even if perf is
started after the mapping of huge pages (like with 'perf top').
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Reviewed-by: Nilay Vaish <nilayvaish@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Hou Pengyang <houpengyang@huawei.com>
Cc: Zefan Li <lizefan@huawei.com>
Link: http://lkml.kernel.org/r/1473137909-142064-4-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/event.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index 9ad7d32dba2b..6c3017139c67 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -1,5 +1,6 @@
#include <linux/types.h>
#include <sys/mman.h>
+#include <api/fs/fs.h>
#include "event.h"
#include "debug.h"
#include "hist.h"
@@ -248,6 +249,10 @@ int perf_event__synthesize_mmap_events(struct perf_tool *tool,
bool truncation = false;
unsigned long long timeout = proc_map_timeout * 1000000ULL;
int rc = 0;
+#ifdef MAP_HUGETLB
+ const char *hugetlbfs_mnt = hugetlbfs__mountpoint();
+ int hugetlbfs_mnt_len = hugetlbfs_mnt ? strlen(hugetlbfs_mnt) : 0;
+#endif
if (machine__is_default_guest(machine))
return 0;
@@ -342,6 +347,12 @@ out:
if (!strcmp(execname, ""))
strcpy(execname, anonstr);
+#ifdef MAP_HUGETLB
+ if (!strncmp(execname, hugetlbfs_mnt, hugetlbfs_mnt_len)) {
+ strcpy(execname, anonstr);
+ event->mmap2.flags |= MAP_HUGETLB;
+ }
+#endif
size = strlen(execname) + 1;
memcpy(event->mmap2.filename, execname, size);
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-09-08 22:50 +0200 |
| Subject | [PATCH 04/12] perf test vmlinux: Remove dead symbol_filter_t code |
| Message-ID | <sfeqK-2at-29@gated-at.bofh.it> |
| In reply to | #1479499 |
From: Arnaldo Carvalho de Melo <acme@redhat.com>
We don't need to initialize that area as we're not using it afterwards,
leftover, ditch it.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-jb2un8buy4rqawz73mcdm1sn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/tests/vmlinux-kallsyms.c | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/tools/perf/tests/vmlinux-kallsyms.c b/tools/perf/tests/vmlinux-kallsyms.c
index 77513bf99d1b..e6925d6400f2 100644
--- a/tools/perf/tests/vmlinux-kallsyms.c
+++ b/tools/perf/tests/vmlinux-kallsyms.c
@@ -8,14 +8,6 @@
#include "debug.h"
#include "machine.h"
-static int vmlinux_matches_kallsyms_filter(struct map *map __maybe_unused,
- struct symbol *sym)
-{
- bool *visited = symbol__priv(sym);
- *visited = true;
- return 0;
-}
-
#define UM(x) kallsyms_map->unmap_ip(kallsyms_map, (x))
int test__vmlinux_matches_kallsyms(int subtest __maybe_unused)
@@ -100,8 +92,7 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused)
* maps__reloc_vmlinux will notice and set proper ->[un]map_ip routines
* to fixup the symbols.
*/
- if (machine__load_vmlinux_path(&vmlinux, type,
- vmlinux_matches_kallsyms_filter) <= 0) {
+ if (machine__load_vmlinux_path(&vmlinux, type, NULL) <= 0) {
pr_debug("Couldn't find a vmlinux that matches the kernel running on this machine, skipping test\n");
err = TEST_SKIP;
goto out;
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-09-08 22:50 +0200 |
| Subject | [PATCH 10/12] perf evlist: Only open events on CPUs an evsel permits |
| Message-ID | <sfeqK-2at-31@gated-at.bofh.it> |
| In reply to | #1479499 |
From: Mark Rutland <mark.rutland@arm.com>
In systems with heterogeneous CPU PMUs, it's possible for each evsel to
cover a distinct set of CPUs, and hence the cpu_map associated with each
evsel may have a distinct idx<->id mapping. Any of these may be distinct
from the evlist's cpu map.
Events can be tied to the same fd so long as they use the same per-cpu
ringbuffer (i.e. so long as they are on the same CPU). To acquire the
correct FDs, we must compare the Linux logical IDs rather than the evsel
or evlist indices.
This path adds logic to perf_evlist__mmap_per_evsel to handle this,
translating IDs as required. As PMUs may cover a subset of CPUs from the
evlist, we skip the CPUs a PMU cannot handle.
Without this patch, perf record may try to mmap erroneous FDs on
heterogeneous systems, and will bail out early rather than running the
workload.
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Will Deacon <will.deacon@arm.com>
Link: http://lkml.kernel.org/r/1473330112-28528-7-git-send-email-mark.rutland@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/evlist.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 097b3ed77fdd..ea34c5a32c11 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -1032,16 +1032,18 @@ perf_evlist__should_poll(struct perf_evlist *evlist __maybe_unused,
}
static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx,
- struct mmap_params *mp, int cpu,
+ struct mmap_params *mp, int cpu_idx,
int thread, int *_output, int *_output_backward)
{
struct perf_evsel *evsel;
int revent;
+ int evlist_cpu = cpu_map__cpu(evlist->cpus, cpu_idx);
evlist__for_each_entry(evlist, evsel) {
struct perf_mmap *maps = evlist->mmap;
int *output = _output;
int fd;
+ int cpu;
if (evsel->attr.write_backward) {
output = _output_backward;
@@ -1060,6 +1062,10 @@ static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx,
if (evsel->system_wide && thread)
continue;
+ cpu = cpu_map__idx(evsel->cpus, evlist_cpu);
+ if (cpu == -1)
+ continue;
+
fd = FD(evsel, cpu, thread);
if (*output == -1) {
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-09-08 22:50 +0200 |
| Subject | [PATCH 03/12] perf machine: Remove machine->symbol_filter and friends |
| Message-ID | <sfeqK-2at-41@gated-at.bofh.it> |
| In reply to | #1479499 |
From: Arnaldo Carvalho de Melo <acme@redhat.com>
Including machines__set_symbol_filter(), not used anymore.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-7o1qgmrpvzuis4a9f0t8mnri@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/event.c | 8 +++-----
tools/perf/util/intel-bts.c | 2 +-
tools/perf/util/intel-pt.c | 4 ++--
tools/perf/util/machine.c | 21 +--------------------
tools/perf/util/machine.h | 4 ----
5 files changed, 7 insertions(+), 32 deletions(-)
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index e20438b784be..2f91183f2779 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -1286,7 +1286,7 @@ try_again:
* must be done prior to using kernel maps.
*/
if (load_map)
- map__load(al->map, machine->symbol_filter);
+ map__load(al->map, NULL);
al->addr = al->map->map_ip(al->map, al->addr);
}
}
@@ -1297,8 +1297,7 @@ void thread__find_addr_location(struct thread *thread,
{
thread__find_addr_map(thread, cpumode, type, addr, al);
if (al->map != NULL)
- al->sym = map__find_symbol(al->map, al->addr,
- thread->mg->machine->symbol_filter);
+ al->sym = map__find_symbol(al->map, al->addr, NULL);
else
al->sym = NULL;
}
@@ -1359,8 +1358,7 @@ int machine__resolve(struct machine *machine, struct addr_location *al,
al->filtered |= (1 << HIST_FILTER__DSO);
}
- al->sym = map__find_symbol(al->map, al->addr,
- machine->symbol_filter);
+ al->sym = map__find_symbol(al->map, al->addr, NULL);
}
if (symbol_conf.sym_list &&
diff --git a/tools/perf/util/intel-bts.c b/tools/perf/util/intel-bts.c
index 749e6f2e37ca..240b095eddba 100644
--- a/tools/perf/util/intel-bts.c
+++ b/tools/perf/util/intel-bts.c
@@ -346,7 +346,7 @@ static int intel_bts_get_next_insn(struct intel_bts_queue *btsq, u64 ip)
goto out_put;
/* Load maps to ensure dso->is_64_bit has been updated */
- map__load(al.map, machine->symbol_filter);
+ map__load(al.map, NULL);
x86_64 = al.map->dso->is_64_bit;
diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
index 551ff6f640be..d594052c8184 100644
--- a/tools/perf/util/intel-pt.c
+++ b/tools/perf/util/intel-pt.c
@@ -477,7 +477,7 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,
start_ip = *ip;
/* Load maps to ensure dso->is_64_bit has been updated */
- map__load(al.map, machine->symbol_filter);
+ map__load(al.map, NULL);
x86_64 = al.map->dso->is_64_bit;
@@ -1294,7 +1294,7 @@ static u64 intel_pt_switch_ip(struct intel_pt *pt, u64 *ptss_ip)
if (!map)
return 0;
- if (map__load(map, machine->symbol_filter))
+ if (map__load(map, NULL))
return 0;
start = dso__first_symbol(map->dso, MAP__FUNCTION);
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index cb6388dbdd98..7940ddc98f8c 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -41,7 +41,6 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
machine->pid = pid;
- machine->symbol_filter = NULL;
machine->id_hdr_size = 0;
machine->kptr_restrict_warned = false;
machine->comm_exec = false;
@@ -148,7 +147,6 @@ void machines__init(struct machines *machines)
{
machine__init(&machines->host, "", HOST_KERNEL_ID);
machines->guests = RB_ROOT;
- machines->symbol_filter = NULL;
}
void machines__exit(struct machines *machines)
@@ -172,8 +170,6 @@ struct machine *machines__add(struct machines *machines, pid_t pid,
return NULL;
}
- machine->symbol_filter = machines->symbol_filter;
-
while (*p != NULL) {
parent = *p;
pos = rb_entry(parent, struct machine, rb_node);
@@ -189,21 +185,6 @@ struct machine *machines__add(struct machines *machines, pid_t pid,
return machine;
}
-void machines__set_symbol_filter(struct machines *machines,
- symbol_filter_t symbol_filter)
-{
- struct rb_node *nd;
-
- machines->symbol_filter = symbol_filter;
- machines->host.symbol_filter = symbol_filter;
-
- for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
- struct machine *machine = rb_entry(nd, struct machine, rb_node);
-
- machine->symbol_filter = symbol_filter;
- }
-}
-
void machines__set_comm_exec(struct machines *machines, bool comm_exec)
{
struct rb_node *nd;
@@ -2115,7 +2096,7 @@ int machine__get_kernel_start(struct machine *machine)
*/
machine->kernel_start = 1ULL << 63;
if (map) {
- err = map__load(map, machine->symbol_filter);
+ err = map__load(map, NULL);
if (map->start)
machine->kernel_start = map->start;
}
diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h
index 20739f746bc4..b9e5588499c5 100644
--- a/tools/perf/util/machine.h
+++ b/tools/perf/util/machine.h
@@ -41,7 +41,6 @@ struct machine {
struct map_groups kmaps;
struct map *vmlinux_maps[MAP__NR_TYPES];
u64 kernel_start;
- symbol_filter_t symbol_filter;
pid_t *current_tid;
union { /* Tool specific area */
void *priv;
@@ -110,7 +109,6 @@ typedef void (*machine__process_t)(struct machine *machine, void *data);
struct machines {
struct machine host;
struct rb_root guests;
- symbol_filter_t symbol_filter;
};
void machines__init(struct machines *machines);
@@ -128,8 +126,6 @@ struct machine *machines__findnew(struct machines *machines, pid_t pid);
void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size);
char *machine__mmap_name(struct machine *machine, char *bf, size_t size);
-void machines__set_symbol_filter(struct machines *machines,
- symbol_filter_t symbol_filter);
void machines__set_comm_exec(struct machines *machines, bool comm_exec);
struct machine *machine__new_host(void);
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Ingo Molnar <mingo@kernel.org> |
|---|---|
| Date | 2016-09-09 07:50 +0200 |
| Message-ID | <sfmRj-7nj-15@gated-at.bofh.it> |
| In reply to | #1479499 |
* Arnaldo Carvalho de Melo <acme@kernel.org> wrote: > Hi Ingo, > > Please consider pulling, > > - Arnaldo > > The following changes since commit c0b172e5b6770048751b2c0a4fe44346c2080c5d: > > Merge tag 'perf-core-for-mingo-20160901' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2016-09-05 15:15:49 +0200) > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-20160908 > > for you to fetch changes up to 25b8592e912f085ce2ff736a2927584ddeab238c: > > perf powerpc: Fix build-test failure (2016-09-08 13:44:07 -0300) > > ---------------------------------------------------------------- > perf/core improvements and fixes: > > User visible: > > - Add branch stack / basic block info to 'perf annotate --stdio', where for > each branch, we add an asm comment after the instruction with information on > how often it was taken and predicted. See example with color output at: > > http://vger.kernel.org/~acme/perf/annotate_basic_blocks.png > > (Peter Zijlstra) > > - Only open an evsel in CPUs in its cpu map, fixing some use cases in > systems with multiple PMUs with different CPU maps (Mark Rutland) > > - Fix handling of huge TLB maps, recognizing it as anonymous (Wang Nan) > > Infrastructure: > > - Remove the symbol filtering code, i.e. the callbacks passed to all functions > that could end up loading a DSO symtab, simplifying the code, eventually > allowing what we should have had since day one: removing the 'map' parameter > from dso__load() functions (Arnaldo Carvalho de Melo) > > Arch specific build fixes: > > - Fix detached tarball build on powerpc, where we were still accessing a > file outside tools/ (Ravi Bangoria) > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > > ---------------------------------------------------------------- > Arnaldo Carvalho de Melo (5): > perf symbols: Mark if a symbol is idle in the library > perf top: Remove old kernel-only symbol filter > perf machine: Remove machine->symbol_filter and friends > perf test vmlinux: Remove dead symbol_filter_t code > perf symbols: Remove symbol_filter_t machinery > > Mark Rutland (2): > perf evlist: Only open events on CPUs an evsel permits > perf pmu: Support alternative sysfs cpumask > > Peter Zijlstra (1): > perf annotate: Add branch stack / basic block > > Ravi Bangoria (1): > perf powerpc: Fix build-test failure > > Wang Nan (3): > perf tools: Recognize hugetlb mapping as anon mapping > tools lib api fs: Add hugetlbfs filesystem detector > perf record: Mark MAP_HUGETLB when synthesizing mmap events > > tools/lib/api/fs/fs.c | 15 ++ > tools/lib/api/fs/fs.h | 1 + > tools/perf/arch/powerpc/util/sym-handling.c | 2 +- > tools/perf/builtin-annotate.c | 104 +++++++++ > tools/perf/builtin-inject.c | 2 +- > tools/perf/builtin-kmem.c | 10 +- > tools/perf/builtin-script.c | 4 +- > tools/perf/builtin-top.c | 30 --- > tools/perf/perf-sys.h | 1 - > tools/perf/tests/code-reading.c | 4 +- > tools/perf/tests/vmlinux-kallsyms.c | 17 +- > tools/perf/ui/browsers/annotate.c | 2 +- > tools/perf/ui/browsers/map.c | 4 +- > tools/perf/util/Build | 1 + > tools/perf/util/annotate.c | 95 +++++++- > tools/perf/util/annotate.h | 1 + > tools/perf/util/block-range.c | 328 ++++++++++++++++++++++++++++ > tools/perf/util/block-range.h | 71 ++++++ > tools/perf/util/event.c | 21 +- > tools/perf/util/evlist.c | 8 +- > tools/perf/util/intel-bts.c | 2 +- > tools/perf/util/intel-pt.c | 4 +- > tools/perf/util/machine.c | 38 +--- > tools/perf/util/machine.h | 34 +-- > tools/perf/util/map.c | 50 ++--- > tools/perf/util/map.h | 32 +-- > tools/perf/util/pmu.c | 15 +- > tools/perf/util/probe-event.c | 17 +- > tools/perf/util/symbol-elf.c | 32 +-- > tools/perf/util/symbol-minimal.c | 4 +- > tools/perf/util/symbol.c | 134 ++++++------ > tools/perf/util/symbol.h | 20 +- > 32 files changed, 817 insertions(+), 286 deletions(-) > create mode 100644 tools/perf/util/block-range.c > create mode 100644 tools/perf/util/block-range.h > > Build stats: > > [root@jouet ~]# time dm > 1 69.078 alpine:3.4: Ok > 2 24.055 android-ndk:r12b-arm: Ok > 3 71.911 archlinux:latest: Ok > 4 41.209 centos:5: Ok > 5 58.240 centos:6: Ok > 6 67.238 centos:7: Ok > 7 62.040 debian:7: Ok > 8 69.061 debian:8: Ok > 9 38.124 debian:experimental: Ok > 10 67.623 fedora:20: Ok > 11 71.458 fedora:21: Ok > 12 70.807 fedora:22: Ok > 13 71.013 fedora:23: Ok > 14 73.330 fedora:24: Ok > 15 30.062 fedora:24-x-ARC-uClibc: Ok > 16 77.616 fedora:rawhide: Ok > 17 73.663 mageia:5: Ok > 18 69.264 opensuse:13.2: Ok > 19 71.532 opensuse:42.1: Ok > 20 76.282 opensuse:tumbleweed: Ok > 21 54.666 ubuntu:12.04.5: Ok > 22 37.170 ubuntu:14.04: Ok > 23 66.101 ubuntu:14.04.4: Ok > 24 68.881 ubuntu:15.10: Ok > 25 62.698 ubuntu:16.04: Ok > 26 53.046 ubuntu:16.04-x-arm: Ok > 27 51.609 ubuntu:16.04-x-arm64: Ok > 28 51.842 ubuntu:16.04-x-powerpc64: Ok > 29 53.347 ubuntu:16.04-x-powerpc64el: Ok > 30 72.280 ubuntu:16.10: Ok > 31 54.078 ubuntu:16.10-x-s390: Ok > > real 31m19.919s > user 0m1.890s > sys 0m2.201s > [root@jouet ~]# Pulled, thanks a lot Arnaldo! Ingo
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web