2012-06-01 22:17:15

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [GIT PULL 00/15] perf/urgent fixes

Hi Ingo,

Please consider pulling, this is in addition to what already were in
perf/urgent.

- Arnaldo

The following changes since commit 79695e1bb65ba0e21488c360a1bed6e358354aaa:

perf stat: Initialize default events wrt exclude_{guest,host} (2012-05-30 14:02:38 -0300)

are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-urgent-for-mingo

Arnaldo Carvalho de Melo (2):
perf tools: Fix make tarballs
perf tools: Make --version show kernel version instead of pull req tag

Avik Sil (1):
perf tools: Fix pager on minimal-install embedded systems

David Ahern (2):
perf script: Fix regression in callchain dso name
perf tool: Build fix, remove duplicate declarations

Jiri Olsa (3):
perf symbols: Handle different endians properly during symbol load
perf session: Handle endianity swap on sample_id_all header data
perf evsel: Fix 32 bit values endianity swap for sample_id_all header

Namhyung Kim (5):
perf callchain: Make callchain cursors TLS
perf tools: Check if callchain is corrupted
perf tools: Update ioctl documentation for PERF_IOC_FLAG_GROUP
perf evlist: Pass third argument to ioctl explicitly
perf: Remove duplicate invocation on perf_event_for_each

Srikar Dronamraju (2):
perf symbols: Check for valid dso before creating map
perf uprobes: Remove unnecessary check before strlist__delete

include/linux/perf_event.h | 4 +-
kernel/events/core.c | 1 -
tools/perf/MANIFEST | 2 +
tools/perf/builtin-report.c | 2 +-
tools/perf/builtin-top.c | 2 +-
tools/perf/design.txt | 7 ++-
tools/perf/util/PERF-VERSION-GEN | 2 +-
tools/perf/util/callchain.c | 2 +
tools/perf/util/callchain.h | 2 +
tools/perf/util/evlist.c | 6 ++-
tools/perf/util/evsel.c | 29 +++++++++---
tools/perf/util/hist.c | 7 ++-
tools/perf/util/hist.h | 2 -
tools/perf/util/pager.c | 4 ++
tools/perf/util/probe-event.c | 8 +--
tools/perf/util/session.c | 97 +++++++++++++++++++++++++++++--------
tools/perf/util/symbol.c | 38 ++++++++++++++-
tools/perf/util/symbol.h | 34 ++++++++++++-
tools/perf/util/util.h | 6 +--
19 files changed, 195 insertions(+), 60 deletions(-)


2012-06-01 22:16:51

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 06/15] perf tools: Make --version show kernel version instead of pull req tag

From: Arnaldo Carvalho de Melo <[email protected]>

Before:

$ perf --version
perf version perf.urgent.for.mingo.5.g37da28

After:

$ perf --version
perf version 3.4.8941.g37da28.dirty

Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Mike Galbraith <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Stephane Eranian <[email protected]>
Link: http://lkml.kernel.org/n/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/PERF-VERSION-GEN | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/tools/perf/util/PERF-VERSION-GEN b/tools/perf/util/PERF-VERSION-GEN
index ad73300..95264f3 100755
--- a/tools/perf/util/PERF-VERSION-GEN
+++ b/tools/perf/util/PERF-VERSION-GEN
@@ -12,7 +12,7 @@ LF='
# First check if there is a .git to get the version from git describe
# otherwise try to get the version from the kernel makefile
if test -d ../../.git -o -f ../../.git &&
- VN=$(git describe --abbrev=4 HEAD 2>/dev/null) &&
+ VN=$(git describe --match 'v[0-9].[0-9]*' --abbrev=4 HEAD 2>/dev/null) &&
case "$VN" in
*$LF*) (exit 1) ;;
v[0-9]*)
--
1.7.1

2012-06-01 22:16:59

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 09/15] perf symbols: Handle different endians properly during symbol load

From: Jiri Olsa <[email protected]>

Currently we dont care about the file object's endianness. It's possible
we read buildid file object from different architecture than we are
currentlly running on. So we need to care about properly reading such
object's data - handle different endianness properly.

Adding:
needs_swap DSO field
dso__swap_init function to initialize DSO's needs_swap
DSO__SWAP to read the data with proper swaps

Together with other endianity patches, this change fixies perf report
discrepancies on origin and target systems as described in test 1 below,
e.g. following perf report diff:

...
0.12% ps [kernel.kallsyms] [k] clear_page
- 0.12% awk bash [.] alloc_word_desc
+ 0.12% awk bash [.] yyparse
0.11% beah-rhts-task libpython2.6.so.1.0 [.] 0x5560e
0.10% perf libc-2.12.so [.] __ctype_toupper_loc
- 0.09% rhts-test-runne bash [.] maybe_make_export_env
+ 0.09% rhts-test-runne bash [.] 0x385a0
0.09% ps [kernel.kallsyms] [k] page_fault
...

Note, running following to test perf endianity handling:
test 1)
- origin system:
# perf record -a -- sleep 10 (any perf record will do)
# perf report > report.origin
# perf archive perf.data

- copy the perf.data, report.origin and perf.data.tar.bz2
to a target system and run:
# tar xjvf perf.data.tar.bz2 -C ~/.debug
# perf report > report.target
# diff -u report.origin report.target

- the diff should produce no output
(besides some white space stuff and possibly different
date/TZ output)

test 1)
- origin system:
# perf record -ag -fo /tmp/perf.data -- sleep 1
- mount origin system root to the target system on /mnt/origin
- target system:
# perf script --symfs /mnt/origin -I -i /mnt/origin/tmp/perf.data \
--kallsyms /mnt/origin/proc/kallsyms
- complete perf.data header is displayed

Signed-off-by: Jiri Olsa <[email protected]>
Cc: Corey Ashford <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/symbol.c | 33 ++++++++++++++++++++++++++++++++-
tools/perf/util/symbol.h | 30 ++++++++++++++++++++++++++++++
2 files changed, 62 insertions(+), 1 deletions(-)

diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index e2ba885..9d04dcd 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -323,6 +323,7 @@ struct dso *dso__new(const char *name)
dso->sorted_by_name = 0;
dso->has_build_id = 0;
dso->kernel = DSO_TYPE_USER;
+ dso->needs_swap = DSO_SWAP__UNSET;
INIT_LIST_HEAD(&dso->node);
}

@@ -1156,6 +1157,33 @@ static size_t elf_addr_to_index(Elf *elf, GElf_Addr addr)
return -1;
}

+static int dso__swap_init(struct dso *dso, unsigned char eidata)
+{
+ static unsigned int const endian = 1;
+
+ dso->needs_swap = DSO_SWAP__NO;
+
+ switch (eidata) {
+ case ELFDATA2LSB:
+ /* We are big endian, DSO is little endian. */
+ if (*(unsigned char const *)&endian != 1)
+ dso->needs_swap = DSO_SWAP__YES;
+ break;
+
+ case ELFDATA2MSB:
+ /* We are little endian, DSO is big endian. */
+ if (*(unsigned char const *)&endian != 0)
+ dso->needs_swap = DSO_SWAP__YES;
+ break;
+
+ default:
+ pr_err("unrecognized DSO data encoding %d\n", eidata);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
static int dso__load_sym(struct dso *dso, struct map *map, const char *name,
int fd, symbol_filter_t filter, int kmodule,
int want_symtab)
@@ -1187,6 +1215,9 @@ static int dso__load_sym(struct dso *dso, struct map *map, const char *name,
goto out_elf_end;
}

+ if (dso__swap_init(dso, ehdr.e_ident[EI_DATA]))
+ goto out_elf_end;
+
/* Always reject images with a mismatched build-id: */
if (dso->has_build_id) {
u8 build_id[BUILD_ID_SIZE];
@@ -1272,7 +1303,7 @@ static int dso__load_sym(struct dso *dso, struct map *map, const char *name,
if (opdsec && sym.st_shndx == opdidx) {
u32 offset = sym.st_value - opdshdr.sh_addr;
u64 *opd = opddata->d_buf + offset;
- sym.st_value = *opd;
+ sym.st_value = DSO__SWAP(dso, u64, *opd);
sym.st_shndx = elf_addr_to_index(elf, sym.st_value);
}

diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index 5649d63..af0752b 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -9,6 +9,7 @@
#include <linux/list.h>
#include <linux/rbtree.h>
#include <stdio.h>
+#include <byteswap.h>

#ifdef HAVE_CPLUS_DEMANGLE
extern char *cplus_demangle(const char *, int);
@@ -160,11 +161,18 @@ enum dso_kernel_type {
DSO_TYPE_GUEST_KERNEL
};

+enum dso_swap_type {
+ DSO_SWAP__UNSET,
+ DSO_SWAP__NO,
+ DSO_SWAP__YES,
+};
+
struct dso {
struct list_head node;
struct rb_root symbols[MAP__NR_TYPES];
struct rb_root symbol_names[MAP__NR_TYPES];
enum dso_kernel_type kernel;
+ enum dso_swap_type needs_swap;
u8 adjust_symbols:1;
u8 has_build_id:1;
u8 hit:1;
@@ -182,6 +190,28 @@ struct dso {
char name[0];
};

+#define DSO__SWAP(dso, type, val) \
+({ \
+ type ____r = val; \
+ BUG_ON(dso->needs_swap == DSO_SWAP__UNSET); \
+ if (dso->needs_swap == DSO_SWAP__YES) { \
+ switch (sizeof(____r)) { \
+ case 2: \
+ ____r = bswap_16(val); \
+ break; \
+ case 4: \
+ ____r = bswap_32(val); \
+ break; \
+ case 8: \
+ ____r = bswap_64(val); \
+ break; \
+ default: \
+ BUG_ON(1); \
+ } \
+ } \
+ ____r; \
+})
+
struct dso *dso__new(const char *name);
void dso__delete(struct dso *dso);

--
1.7.1

2012-06-01 22:16:57

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 15/15] perf tool: Build fix, remove duplicate declarations

From: David Ahern <[email protected]>

I'm sure I have some gremlins running around today, but I am
consistently hitting this compile failure on Fedora 14 and 16:

In file included from util/sort.h:12:0,
from builtin-diff.c:15:
util/string.h:7:5: error: redundant redeclaration of ‘hex2u64’ [-Werror=redundant-decls]
util/symbol.h:32:5: note: previous declaration of ‘hex2u64’ was here
util/string.h:8:7: error: redundant redeclaration of ‘strxfrchar’ [-Werror=redundant-decls]
util/symbol.h:33:7: note: previous declaration of ‘strxfrchar’ was here
util/string.h:9:5: error: redundant redeclaration of ‘perf_atoll’ [-Werror=redundant-decls]
util/util.h:238:5: note: previous declaration of ‘perf_atoll’ was here
util/string.h:10:8: error: redundant redeclaration of ‘argv_split’ [-Werror=redundant-decls]
util/util.h:239:8: note: previous declaration of ‘argv_split’ was here
util/string.h:11:6: error: redundant redeclaration of ‘argv_free’ [-Werror=redundant-decls]
util/util.h:240:6: note: previous declaration of ‘argv_free’ was here
util/string.h:12:6: error: redundant redeclaration of ‘strglobmatch’ [-Werror=redundant-decls]
util/util.h:241:6: note: previous declaration of ‘strglobmatch’ was here
util/string.h:13:6: error: redundant redeclaration of ‘strlazymatch’ [-Werror=redundant-decls]
util/util.h:242:6: note: previous declaration of ‘strlazymatch’ was here
cc1: all warnings being treated as errors
make: *** [/tmp/pbuild/builtin-diff.o] Error 1
make: *** Waiting for unfinished jobs....
make: Leaving directory `/opt/sw/ahern/perf.git/tools/perf'

Fix it by removing duplicates.

Signed-off-by: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/symbol.h | 4 +---
tools/perf/util/util.h | 6 +-----
2 files changed, 2 insertions(+), 8 deletions(-)

diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index af0752b..bf4b679 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -10,6 +10,7 @@
#include <linux/rbtree.h>
#include <stdio.h>
#include <byteswap.h>
+#include "string.h"

#ifdef HAVE_CPLUS_DEMANGLE
extern char *cplus_demangle(const char *, int);
@@ -30,9 +31,6 @@ static inline char *bfd_demangle(void __used *v, const char __used *c,
#endif
#endif

-int hex2u64(const char *ptr, u64 *val);
-char *strxfrchar(char *s, char from, char to);
-
/*
* libelf 0.8.x and earlier do not support ELF_C_READ_MMAP;
* for newer versions we can use mmap to reduce memory usage:
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index 2daaedb..5152592 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -78,6 +78,7 @@
#include "../../../include/linux/magic.h"
#include "types.h"
#include <sys/ttydefaults.h>
+#include "string.h"

extern const char *graph_line;
extern const char *graph_dotted_line;
@@ -235,11 +236,6 @@ static inline int sane_case(int x, int high)
int mkdir_p(char *path, mode_t mode);
int copyfile(const char *from, const char *to);

-s64 perf_atoll(const char *str);
-char **argv_split(const char *str, int *argcp);
-void argv_free(char **argv);
-bool strglobmatch(const char *str, const char *pat);
-bool strlazymatch(const char *str, const char *pat);
int strtailcmp(const char *s1, const char *s2);
unsigned long convert_unit(unsigned long value, char *unit);
int readn(int fd, void *buf, size_t size);
--
1.7.1

2012-06-01 22:17:17

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 01/15] perf script: Fix regression in callchain dso name

From: David Ahern <[email protected]>

$ perf script -i /tmp/perf.data
...
gcc 13623 544315.062858: context-switches:
ffffffff815f65c9 __schedule ([kernel.kallsyms])
ffffffff81087cea __cond_resched ([kernel.kallsyms])
ffffffff815f6b92 _cond_resched ([kernel.kallsyms])
ffffffff815fb87a do_page_fault ([kernel.kallsyms])
ffffffff815f8465 page_fault ([kernel.kallsyms])
2b7a71ea0303 _dl_lookup_symbol_x ([kernel.kallsyms])
2b7a71ea1eb5 _dl_relocate_object ([kernel.kallsyms])
2b7a71e99b2e dl_main ([kernel.kallsyms])
2b7a71eab7f4 _dl_sysdep_start ([kernel.kallsyms])

All DSO's in a callchain are printed as [kernel.kallsyms].

git bisect chased it to:

547a92e0aedb88129e7fbd804697a11949de2e5a is the first bad commit
commit 547a92e0aedb88129e7fbd804697a11949de2e5a
Author: Akihiro Nagai <[email protected]>
Date: Mon Jan 30 13:42:57 2012 +0900

perf script: Unify the expressions indicating "unknown"

The perf script command uses various expressions to indicate "unknown".

It is unfriendly for user scripts to parse it. So, this patch unifies
the expressions to "[unknown]".

Looks like a copy-paste in that the other references use al.map but this one
should be node->map.

With this patch you get:

$ perf script -i /tmp/perf.data
...
gcc 13623 544315.062858: context-switches:
ffffffff815f65c9 __schedule ([kernel.kallsyms])
ffffffff81087cea __cond_resched ([kernel.kallsyms])
ffffffff815f6b92 _cond_resched ([kernel.kallsyms])
ffffffff815fb87a do_page_fault ([kernel.kallsyms])
ffffffff815f8465 page_fault ([kernel.kallsyms])
2b7a71ea0303 _dl_lookup_symbol_x (/lib64/ld-2.14.90.so)
2b7a71ea1eb5 _dl_relocate_object (/lib64/ld-2.14.90.so)
2b7a71e99b2e dl_main (/lib64/ld-2.14.90.so)
2b7a71eab7f4 _dl_sysdep_start (/lib64/ld-2.14.90.so)

Signed-off-by: David Ahern <[email protected]>
Cc: Akihiro Nagai <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/session.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 93d355d..4820614 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1460,7 +1460,7 @@ void perf_event__print_ip(union perf_event *event, struct perf_sample *sample,
}
if (print_dso) {
printf(" (");
- map__fprintf_dsoname(al.map, stdout);
+ map__fprintf_dsoname(node->map, stdout);
printf(")");
}
printf("\n");
--
1.7.1

2012-06-01 22:16:55

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 14/15] perf: Remove duplicate invocation on perf_event_for_each

From: Namhyung Kim <[email protected]>

The @func callback was invoked twice for group leader when
perf_event_for_each() called. It seems the commit 75f937f24bd9
("perf_counter: Fix ctx->mutex vs counter ->mutex inversion") made the
mistake during the change.

Signed-off-by: Namhyung Kim <[email protected]>
Acked-by: Peter Zijlstra <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
kernel/events/core.c | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 5b06cbb..f85c015 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3181,7 +3181,6 @@ static void perf_event_for_each(struct perf_event *event,
event = event->group_leader;

perf_event_for_each_child(event, func);
- func(event);
list_for_each_entry(sibling, &event->sibling_list, group_entry)
perf_event_for_each_child(sibling, func);
mutex_unlock(&ctx->mutex);
--
1.7.1

2012-06-01 22:17:57

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 10/15] perf session: Handle endianity swap on sample_id_all header data

From: Jiri Olsa <[email protected]>

Adding endianity swapping for event header attached via sample_id_all.

Currently we dont do that and it's causing wrong data to be read when
running report on architecture with different endianity than the record.

The perf is currently able to process 32-bit PPC samples on 32-bit
and 64-bit x86.

Together with other endianity patches, this change fixies perf report
discrepancies on origin and target systems as described in test 1
below, e.g. following perf report diff:

...
0.12% ps [kernel.kallsyms] [k] clear_page
- 0.12% awk bash [.] alloc_word_desc
+ 0.12% awk bash [.] yyparse
0.11% beah-rhts-task libpython2.6.so.1.0 [.] 0x5560e
0.10% perf libc-2.12.so [.] __ctype_toupper_loc
- 0.09% rhts-test-runne bash [.] maybe_make_export_env
+ 0.09% rhts-test-runne bash [.] 0x385a0
0.09% ps [kernel.kallsyms] [k] page_fault
...

Note, running following to test perf endianity handling:
test 1)
- origin system:
# perf record -a -- sleep 10 (any perf record will do)
# perf report > report.origin
# perf archive perf.data

- copy the perf.data, report.origin and perf.data.tar.bz2
to a target system and run:
# tar xjvf perf.data.tar.bz2 -C ~/.debug
# perf report > report.target
# diff -u report.origin report.target

- the diff should produce no output
(besides some white space stuff and possibly different
date/TZ output)

test 2)
- origin system:
# perf record -ag -fo /tmp/perf.data -- sleep 1
- mount origin system root to the target system on /mnt/origin
- target system:
# perf script --symfs /mnt/origin -I -i /mnt/origin/tmp/perf.data \
--kallsyms /mnt/origin/proc/kallsyms
- complete perf.data header is displayed

Signed-off-by: Jiri Olsa <[email protected]>
Reviewed-by: David Ahern <[email protected]>
Tested-by: David Ahern <[email protected]>
Cc: Corey Ashford <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/session.c | 67 +++++++++++++++++++++++++++++++++++++--------
1 files changed, 55 insertions(+), 12 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 04d1e33..2600916 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -454,37 +454,65 @@ void mem_bswap_64(void *src, int byte_size)
}
}

-static void perf_event__all64_swap(union perf_event *event)
+static void swap_sample_id_all(union perf_event *event, void *data)
+{
+ void *end = (void *) event + event->header.size;
+ int size = end - data;
+
+ BUG_ON(size % sizeof(u64));
+ mem_bswap_64(data, size);
+}
+
+static void perf_event__all64_swap(union perf_event *event,
+ bool sample_id_all __used)
{
struct perf_event_header *hdr = &event->header;
mem_bswap_64(hdr + 1, event->header.size - sizeof(*hdr));
}

-static void perf_event__comm_swap(union perf_event *event)
+static void perf_event__comm_swap(union perf_event *event, bool sample_id_all)
{
event->comm.pid = bswap_32(event->comm.pid);
event->comm.tid = bswap_32(event->comm.tid);
+
+ if (sample_id_all) {
+ void *data = &event->comm.comm;
+
+ data += ALIGN(strlen(data) + 1, sizeof(u64));
+ swap_sample_id_all(event, data);
+ }
}

-static void perf_event__mmap_swap(union perf_event *event)
+static void perf_event__mmap_swap(union perf_event *event,
+ bool sample_id_all)
{
event->mmap.pid = bswap_32(event->mmap.pid);
event->mmap.tid = bswap_32(event->mmap.tid);
event->mmap.start = bswap_64(event->mmap.start);
event->mmap.len = bswap_64(event->mmap.len);
event->mmap.pgoff = bswap_64(event->mmap.pgoff);
+
+ if (sample_id_all) {
+ void *data = &event->mmap.filename;
+
+ data += ALIGN(strlen(data) + 1, sizeof(u64));
+ swap_sample_id_all(event, data);
+ }
}

-static void perf_event__task_swap(union perf_event *event)
+static void perf_event__task_swap(union perf_event *event, bool sample_id_all)
{
event->fork.pid = bswap_32(event->fork.pid);
event->fork.tid = bswap_32(event->fork.tid);
event->fork.ppid = bswap_32(event->fork.ppid);
event->fork.ptid = bswap_32(event->fork.ptid);
event->fork.time = bswap_64(event->fork.time);
+
+ if (sample_id_all)
+ swap_sample_id_all(event, &event->fork + 1);
}

-static void perf_event__read_swap(union perf_event *event)
+static void perf_event__read_swap(union perf_event *event, bool sample_id_all)
{
event->read.pid = bswap_32(event->read.pid);
event->read.tid = bswap_32(event->read.tid);
@@ -492,6 +520,9 @@ static void perf_event__read_swap(union perf_event *event)
event->read.time_enabled = bswap_64(event->read.time_enabled);
event->read.time_running = bswap_64(event->read.time_running);
event->read.id = bswap_64(event->read.id);
+
+ if (sample_id_all)
+ swap_sample_id_all(event, &event->read + 1);
}

static u8 revbyte(u8 b)
@@ -543,7 +574,8 @@ void perf_event__attr_swap(struct perf_event_attr *attr)
swap_bitfield((u8 *) (&attr->read_format + 1), sizeof(u64));
}

-static void perf_event__hdr_attr_swap(union perf_event *event)
+static void perf_event__hdr_attr_swap(union perf_event *event,
+ bool sample_id_all __used)
{
size_t size;

@@ -554,18 +586,21 @@ static void perf_event__hdr_attr_swap(union perf_event *event)
mem_bswap_64(event->attr.id, size);
}

-static void perf_event__event_type_swap(union perf_event *event)
+static void perf_event__event_type_swap(union perf_event *event,
+ bool sample_id_all __used)
{
event->event_type.event_type.event_id =
bswap_64(event->event_type.event_type.event_id);
}

-static void perf_event__tracing_data_swap(union perf_event *event)
+static void perf_event__tracing_data_swap(union perf_event *event,
+ bool sample_id_all __used)
{
event->tracing_data.size = bswap_32(event->tracing_data.size);
}

-typedef void (*perf_event__swap_op)(union perf_event *event);
+typedef void (*perf_event__swap_op)(union perf_event *event,
+ bool sample_id_all);

static perf_event__swap_op perf_event__swap_ops[] = {
[PERF_RECORD_MMAP] = perf_event__mmap_swap,
@@ -999,6 +1034,15 @@ static int perf_session__process_user_event(struct perf_session *session, union
}
}

+static void event_swap(union perf_event *event, bool sample_id_all)
+{
+ perf_event__swap_op swap;
+
+ swap = perf_event__swap_ops[event->header.type];
+ if (swap)
+ swap(event, sample_id_all);
+}
+
static int perf_session__process_event(struct perf_session *session,
union perf_event *event,
struct perf_tool *tool,
@@ -1007,9 +1051,8 @@ static int perf_session__process_event(struct perf_session *session,
struct perf_sample sample;
int ret;

- if (session->header.needs_swap &&
- perf_event__swap_ops[event->header.type])
- perf_event__swap_ops[event->header.type](event);
+ if (session->header.needs_swap)
+ event_swap(event, session->sample_id_all);

if (event->header.type >= PERF_RECORD_HEADER_MAX)
return -EINVAL;
--
1.7.1

2012-06-01 22:18:24

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 05/15] perf tools: Check if callchain is corrupted

From: Namhyung Kim <[email protected]>

We faced segmentation fault on perf top -G at very high sampling rate
due to a corrupted callchain. While the root cause was not revealed (I
failed to figure it out), this patch tries to protect us from the
segfault on such cases.

Reported-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Namhyung Kim <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Sunjin Yang <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
include/linux/perf_event.h | 4 ++--
tools/perf/util/session.c | 14 +++++++++++++-
2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index f325786..1817d40 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -555,6 +555,8 @@ enum perf_event_type {
PERF_RECORD_MAX, /* non-ABI */
};

+#define PERF_MAX_STACK_DEPTH 255
+
enum perf_callchain_context {
PERF_CONTEXT_HV = (__u64)-32,
PERF_CONTEXT_KERNEL = (__u64)-128,
@@ -609,8 +611,6 @@ struct perf_guest_info_callbacks {
#include <linux/sysfs.h>
#include <asm/local.h>

-#define PERF_MAX_STACK_DEPTH 255
-
struct perf_callchain_entry {
__u64 nr;
__u64 ip[PERF_MAX_STACK_DEPTH];
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 3b6f8e4..04d1e33 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -300,6 +300,11 @@ int machine__resolve_callchain(struct machine *self,

callchain_cursor_reset(&callchain_cursor);

+ if (chain->nr > PERF_MAX_STACK_DEPTH) {
+ pr_warning("corrupted callchain. skipping...\n");
+ return 0;
+ }
+
for (i = 0; i < chain->nr; i++) {
u64 ip;
struct addr_location al;
@@ -318,7 +323,14 @@ int machine__resolve_callchain(struct machine *self,
case PERF_CONTEXT_USER:
cpumode = PERF_RECORD_MISC_USER; break;
default:
- break;
+ pr_debug("invalid callchain context: "
+ "%"PRId64"\n", (s64) ip);
+ /*
+ * It seems the callchain is corrupted.
+ * Discard all.
+ */
+ callchain_cursor_reset(&callchain_cursor);
+ return 0;
}
continue;
}
--
1.7.1

2012-06-01 22:18:22

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 13/15] perf uprobes: Remove unnecessary check before strlist__delete

From: Srikar Dronamraju <[email protected]>

Since strlist__delete() itself checks, the additional check before
calling strlist__delete() is redundant.

No Functional change.

Signed-off-by: Srikar Dronamraju <[email protected]>
Suggested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Ananth N Mavinakayanahalli <[email protected]>
Cc: Anton Arapov <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Masami Hiramatsu <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Steven Rostedt <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/probe-event.c | 8 ++------
1 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 59dccc9..0dda25d 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2164,16 +2164,12 @@ int del_perf_probe_events(struct strlist *dellist)

error:
if (kfd >= 0) {
- if (namelist)
- strlist__delete(namelist);
-
+ strlist__delete(namelist);
close(kfd);
}

if (ufd >= 0) {
- if (unamelist)
- strlist__delete(unamelist);
-
+ strlist__delete(unamelist);
close(ufd);
}

--
1.7.1

2012-06-01 22:18:20

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 11/15] perf evsel: Fix 32 bit values endianity swap for sample_id_all header

From: Jiri Olsa <[email protected]>

We swap the sample_id_all header by u64 pointers. Some members of the
header happen to be 32 bit values. We need to handle them separatelly.

Together with other endianity patches, this change fixies perf report
discrepancies on origin and target systems as described in test 1 below,
e.g. following perf report diff:

...
0.12% ps [kernel.kallsyms] [k] clear_page
- 0.12% awk bash [.] alloc_word_desc
+ 0.12% awk bash [.] yyparse
0.11% beah-rhts-task libpython2.6.so.1.0 [.] 0x5560e
0.10% perf libc-2.12.so [.] __ctype_toupper_loc
- 0.09% rhts-test-runne bash [.] maybe_make_export_env
+ 0.09% rhts-test-runne bash [.] 0x385a0
0.09% ps [kernel.kallsyms] [k] page_fault
...

Note, running following to test perf endianity handling:
test 1)
- origin system:
# perf record -a -- sleep 10 (any perf record will do)
# perf report > report.origin
# perf archive perf.data

- copy the perf.data, report.origin and perf.data.tar.bz2
to a target system and run:
# tar xjvf perf.data.tar.bz2 -C ~/.debug
# perf report > report.target
# diff -u report.origin report.target

- the diff should produce no output
(besides some white space stuff and possibly different
date/TZ output)

test 2)
- origin system:
# perf record -ag -fo /tmp/perf.data -- sleep 1
- mount origin system root to the target system on /mnt/origin
- target system:
# perf script --symfs /mnt/origin -I -i /mnt/origin/tmp/perf.data \
--kallsyms /mnt/origin/proc/kallsyms
- complete perf.data header is displayed

Signed-off-by: Jiri Olsa <[email protected]>
Reviewed-by: David Ahern <[email protected]>
Tested-by: David Ahern <[email protected]>
Cc: Corey Ashford <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/evsel.c | 29 ++++++++++++++++++++++-------
1 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 91d1913..9f6cebd 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -494,16 +494,24 @@ int perf_evsel__open_per_thread(struct perf_evsel *evsel,
}

static int perf_event__parse_id_sample(const union perf_event *event, u64 type,
- struct perf_sample *sample)
+ struct perf_sample *sample,
+ bool swapped)
{
const u64 *array = event->sample.array;
+ union u64_swap u;

array += ((event->header.size -
sizeof(event->header)) / sizeof(u64)) - 1;

if (type & PERF_SAMPLE_CPU) {
- u32 *p = (u32 *)array;
- sample->cpu = *p;
+ u.val64 = *array;
+ if (swapped) {
+ /* undo swap of u64, then swap on individual u32s */
+ u.val64 = bswap_64(u.val64);
+ u.val32[0] = bswap_32(u.val32[0]);
+ }
+
+ sample->cpu = u.val32[0];
array--;
}

@@ -523,9 +531,16 @@ static int perf_event__parse_id_sample(const union perf_event *event, u64 type,
}

if (type & PERF_SAMPLE_TID) {
- u32 *p = (u32 *)array;
- sample->pid = p[0];
- sample->tid = p[1];
+ u.val64 = *array;
+ if (swapped) {
+ /* undo swap of u64, then swap on individual u32s */
+ u.val64 = bswap_64(u.val64);
+ u.val32[0] = bswap_32(u.val32[0]);
+ u.val32[1] = bswap_32(u.val32[1]);
+ }
+
+ sample->pid = u.val32[0];
+ sample->tid = u.val32[1];
}

return 0;
@@ -562,7 +577,7 @@ int perf_event__parse_sample(const union perf_event *event, u64 type,
if (event->header.type != PERF_RECORD_SAMPLE) {
if (!sample_id_all)
return 0;
- return perf_event__parse_id_sample(event, type, data);
+ return perf_event__parse_id_sample(event, type, data, swapped);
}

array = event->sample.array;
--
1.7.1

2012-06-01 22:18:18

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 12/15] perf symbols: Check for valid dso before creating map

From: Srikar Dronamraju <[email protected]>

dso__new() can return NULL. Hence verify dso before creating a new map.

Signed-off-by: Srikar Dronamraju <[email protected]>
Suggested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Ananth N Mavinakayanahalli <[email protected]>
Cc: Anton Arapov <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Masami Hiramatsu <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Steven Rostedt <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/symbol.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 9d04dcd..3e2e5ea 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -2817,8 +2817,11 @@ int machine__load_vmlinux_path(struct machine *machine, enum map_type type,

struct map *dso__new_map(const char *name)
{
+ struct map *map = NULL;
struct dso *dso = dso__new(name);
- struct map *map = map__new2(0, dso, MAP__FUNCTION);
+
+ if (dso)
+ map = map__new2(0, dso, MAP__FUNCTION);

return map;
}
--
1.7.1

2012-06-01 22:19:32

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 03/15] perf tools: Fix pager on minimal-install embedded systems

From: Avik Sil <[email protected]>

Some Distributions may lack "less" package being included by default,
e.g., Linaro nano rootfs. In those cases use the portable "pager"
command instead of "less".

Signed-off-by: Avik Sil <[email protected]>
Acked-by: Ingo Molnar <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/pager.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/tools/perf/util/pager.c b/tools/perf/util/pager.c
index 1915de2..3322b84 100644
--- a/tools/perf/util/pager.c
+++ b/tools/perf/util/pager.c
@@ -57,6 +57,10 @@ void setup_pager(void)
}
if (!pager)
pager = getenv("PAGER");
+ if (!pager) {
+ if (!access("/usr/bin/pager", X_OK))
+ pager = "/usr/bin/pager";
+ }
if (!pager)
pager = "less";
else if (!*pager || !strcmp(pager, "cat"))
--
1.7.1

2012-06-01 22:19:31

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 08/15] perf evlist: Pass third argument to ioctl explicitly

From: Namhyung Kim <[email protected]>

The ioctl on perf event fd wants 3 arguments but we only passed 2. As
the only user of the functions is perf record and it calls them for
every event (regardless of group setting), just pass 0 for now.

Signed-off-by: Namhyung Kim <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/evlist.c | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index ed277e5..7400fb3 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -274,7 +274,8 @@ void perf_evlist__disable(struct perf_evlist *evlist)
for (cpu = 0; cpu < evlist->cpus->nr; cpu++) {
list_for_each_entry(pos, &evlist->entries, node) {
for (thread = 0; thread < evlist->threads->nr; thread++)
- ioctl(FD(pos, cpu, thread), PERF_EVENT_IOC_DISABLE);
+ ioctl(FD(pos, cpu, thread),
+ PERF_EVENT_IOC_DISABLE, 0);
}
}
}
@@ -287,7 +288,8 @@ void perf_evlist__enable(struct perf_evlist *evlist)
for (cpu = 0; cpu < evlist->cpus->nr; cpu++) {
list_for_each_entry(pos, &evlist->entries, node) {
for (thread = 0; thread < evlist->threads->nr; thread++)
- ioctl(FD(pos, cpu, thread), PERF_EVENT_IOC_ENABLE);
+ ioctl(FD(pos, cpu, thread),
+ PERF_EVENT_IOC_ENABLE, 0);
}
}
}
--
1.7.1

2012-06-01 22:19:29

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 02/15] perf tools: Fix make tarballs

From: Arnaldo Carvalho de Melo <[email protected]>

The patch series that introduced the top level tools/ makefile and the
libtraceevent broke this feature where files needed to build in a
detached tarball were not included in the MANIFEST file and thus not
included in the tarball.

Fix it by adding the relevant files to the MANIFEST.

Cc: Borislav Petkov <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Mike Galbraith <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Stephane Eranian <[email protected]>
Cc: Steven Rostedt <[email protected]>
Link: http://lkml.kernel.org/n/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/MANIFEST | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST
index 5476bc0..b4b572e 100644
--- a/tools/perf/MANIFEST
+++ b/tools/perf/MANIFEST
@@ -1,4 +1,6 @@
tools/perf
+tools/scripts
+tools/lib/traceevent
include/linux/const.h
include/linux/perf_event.h
include/linux/rbtree.h
--
1.7.1

2012-06-01 22:20:14

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 04/15] perf callchain: Make callchain cursors TLS

From: Namhyung Kim <[email protected]>

perf top -G has a race on callchain cursor between main thread and
display thread. Since the callchain cursors are used locally make them
thread-local data would solve the problem.

Signed-off-by: Namhyung Kim <[email protected]>
Reported-by: Sunjin Yang <[email protected]>
Suggested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Sunjin Yang <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/builtin-report.c | 2 +-
tools/perf/builtin-top.c | 2 +-
tools/perf/util/callchain.c | 2 ++
tools/perf/util/callchain.h | 2 ++
tools/perf/util/hist.c | 7 ++++---
tools/perf/util/hist.h | 2 --
tools/perf/util/session.c | 14 +++++++-------
7 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 2400e00..25249f7 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -152,7 +152,7 @@ static int perf_evsel__add_hist_entry(struct perf_evsel *evsel,

if (symbol_conf.use_callchain) {
err = callchain_append(he->callchain,
- &evsel->hists.callchain_cursor,
+ &callchain_cursor,
sample->period);
if (err)
return err;
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 871b540..6bb0277 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -787,7 +787,7 @@ static void perf_event__process_sample(struct perf_tool *tool,
}

if (symbol_conf.use_callchain) {
- err = callchain_append(he->callchain, &evsel->hists.callchain_cursor,
+ err = callchain_append(he->callchain, &callchain_cursor,
sample->period);
if (err)
return;
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index 9f7106a..3a6bff4 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -18,6 +18,8 @@
#include "util.h"
#include "callchain.h"

+__thread struct callchain_cursor callchain_cursor;
+
bool ip_callchain__valid(struct ip_callchain *chain,
const union perf_event *event)
{
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index 7f9c0f1..3bdb407 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -76,6 +76,8 @@ struct callchain_cursor {
struct callchain_cursor_node *curr;
};

+extern __thread struct callchain_cursor callchain_cursor;
+
static inline void callchain_init(struct callchain_root *root)
{
INIT_LIST_HEAD(&root->node.siblings);
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 1293b5e..514e2a4 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -378,7 +378,7 @@ void hist_entry__free(struct hist_entry *he)
* collapse the histogram
*/

-static bool hists__collapse_insert_entry(struct hists *hists,
+static bool hists__collapse_insert_entry(struct hists *hists __used,
struct rb_root *root,
struct hist_entry *he)
{
@@ -397,8 +397,9 @@ static bool hists__collapse_insert_entry(struct hists *hists,
iter->period += he->period;
iter->nr_events += he->nr_events;
if (symbol_conf.use_callchain) {
- callchain_cursor_reset(&hists->callchain_cursor);
- callchain_merge(&hists->callchain_cursor, iter->callchain,
+ callchain_cursor_reset(&callchain_cursor);
+ callchain_merge(&callchain_cursor,
+ iter->callchain,
he->callchain);
}
hist_entry__free(he);
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index cfc64e2..34bb556 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -67,8 +67,6 @@ struct hists {
struct events_stats stats;
u64 event_stream;
u16 col_len[HISTC_NR_COLS];
- /* Best would be to reuse the session callchain cursor */
- struct callchain_cursor callchain_cursor;
};

struct hist_entry *__hists__add_entry(struct hists *self,
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 4820614..3b6f8e4 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -288,7 +288,8 @@ struct branch_info *machine__resolve_bstack(struct machine *self,
return bi;
}

-int machine__resolve_callchain(struct machine *self, struct perf_evsel *evsel,
+int machine__resolve_callchain(struct machine *self,
+ struct perf_evsel *evsel __used,
struct thread *thread,
struct ip_callchain *chain,
struct symbol **parent)
@@ -297,7 +298,7 @@ int machine__resolve_callchain(struct machine *self, struct perf_evsel *evsel,
unsigned int i;
int err;

- callchain_cursor_reset(&evsel->hists.callchain_cursor);
+ callchain_cursor_reset(&callchain_cursor);

for (i = 0; i < chain->nr; i++) {
u64 ip;
@@ -333,7 +334,7 @@ int machine__resolve_callchain(struct machine *self, struct perf_evsel *evsel,
break;
}

- err = callchain_cursor_append(&evsel->hists.callchain_cursor,
+ err = callchain_cursor_append(&callchain_cursor,
ip, al.map, al.sym);
if (err)
return err;
@@ -1428,7 +1429,6 @@ void perf_event__print_ip(union perf_event *event, struct perf_sample *sample,
int print_sym, int print_dso, int print_symoffset)
{
struct addr_location al;
- struct callchain_cursor *cursor = &evsel->hists.callchain_cursor;
struct callchain_cursor_node *node;

if (perf_event__preprocess_sample(event, machine, &al, sample,
@@ -1446,10 +1446,10 @@ void perf_event__print_ip(union perf_event *event, struct perf_sample *sample,
error("Failed to resolve callchain. Skipping\n");
return;
}
- callchain_cursor_commit(cursor);
+ callchain_cursor_commit(&callchain_cursor);

while (1) {
- node = callchain_cursor_current(cursor);
+ node = callchain_cursor_current(&callchain_cursor);
if (!node)
break;

@@ -1465,7 +1465,7 @@ void perf_event__print_ip(union perf_event *event, struct perf_sample *sample,
}
printf("\n");

- callchain_cursor_advance(cursor);
+ callchain_cursor_advance(&callchain_cursor);
}

} else {
--
1.7.1

2012-06-01 22:20:12

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: [PATCH 07/15] perf tools: Update ioctl documentation for PERF_IOC_FLAG_GROUP

From: Namhyung Kim <[email protected]>

The ioctl interface of perf event fd receives 3 arguments to control
event group behavior but it lacked documentation.

Signed-off-by: Namhyung Kim <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/design.txt | 7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/tools/perf/design.txt b/tools/perf/design.txt
index bd0bb1b..67e5d0c 100644
--- a/tools/perf/design.txt
+++ b/tools/perf/design.txt
@@ -409,14 +409,15 @@ Counters can be enabled and disabled in two ways: via ioctl and via
prctl. When a counter is disabled, it doesn't count or generate
events but does continue to exist and maintain its count value.

-An individual counter or counter group can be enabled with
+An individual counter can be enabled with

- ioctl(fd, PERF_EVENT_IOC_ENABLE);
+ ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);

or disabled with

- ioctl(fd, PERF_EVENT_IOC_DISABLE);
+ ioctl(fd, PERF_EVENT_IOC_DISABLE, 0);

+For a counter group, pass PERF_IOC_FLAG_GROUP as the third argument.
Enabling or disabling the leader of a group enables or disables the
whole group; that is, while the group leader is disabled, none of the
counters in the group will count. Enabling or disabling a member of a
--
1.7.1

2012-06-01 22:45:59

by David Ahern

[permalink] [raw]
Subject: Re: [GIT PULL 00/15] perf/urgent fixes

On 6/1/12 4:16 PM, Arnaldo Carvalho de Melo wrote:
> Hi Ingo,
>
> Please consider pulling, this is in addition to what already were in
> perf/urgent.
>
> - Arnaldo
>
> The following changes since commit 79695e1bb65ba0e21488c360a1bed6e358354aaa:
>
> perf stat: Initialize default events wrt exclude_{guest,host} (2012-05-30 14:02:38 -0300)
>
> are available in the git repository at:
> git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-urgent-for-mingo
>
> Arnaldo Carvalho de Melo (2):
> perf tools: Fix make tarballs
> perf tools: Make --version show kernel version instead of pull req tag
>
> Avik Sil (1):
> perf tools: Fix pager on minimal-install embedded systems
>
> David Ahern (2):
> perf script: Fix regression in callchain dso name
> perf tool: Build fix, remove duplicate declarations
>
> Jiri Olsa (3):
> perf symbols: Handle different endians properly during symbol load
> perf session: Handle endianity swap on sample_id_all header data
> perf evsel: Fix 32 bit values endianity swap for sample_id_all header

you are missing:

http://marc.info/?l=linux-kernel&m=133770186330032&w=2

2012-06-01 23:08:57

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [GIT PULL 00/15] perf/urgent fixes

Em Fri, Jun 01, 2012 at 04:45:50PM -0600, David Ahern escreveu:
> On 6/1/12 4:16 PM, Arnaldo Carvalho de Melo wrote:
> >Jiri Olsa (3):
> > perf symbols: Handle different endians properly during symbol load
> > perf session: Handle endianity swap on sample_id_all header data
> > perf evsel: Fix 32 bit values endianity swap for sample_id_all header
>
> you are missing:
>
> http://marc.info/?l=linux-kernel&m=133770186330032&w=2

Will go on the next round, I guess I missed it because it was "lost" in
the middle of a thread, i.e. by looking at the my mailbox it didn't
stand out because it had a "Re: " in front :-\

- Arnaldo

2012-06-06 06:51:10

by Ingo Molnar

[permalink] [raw]
Subject: Re: [GIT PULL 00/15] perf/urgent fixes


* Arnaldo Carvalho de Melo <[email protected]> wrote:

> Hi Ingo,
>
> Please consider pulling, this is in addition to what already were in
> perf/urgent.
>
> - Arnaldo
>
> The following changes since commit 79695e1bb65ba0e21488c360a1bed6e358354aaa:
>
> perf stat: Initialize default events wrt exclude_{guest,host} (2012-05-30 14:02:38 -0300)
>
> are available in the git repository at:
> git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-urgent-for-mingo
>
> Arnaldo Carvalho de Melo (2):
> perf tools: Fix make tarballs
> perf tools: Make --version show kernel version instead of pull req tag
>
> Avik Sil (1):
> perf tools: Fix pager on minimal-install embedded systems
>
> David Ahern (2):
> perf script: Fix regression in callchain dso name
> perf tool: Build fix, remove duplicate declarations
>
> Jiri Olsa (3):
> perf symbols: Handle different endians properly during symbol load
> perf session: Handle endianity swap on sample_id_all header data
> perf evsel: Fix 32 bit values endianity swap for sample_id_all header
>
> Namhyung Kim (5):
> perf callchain: Make callchain cursors TLS
> perf tools: Check if callchain is corrupted
> perf tools: Update ioctl documentation for PERF_IOC_FLAG_GROUP
> perf evlist: Pass third argument to ioctl explicitly
> perf: Remove duplicate invocation on perf_event_for_each
>
> Srikar Dronamraju (2):
> perf symbols: Check for valid dso before creating map
> perf uprobes: Remove unnecessary check before strlist__delete
>
> include/linux/perf_event.h | 4 +-
> kernel/events/core.c | 1 -
> tools/perf/MANIFEST | 2 +
> tools/perf/builtin-report.c | 2 +-
> tools/perf/builtin-top.c | 2 +-
> tools/perf/design.txt | 7 ++-
> tools/perf/util/PERF-VERSION-GEN | 2 +-
> tools/perf/util/callchain.c | 2 +
> tools/perf/util/callchain.h | 2 +
> tools/perf/util/evlist.c | 6 ++-
> tools/perf/util/evsel.c | 29 +++++++++---
> tools/perf/util/hist.c | 7 ++-
> tools/perf/util/hist.h | 2 -
> tools/perf/util/pager.c | 4 ++
> tools/perf/util/probe-event.c | 8 +--
> tools/perf/util/session.c | 97 +++++++++++++++++++++++++++++--------
> tools/perf/util/symbol.c | 38 ++++++++++++++-
> tools/perf/util/symbol.h | 34 ++++++++++++-
> tools/perf/util/util.h | 6 +--
> 19 files changed, 195 insertions(+), 60 deletions(-)

Hm, I got this build failure:

bench/mem-memcpy.c: In function ‘bench_mem_memcpy’:
bench/mem-memcpy.c:193:2: error: implicit declaration of function ‘perf_atoll’ [-Werror=implicit-function-declaration]
bench/mem-memcpy.c:193:2: error: nested extern declaration of ‘perf_atoll’ [-Werror=nested-externs]

Which appears to be a result of:

6b7df4a0237a perf tool: Build fix, remove duplicate declarations

Those declarations were not so unused on this fresh install of
Fedora 17.

Luckily, the offending commit was the last one in the series, so
I merged your tree at cb7225f, excluding only the buggy commit.

Thanks,

Ingo

2012-06-06 22:50:40

by David Ahern

[permalink] [raw]
Subject: Re: [GIT PULL 00/15] perf/urgent fixes

On 6/6/12 12:50 AM, Ingo Molnar wrote:
> Hm, I got this build failure:
>
> bench/mem-memcpy.c: In function ‘bench_mem_memcpy’:
> bench/mem-memcpy.c:193:2: error: implicit declaration of function ‘perf_atoll’ [-Werror=implicit-function-declaration]
> bench/mem-memcpy.c:193:2: error: nested extern declaration of ‘perf_atoll’ [-Werror=nested-externs]

I just created a new F17-x86_64 VM and Arnaldo's perf/urgent branch
builds fine (which includes this patch).

>
> Which appears to be a result of:
>
> 6b7df4a0237a perf tool: Build fix, remove duplicate declarations
>
> Those declarations were not so unused on this fresh install of
> Fedora 17.

32-bit? 64-bit?

This would fix your compile problem, but I have no way of verifying
since it builds fine for me.

diff --git a/tools/perf/bench/mem-memcpy.c b/tools/perf/bench/mem-memcpy.c
index 7155722..535b4b8 100644
--- a/tools/perf/bench/mem-memcpy.c
+++ b/tools/perf/bench/mem-memcpy.c
@@ -10,6 +10,7 @@
#include "../util/util.h"
#include "../util/parse-options.h"
#include "../util/header.h"
+#include "../util/string.h"
#include "bench.h"
#include "mem-memcpy-arch.h"

2012-06-07 02:22:09

by Namhyung Kim

[permalink] [raw]
Subject: Re: [GIT PULL 00/15] perf/urgent fixes

Hi, David

On Wed, 06 Jun 2012 16:50:31 -0600, David Ahern wrote:
> On 6/6/12 12:50 AM, Ingo Molnar wrote:
>> Hm, I got this build failure:
>>
>> bench/mem-memcpy.c: In function ‘bench_mem_memcpy’:
>> bench/mem-memcpy.c:193:2: error: implicit declaration of function ‘perf_atoll’ [-Werror=implicit-function-declaration]
>> bench/mem-memcpy.c:193:2: error: nested extern declaration of ‘perf_atoll’ [-Werror=nested-externs]
>
> I just created a new F17-x86_64 VM and Arnaldo's perf/urgent branch
> builds fine (which includes this patch).
>

I can reproduce it on my F17-x86_64 - current tip + your patch gives:

$ make
PERF_VERSION = 3.5.rc1.99.g7ac4a
CC perf.o
CC builtin-annotate.o
CC builtin-bench.o
CC bench/sched-messaging.o
CC bench/sched-pipe.o
CC bench/mem-memcpy-x86-64-asm.o
CC bench/mem-memset-x86-64-asm.o
CC bench/mem-memcpy.o
bench/mem-memcpy.c: In function ‘bench_mem_memcpy’:
bench/mem-memcpy.c:193:2: error: implicit declaration of function ‘perf_atoll’ [-Werror=implicit-function-declaration]
bench/mem-memcpy.c:193:2: error: nested extern declaration of ‘perf_atoll’ [-Werror=nested-externs]
cc1: all warnings being treated as errors
make: *** [bench/mem-memcpy.o] Error 1



>>
>> Which appears to be a result of:
>>
>> 6b7df4a0237a perf tool: Build fix, remove duplicate declarations
>>
>> Those declarations were not so unused on this fresh install of
>> Fedora 17.
>
> 32-bit? 64-bit?
>
> This would fix your compile problem, but I have no way of verifying
> since it builds fine for me.
>
> diff --git a/tools/perf/bench/mem-memcpy.c b/tools/perf/bench/mem-memcpy.c
> index 7155722..535b4b8 100644
> --- a/tools/perf/bench/mem-memcpy.c
> +++ b/tools/perf/bench/mem-memcpy.c
> @@ -10,6 +10,7 @@
> #include "../util/util.h"
> #include "../util/parse-options.h"
> #include "../util/header.h"
> +#include "../util/string.h"
> #include "bench.h"
> #include "mem-memcpy-arch.h"

After applying this (on top of your patch):

$ make
PERF_VERSION = 3.5.rc1.99.g7ac4a.dirty
CC perf.o
CC bench/mem-memcpy.o
bench/mem-memcpy.c:13:28: fatal error: ../util/string.h: No such file or directory
compilation terminated.
make: *** [bench/mem-memcpy.o] Error 1

Thanks,
Namhyung

2012-06-07 03:52:20

by David Ahern

[permalink] [raw]
Subject: Re: [GIT PULL 00/15] perf/urgent fixes

On 6/6/12 12:50 AM, Ingo Molnar wrote:
> Hm, I got this build failure:
>
> bench/mem-memcpy.c: In function ‘bench_mem_memcpy’:
> bench/mem-memcpy.c:193:2: error: implicit declaration of function ‘perf_atoll’ [-Werror=implicit-function-declaration]
> bench/mem-memcpy.c:193:2: error: nested extern declaration of ‘perf_atoll’ [-Werror=nested-externs]
>
> Which appears to be a result of:
>
> 6b7df4a0237a perf tool: Build fix, remove duplicate declarations
>
> Those declarations were not so unused on this fresh install of
> Fedora 17.
>
> Luckily, the offending commit was the last one in the series, so
> I merged your tree at cb7225f, excluding only the buggy commit.
>
> Thanks,
>
> Ingo


I see the problem now: I had a stale util/string.h file which was
removed by e206d556. Local problem (stupidity) as to why. Sorry for the
noise.

Arnaldo: please drop the patch.

David

2012-06-07 16:09:46

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [GIT PULL 00/15] perf/urgent fixes

Em Wed, Jun 06, 2012 at 09:52:07PM -0600, David Ahern escreveu:
> On 6/6/12 12:50 AM, Ingo Molnar wrote:
> >Those declarations were not so unused on this fresh install of
> >Fedora 17.

> >Luckily, the offending commit was the last one in the series, so
> >I merged your tree at cb7225f, excluding only the buggy commit.

> I see the problem now: I had a stale util/string.h file which was
> removed by e206d556. Local problem (stupidity) as to why. Sorry for
> the noise.

> Arnaldo: please drop the patch.

Thanks for getting to the bottom of it, and strange that I my test
builds didn't catch this (f14 and RHEL6 tho).

I guess its time for me to move this machine to f17 and do the ritual
dance of complaining about gnome3...

- Arnaldo

2012-06-07 16:11:47

by Steven Rostedt

[permalink] [raw]
Subject: Re: [GIT PULL 00/15] perf/urgent fixes

On Thu, 2012-06-07 at 13:09 -0300, Arnaldo Carvalho de Melo wrote:

> I guess its time for me to move this machine to f17 and do the ritual
> dance of complaining about gnome3...
>

I should too, but that's what KVM is for :-)

-- Steve

2012-06-07 16:43:27

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [GIT PULL 00/15] perf/urgent fixes

Em Thu, Jun 07, 2012 at 12:11:43PM -0400, Steven Rostedt escreveu:
> On Thu, 2012-06-07 at 13:09 -0300, Arnaldo Carvalho de Melo wrote:
> > I guess its time for me to move this machine to f17 and do the ritual
> > dance of complaining about gnome3...
>
> I should too, but that's what KVM is for :-)

Well, that too, but the disk I had with the kvm images, well, got
busted, so I have to reinstall those VMs as well :-\

- Arnaldo

Subject: Re: [GIT PULL 00/15] perf/urgent fixes

On Thu, Jun 07, 2012 at 12:11:43PM -0400, Steven Rostedt wrote:
> On Thu, 2012-06-07 at 13:09 -0300, Arnaldo Carvalho de Melo wrote:
>
> > I guess its time for me to move this machine to f17 and do the ritual
> > dance of complaining about gnome3...
> >
>
> I should too, but that's what KVM is for :-)

... to complain about gnome3?

:-)

--
Regards/Gruss,
Boris.

Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach
GM: Alberto Bozzo
Reg: Dornach, Landkreis Muenchen
HRB Nr. 43632 WEEE Registernr: 129 19551