* [GIT PULL 00/21] perf/core improvements and fixes
@ 2013-01-30 14:46 Arnaldo Carvalho de Melo
2013-01-30 14:46 ` [PATCH 01/21] tools lib traceevent: Handle dynamic array's element size properly Arnaldo Carvalho de Melo
` (21 more replies)
0 siblings, 22 replies; 63+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Andi Kleen,
Andrea Arcangeli, Andrew Morton, Anton Blanchard, Borislav Petkov,
Corey Ashford, David Ahern, Frederic Weisbecker, Hugh Dickins,
Jiri Olsa, linuxppc-dev, Mel Gorman, Michael Ellerman,
Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Hurley,
Peter Zijlstra, Rik van Riel, Stephane Eranian, Steven Rostedt,
Sukadev Bhattiprolu, Thomas Jarosch, arnaldo.melo,
Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling.
Namhyung, Jiri, the 'group report' patches are at acme/perf/group,
will send a pull req later if it survives further testing.
- Arnaldo
The following changes since commit a2d28d0c198b65fac28ea6212f5f8edc77b29c27:
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2013-01-25 11:34:00 +0100)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo
for you to fetch changes up to 5809fde040de2afa477a6c593ce2e8fd2c11d9d3:
perf header: Fix double fclose() on do_write(fd, xxx) failure (2013-01-30 10:40:44 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
. Fix some leaks in exit paths.
. Use memdup where applicable
. Remove some die() calls, allowing callers to handle exit paths
gracefully.
. Correct typo in tools Makefile, fix from Borislav Petkov.
. Add 'perf bench numa mem' NUMA performance measurement suite, from Ingo Molnar.
. Handle dynamic array's element size properly, fix from Jiri Olsa.
. Fix memory leaks on evsel->counts, from Namhyung Kim.
. Make numa benchmark optional, allowing the build in machines where required
numa libraries are not present, fix from Peter Hurley.
. Add interval printing in 'perf stat', from Stephane Eranian.
. Fix compile warnings in tests/attr.c, from Sukadev Bhattiprolu.
. Fix double free, pclose instead of fclose, leaks and double fclose errors
found with the cppcheck tool, from Thomas Jarosch.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Arnaldo Carvalho de Melo (8):
perf tools: Stop using 'self' in strlist
perf tools: Stop using 'self' in map.[ch]
perf tools: Use memdup in map__clone
perf kmem: Use memdup()
perf header: Stop using die() calls when processing tracing data
perf ui browser: Free browser->helpline() on ui_browser__hide()
perf tests: Call machine__exit in the vmlinux matches kallsyms test
perf tests: Fix leaks on PERF_RECORD_* test
Borislav Petkov (1):
tools: Correct typo in tools Makefile
Ingo Molnar (1):
perf: Add 'perf bench numa mem' NUMA performance measurement suite
Jiri Olsa (1):
tools lib traceevent: Handle dynamic array's element size properly
Namhyung Kim (1):
perf evsel: Fix memory leaks on evsel->counts
Peter Hurley (1):
perf tools: Make numa benchmark optional
Stephane Eranian (2):
perf evsel: Add prev_raw_count field
perf stat: Add interval printing
Sukadev Bhattiprolu (1):
perf tools, powerpc: Fix compile warnings in tests/attr.c
Thomas Jarosch (5):
perf tools: Fix possible double free on error
perf sort: Use pclose() instead of fclose() on pipe stream
perf tools: Fix memory leak on error
perf header: Fix memory leak for the "Not caching a kptr_restrict'ed /proc/kallsyms" case
perf header: Fix double fclose() on do_write(fd, xxx) failure
tools/Makefile | 2 +-
tools/lib/traceevent/event-parse.c | 39 +-
tools/perf/Documentation/perf-stat.txt | 4 +
tools/perf/Makefile | 13 +
tools/perf/arch/common.c | 1 +
tools/perf/bench/bench.h | 1 +
tools/perf/bench/numa.c | 1731 ++++++++++++++++++++++++++++++
tools/perf/builtin-bench.c | 17 +
tools/perf/builtin-kmem.c | 6 +-
tools/perf/builtin-stat.c | 158 ++-
tools/perf/config/feature-tests.mak | 11 +
tools/perf/tests/attr.c | 5 +
tools/perf/tests/open-syscall-all-cpus.c | 1 +
tools/perf/tests/perf-record.c | 12 +-
tools/perf/tests/vmlinux-kallsyms.c | 4 +-
tools/perf/ui/browser.c | 2 +
tools/perf/util/event.c | 4 +-
tools/perf/util/evsel.c | 31 +
tools/perf/util/evsel.h | 2 +
tools/perf/util/header.c | 25 +-
tools/perf/util/map.c | 118 +-
tools/perf/util/map.h | 24 +-
tools/perf/util/sort.c | 7 +-
tools/perf/util/strlist.c | 54 +-
tools/perf/util/strlist.h | 42 +-
25 files changed, 2154 insertions(+), 160 deletions(-)
create mode 100644 tools/perf/bench/numa.c
^ permalink raw reply [flat|nested] 63+ messages in thread* [PATCH 01/21] tools lib traceevent: Handle dynamic array's element size properly 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 02/21] perf tools: Stop using 'self' in strlist Arnaldo Carvalho de Melo ` (20 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Steven Rostedt, Arnaldo Carvalho de Melo From: Jiri Olsa <jolsa@redhat.com> Fixing the dynamic array format field parsing. Currently the event_read_fields function could segfault while parsing dynamic array other than string type. The reason is the event->pevent does not need to be set and gets dereferenced unconditionaly. Also adding proper initialization of field->elementsize based on the parsed dynamic type. Signed-off-by: Jiri Olsa <jolsa@redhat.com> Acked-by: Steven Rostedt <rostedt@goodmis.org> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Steven Rostedt <rostedt@goodmis.org> Link: http://lkml.kernel.org/r/1359060403-32422-1-git-send-email-jolsa@redhat.com [ committer note: Made a char pointer parameter const, as requested by Steven ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/lib/traceevent/event-parse.c | 39 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index bb8b3db..82b0606 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c @@ -1223,6 +1223,34 @@ static int field_is_long(struct format_field *field) return 0; } +static unsigned int type_size(const char *name) +{ + /* This covers all FIELD_IS_STRING types. */ + static struct { + const char *type; + unsigned int size; + } table[] = { + { "u8", 1 }, + { "u16", 2 }, + { "u32", 4 }, + { "u64", 8 }, + { "s8", 1 }, + { "s16", 2 }, + { "s32", 4 }, + { "s64", 8 }, + { "char", 1 }, + { }, + }; + int i; + + for (i = 0; table[i].type; i++) { + if (!strcmp(table[i].type, name)) + return table[i].size; + } + + return 0; +} + static int event_read_fields(struct event_format *event, struct format_field **fields) { struct format_field *field = NULL; @@ -1232,6 +1260,8 @@ static int event_read_fields(struct event_format *event, struct format_field **f int count = 0; do { + unsigned int size_dynamic = 0; + type = read_token(&token); if (type == EVENT_NEWLINE) { free_token(token); @@ -1390,6 +1420,7 @@ static int event_read_fields(struct event_format *event, struct format_field **f field->type = new_type; strcat(field->type, " "); strcat(field->type, field->name); + size_dynamic = type_size(field->name); free_token(field->name); strcat(field->type, brackets); field->name = token; @@ -1478,10 +1509,14 @@ static int event_read_fields(struct event_format *event, struct format_field **f if (field->flags & FIELD_IS_ARRAY) { if (field->arraylen) field->elementsize = field->size / field->arraylen; + else if (field->flags & FIELD_IS_DYNAMIC) + field->elementsize = size_dynamic; else if (field->flags & FIELD_IS_STRING) field->elementsize = 1; - else - field->elementsize = event->pevent->long_size; + else if (field->flags & FIELD_IS_LONG) + field->elementsize = event->pevent ? + event->pevent->long_size : + sizeof(long); } else field->elementsize = field->size; -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 02/21] perf tools: Stop using 'self' in strlist 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 01/21] tools lib traceevent: Handle dynamic array's element size properly Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 03/21] perf tools: Stop using 'self' in map.[ch] Arnaldo Carvalho de Melo ` (19 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Arnaldo Carvalho de Melo, David Ahern, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian From: Arnaldo Carvalho de Melo <acme@redhat.com> As suggested by tglx, 'self' should be replaced by something that is more useful. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-933537sxtcz47qs0e0ledmrp@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/strlist.c | 54 +++++++++++++++++++++++------------------------ tools/perf/util/strlist.h | 42 ++++++++++++++++++------------------ 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/tools/perf/util/strlist.c b/tools/perf/util/strlist.c index 155d8b7..55433aa 100644 --- a/tools/perf/util/strlist.c +++ b/tools/perf/util/strlist.c @@ -35,11 +35,11 @@ out_delete: return NULL; } -static void str_node__delete(struct str_node *self, bool dupstr) +static void str_node__delete(struct str_node *snode, bool dupstr) { if (dupstr) - free((void *)self->s); - free(self); + free((void *)snode->s); + free(snode); } static @@ -59,12 +59,12 @@ static int strlist__node_cmp(struct rb_node *rb_node, const void *entry) return strcmp(snode->s, str); } -int strlist__add(struct strlist *self, const char *new_entry) +int strlist__add(struct strlist *slist, const char *new_entry) { - return rblist__add_node(&self->rblist, new_entry); + return rblist__add_node(&slist->rblist, new_entry); } -int strlist__load(struct strlist *self, const char *filename) +int strlist__load(struct strlist *slist, const char *filename) { char entry[1024]; int err; @@ -80,7 +80,7 @@ int strlist__load(struct strlist *self, const char *filename) continue; entry[len - 1] = '\0'; - err = strlist__add(self, entry); + err = strlist__add(slist, entry); if (err != 0) goto out; } @@ -107,56 +107,56 @@ struct str_node *strlist__find(struct strlist *slist, const char *entry) return snode; } -static int strlist__parse_list_entry(struct strlist *self, const char *s) +static int strlist__parse_list_entry(struct strlist *slist, const char *s) { if (strncmp(s, "file://", 7) == 0) - return strlist__load(self, s + 7); + return strlist__load(slist, s + 7); - return strlist__add(self, s); + return strlist__add(slist, s); } -int strlist__parse_list(struct strlist *self, const char *s) +int strlist__parse_list(struct strlist *slist, const char *s) { char *sep; int err; while ((sep = strchr(s, ',')) != NULL) { *sep = '\0'; - err = strlist__parse_list_entry(self, s); + err = strlist__parse_list_entry(slist, s); *sep = ','; if (err != 0) return err; s = sep + 1; } - return *s ? strlist__parse_list_entry(self, s) : 0; + return *s ? strlist__parse_list_entry(slist, s) : 0; } -struct strlist *strlist__new(bool dupstr, const char *slist) +struct strlist *strlist__new(bool dupstr, const char *list) { - struct strlist *self = malloc(sizeof(*self)); + struct strlist *slist = malloc(sizeof(*slist)); - if (self != NULL) { - rblist__init(&self->rblist); - self->rblist.node_cmp = strlist__node_cmp; - self->rblist.node_new = strlist__node_new; - self->rblist.node_delete = strlist__node_delete; + if (slist != NULL) { + rblist__init(&slist->rblist); + slist->rblist.node_cmp = strlist__node_cmp; + slist->rblist.node_new = strlist__node_new; + slist->rblist.node_delete = strlist__node_delete; - self->dupstr = dupstr; - if (slist && strlist__parse_list(self, slist) != 0) + slist->dupstr = dupstr; + if (slist && strlist__parse_list(slist, list) != 0) goto out_error; } - return self; + return slist; out_error: - free(self); + free(slist); return NULL; } -void strlist__delete(struct strlist *self) +void strlist__delete(struct strlist *slist) { - if (self != NULL) - rblist__delete(&self->rblist); + if (slist != NULL) + rblist__delete(&slist->rblist); } struct str_node *strlist__entry(const struct strlist *slist, unsigned int idx) diff --git a/tools/perf/util/strlist.h b/tools/perf/util/strlist.h index dd9f922..5c7f870 100644 --- a/tools/perf/util/strlist.h +++ b/tools/perf/util/strlist.h @@ -17,34 +17,34 @@ struct strlist { }; struct strlist *strlist__new(bool dupstr, const char *slist); -void strlist__delete(struct strlist *self); +void strlist__delete(struct strlist *slist); -void strlist__remove(struct strlist *self, struct str_node *sn); -int strlist__load(struct strlist *self, const char *filename); -int strlist__add(struct strlist *self, const char *str); +void strlist__remove(struct strlist *slist, struct str_node *sn); +int strlist__load(struct strlist *slist, const char *filename); +int strlist__add(struct strlist *slist, const char *str); -struct str_node *strlist__entry(const struct strlist *self, unsigned int idx); -struct str_node *strlist__find(struct strlist *self, const char *entry); +struct str_node *strlist__entry(const struct strlist *slist, unsigned int idx); +struct str_node *strlist__find(struct strlist *slist, const char *entry); -static inline bool strlist__has_entry(struct strlist *self, const char *entry) +static inline bool strlist__has_entry(struct strlist *slist, const char *entry) { - return strlist__find(self, entry) != NULL; + return strlist__find(slist, entry) != NULL; } -static inline bool strlist__empty(const struct strlist *self) +static inline bool strlist__empty(const struct strlist *slist) { - return rblist__empty(&self->rblist); + return rblist__empty(&slist->rblist); } -static inline unsigned int strlist__nr_entries(const struct strlist *self) +static inline unsigned int strlist__nr_entries(const struct strlist *slist) { - return rblist__nr_entries(&self->rblist); + return rblist__nr_entries(&slist->rblist); } /* For strlist iteration */ -static inline struct str_node *strlist__first(struct strlist *self) +static inline struct str_node *strlist__first(struct strlist *slist) { - struct rb_node *rn = rb_first(&self->rblist.entries); + struct rb_node *rn = rb_first(&slist->rblist.entries); return rn ? rb_entry(rn, struct str_node, rb_node) : NULL; } static inline struct str_node *strlist__next(struct str_node *sn) @@ -59,21 +59,21 @@ static inline struct str_node *strlist__next(struct str_node *sn) /** * strlist_for_each - iterate over a strlist * @pos: the &struct str_node to use as a loop cursor. - * @self: the &struct strlist for loop. + * @slist: the &struct strlist for loop. */ -#define strlist__for_each(pos, self) \ - for (pos = strlist__first(self); pos; pos = strlist__next(pos)) +#define strlist__for_each(pos, slist) \ + for (pos = strlist__first(slist); pos; pos = strlist__next(pos)) /** * strlist_for_each_safe - iterate over a strlist safe against removal of * str_node * @pos: the &struct str_node to use as a loop cursor. * @n: another &struct str_node to use as temporary storage. - * @self: the &struct strlist for loop. + * @slist: the &struct strlist for loop. */ -#define strlist__for_each_safe(pos, n, self) \ - for (pos = strlist__first(self), n = strlist__next(pos); pos;\ +#define strlist__for_each_safe(pos, n, slist) \ + for (pos = strlist__first(slist), n = strlist__next(pos); pos;\ pos = n, n = strlist__next(n)) -int strlist__parse_list(struct strlist *self, const char *s); +int strlist__parse_list(struct strlist *slist, const char *s); #endif /* __PERF_STRLIST_H */ -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 03/21] perf tools: Stop using 'self' in map.[ch] 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 01/21] tools lib traceevent: Handle dynamic array's element size properly Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 02/21] perf tools: Stop using 'self' in strlist Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 04/21] perf tools: Use memdup in map__clone Arnaldo Carvalho de Melo ` (18 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Arnaldo Carvalho de Melo, David Ahern, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian From: Arnaldo Carvalho de Melo <acme@redhat.com> As suggested by tglx, 'self' should be replaced by something that is more useful. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-vse2c54m0yahx6p79tmoel03@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/map.c | 118 +++++++++++++++++++++++++------------------------- tools/perf/util/map.h | 24 +++++----- 2 files changed, 70 insertions(+), 72 deletions(-) diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index ff94425..b6b1636 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -29,29 +29,29 @@ static inline int is_no_dso_memory(const char *filename) !strcmp(filename, "[heap]"); } -void map__init(struct map *self, enum map_type type, +void map__init(struct map *map, enum map_type type, u64 start, u64 end, u64 pgoff, struct dso *dso) { - self->type = type; - self->start = start; - self->end = end; - self->pgoff = pgoff; - self->dso = dso; - self->map_ip = map__map_ip; - self->unmap_ip = map__unmap_ip; - RB_CLEAR_NODE(&self->rb_node); - self->groups = NULL; - self->referenced = false; - self->erange_warned = false; + map->type = type; + map->start = start; + map->end = end; + map->pgoff = pgoff; + map->dso = dso; + map->map_ip = map__map_ip; + map->unmap_ip = map__unmap_ip; + RB_CLEAR_NODE(&map->rb_node); + map->groups = NULL; + map->referenced = false; + map->erange_warned = false; } struct map *map__new(struct list_head *dsos__list, u64 start, u64 len, u64 pgoff, u32 pid, char *filename, enum map_type type) { - struct map *self = malloc(sizeof(*self)); + struct map *map = malloc(sizeof(*map)); - if (self != NULL) { + if (map != NULL) { char newfilename[PATH_MAX]; struct dso *dso; int anon, no_dso, vdso; @@ -74,10 +74,10 @@ struct map *map__new(struct list_head *dsos__list, u64 start, u64 len, if (dso == NULL) goto out_delete; - map__init(self, type, start, start + len, pgoff, dso); + map__init(map, type, start, start + len, pgoff, dso); if (anon || no_dso) { - self->map_ip = self->unmap_ip = identity__map_ip; + map->map_ip = map->unmap_ip = identity__map_ip; /* * Set memory without DSO as loaded. All map__find_* @@ -85,12 +85,12 @@ struct map *map__new(struct list_head *dsos__list, u64 start, u64 len, * unnecessary map__load warning. */ if (no_dso) - dso__set_loaded(dso, self->type); + dso__set_loaded(dso, map->type); } } - return self; + return map; out_delete: - free(self); + free(map); return NULL; } @@ -113,48 +113,48 @@ struct map *map__new2(u64 start, struct dso *dso, enum map_type type) return map; } -void map__delete(struct map *self) +void map__delete(struct map *map) { - free(self); + free(map); } -void map__fixup_start(struct map *self) +void map__fixup_start(struct map *map) { - struct rb_root *symbols = &self->dso->symbols[self->type]; + struct rb_root *symbols = &map->dso->symbols[map->type]; struct rb_node *nd = rb_first(symbols); if (nd != NULL) { struct symbol *sym = rb_entry(nd, struct symbol, rb_node); - self->start = sym->start; + map->start = sym->start; } } -void map__fixup_end(struct map *self) +void map__fixup_end(struct map *map) { - struct rb_root *symbols = &self->dso->symbols[self->type]; + struct rb_root *symbols = &map->dso->symbols[map->type]; struct rb_node *nd = rb_last(symbols); if (nd != NULL) { struct symbol *sym = rb_entry(nd, struct symbol, rb_node); - self->end = sym->end; + map->end = sym->end; } } #define DSO__DELETED "(deleted)" -int map__load(struct map *self, symbol_filter_t filter) +int map__load(struct map *map, symbol_filter_t filter) { - const char *name = self->dso->long_name; + const char *name = map->dso->long_name; int nr; - if (dso__loaded(self->dso, self->type)) + if (dso__loaded(map->dso, map->type)) return 0; - nr = dso__load(self->dso, self, filter); + nr = dso__load(map->dso, map, filter); if (nr < 0) { - if (self->dso->has_build_id) { + if (map->dso->has_build_id) { char sbuild_id[BUILD_ID_SIZE * 2 + 1]; - build_id__sprintf(self->dso->build_id, - sizeof(self->dso->build_id), + build_id__sprintf(map->dso->build_id, + sizeof(map->dso->build_id), sbuild_id); pr_warning("%s with build id %s not found", name, sbuild_id); @@ -184,43 +184,41 @@ int map__load(struct map *self, symbol_filter_t filter) * Only applies to the kernel, as its symtabs aren't relative like the * module ones. */ - if (self->dso->kernel) - map__reloc_vmlinux(self); + if (map->dso->kernel) + map__reloc_vmlinux(map); return 0; } -struct symbol *map__find_symbol(struct map *self, u64 addr, +struct symbol *map__find_symbol(struct map *map, u64 addr, symbol_filter_t filter) { - if (map__load(self, filter) < 0) + if (map__load(map, filter) < 0) return NULL; - return dso__find_symbol(self->dso, self->type, addr); + return dso__find_symbol(map->dso, map->type, addr); } -struct symbol *map__find_symbol_by_name(struct map *self, const char *name, +struct symbol *map__find_symbol_by_name(struct map *map, const char *name, symbol_filter_t filter) { - if (map__load(self, filter) < 0) + if (map__load(map, filter) < 0) return NULL; - if (!dso__sorted_by_name(self->dso, self->type)) - dso__sort_by_name(self->dso, self->type); + if (!dso__sorted_by_name(map->dso, map->type)) + dso__sort_by_name(map->dso, map->type); - return dso__find_symbol_by_name(self->dso, self->type, name); + return dso__find_symbol_by_name(map->dso, map->type, name); } -struct map *map__clone(struct map *self) +struct map *map__clone(struct map *map) { - struct map *map = malloc(sizeof(*self)); + struct map *clone = malloc(sizeof(*clone)); - if (!map) - return NULL; + if (clone != NULL) + memcpy(clone, map, sizeof(*clone)); - memcpy(map, self, sizeof(*self)); - - return map; + return clone; } int map__overlap(struct map *l, struct map *r) @@ -237,10 +235,10 @@ int map__overlap(struct map *l, struct map *r) return 0; } -size_t map__fprintf(struct map *self, FILE *fp) +size_t map__fprintf(struct map *map, FILE *fp) { return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s\n", - self->start, self->end, self->pgoff, self->dso->name); + map->start, map->end, map->pgoff, map->dso->name); } size_t map__fprintf_dsoname(struct map *map, FILE *fp) @@ -528,9 +526,9 @@ static u64 map__reloc_unmap_ip(struct map *map, u64 ip) return ip - (s64)map->pgoff; } -void map__reloc_vmlinux(struct map *self) +void map__reloc_vmlinux(struct map *map) { - struct kmap *kmap = map__kmap(self); + struct kmap *kmap = map__kmap(map); s64 reloc; if (!kmap->ref_reloc_sym || !kmap->ref_reloc_sym->unrelocated_addr) @@ -542,9 +540,9 @@ void map__reloc_vmlinux(struct map *self) if (!reloc) return; - self->map_ip = map__reloc_map_ip; - self->unmap_ip = map__reloc_unmap_ip; - self->pgoff = reloc; + map->map_ip = map__reloc_map_ip; + map->unmap_ip = map__reloc_unmap_ip; + map->pgoff = reloc; } void maps__insert(struct rb_root *maps, struct map *map) @@ -567,9 +565,9 @@ void maps__insert(struct rb_root *maps, struct map *map) rb_insert_color(&map->rb_node, maps); } -void maps__remove(struct rb_root *self, struct map *map) +void maps__remove(struct rb_root *maps, struct map *map) { - rb_erase(&map->rb_node, self); + rb_erase(&map->rb_node, maps); } struct map *maps__find(struct rb_root *maps, u64 ip) diff --git a/tools/perf/util/map.h b/tools/perf/util/map.h index bcb39e2..a887f2c 100644 --- a/tools/perf/util/map.h +++ b/tools/perf/util/map.h @@ -57,9 +57,9 @@ struct map_groups { struct machine *machine; }; -static inline struct kmap *map__kmap(struct map *self) +static inline struct kmap *map__kmap(struct map *map) { - return (struct kmap *)(self + 1); + return (struct kmap *)(map + 1); } static inline u64 map__map_ip(struct map *map, u64 ip) @@ -85,27 +85,27 @@ struct symbol; typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym); -void map__init(struct map *self, enum map_type type, +void map__init(struct map *map, enum map_type type, u64 start, u64 end, u64 pgoff, struct dso *dso); struct map *map__new(struct list_head *dsos__list, u64 start, u64 len, u64 pgoff, u32 pid, char *filename, enum map_type type); struct map *map__new2(u64 start, struct dso *dso, enum map_type type); -void map__delete(struct map *self); -struct map *map__clone(struct map *self); +void map__delete(struct map *map); +struct map *map__clone(struct map *map); int map__overlap(struct map *l, struct map *r); -size_t map__fprintf(struct map *self, FILE *fp); +size_t map__fprintf(struct map *map, FILE *fp); size_t map__fprintf_dsoname(struct map *map, FILE *fp); -int map__load(struct map *self, symbol_filter_t filter); -struct symbol *map__find_symbol(struct map *self, +int map__load(struct map *map, symbol_filter_t filter); +struct symbol *map__find_symbol(struct map *map, u64 addr, symbol_filter_t filter); -struct symbol *map__find_symbol_by_name(struct map *self, const char *name, +struct symbol *map__find_symbol_by_name(struct map *map, const char *name, symbol_filter_t filter); -void map__fixup_start(struct map *self); -void map__fixup_end(struct map *self); +void map__fixup_start(struct map *map); +void map__fixup_end(struct map *map); -void map__reloc_vmlinux(struct map *self); +void map__reloc_vmlinux(struct map *map); size_t __map_groups__fprintf_maps(struct map_groups *mg, enum map_type type, int verbose, FILE *fp); -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 04/21] perf tools: Use memdup in map__clone 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (2 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 03/21] perf tools: Stop using 'self' in map.[ch] Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 05/21] perf kmem: Use memdup() Arnaldo Carvalho de Melo ` (17 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Arnaldo Carvalho de Melo, David Ahern, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian From: Arnaldo Carvalho de Melo <acme@redhat.com> We have memdup() exactly for that, remove open coded dup. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-tnsoexrgv6u9l125srq2c7su@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/map.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index b6b1636..6fcb9de 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -11,6 +11,7 @@ #include "strlist.h" #include "vdso.h" #include "build-id.h" +#include <linux/string.h> const char *map_type__name[MAP__NR_TYPES] = { [MAP__FUNCTION] = "Functions", @@ -213,12 +214,7 @@ struct symbol *map__find_symbol_by_name(struct map *map, const char *name, struct map *map__clone(struct map *map) { - struct map *clone = malloc(sizeof(*clone)); - - if (clone != NULL) - memcpy(clone, map, sizeof(*clone)); - - return clone; + return memdup(map, sizeof(*map)); } int map__overlap(struct map *l, struct map *r) -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 05/21] perf kmem: Use memdup() 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (3 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 04/21] perf tools: Use memdup in map__clone Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 06/21] perf header: Stop using die() calls when processing tracing data Arnaldo Carvalho de Melo ` (16 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Arnaldo Carvalho de Melo, David Ahern, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian From: Arnaldo Carvalho de Melo <acme@redhat.com> Instead of hand coded equivalent. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-42ldngi973f4ssvzlklo8t2k@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/builtin-kmem.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index c746108..46878da 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c @@ -17,6 +17,7 @@ #include "util/debug.h" #include <linux/rbtree.h> +#include <linux/string.h> struct alloc_stat; typedef int (*sort_fn_t)(struct alloc_stat *, struct alloc_stat *); @@ -618,12 +619,11 @@ static int sort_dimension__add(const char *tok, struct list_head *list) for (i = 0; i < NUM_AVAIL_SORTS; i++) { if (!strcmp(avail_sorts[i]->name, tok)) { - sort = malloc(sizeof(*sort)); + sort = memdup(avail_sorts[i], sizeof(*avail_sorts[i])); if (!sort) { - pr_err("%s: malloc failed\n", __func__); + pr_err("%s: memdup failed\n", __func__); return -1; } - memcpy(sort, avail_sorts[i], sizeof(*sort)); list_add_tail(&sort->list, list); return 0; } -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 06/21] perf header: Stop using die() calls when processing tracing data 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (4 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 05/21] perf kmem: Use memdup() Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 07/21] perf ui browser: Free browser->helpline() on ui_browser__hide() Arnaldo Carvalho de Melo ` (15 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Arnaldo Carvalho de Melo, David Ahern, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian From: Arnaldo Carvalho de Melo <acme@redhat.com> The callers of this function (perf_event__process_tracing_data) already handles a negative value return as error, so just use pr_err() to log the problem and return -1 instead of panic'ing. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-eeeljnecpi0zi5s7ux1mzdv9@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/header.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index fccd69d..e17a8fe 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -2921,16 +2921,22 @@ int perf_event__process_tracing_data(union perf_event *event, session->repipe); padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read; - if (readn(session->fd, buf, padding) < 0) - die("reading input file"); + if (readn(session->fd, buf, padding) < 0) { + pr_err("%s: reading input file", __func__); + return -1; + } if (session->repipe) { int retw = write(STDOUT_FILENO, buf, padding); - if (retw <= 0 || retw != padding) - die("repiping tracing data padding"); + if (retw <= 0 || retw != padding) { + pr_err("%s: repiping tracing data padding", __func__); + return -1; + } } - if (size_read + padding != size) - die("tracing data size mismatch"); + if (size_read + padding != size) { + pr_err("%s: tracing data size mismatch", __func__); + return -1; + } perf_evlist__prepare_tracepoint_events(session->evlist, session->pevent); -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 07/21] perf ui browser: Free browser->helpline() on ui_browser__hide() 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (5 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 06/21] perf header: Stop using die() calls when processing tracing data Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 08/21] perf tests: Call machine__exit in the vmlinux matches kallsyms test Arnaldo Carvalho de Melo ` (14 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Arnaldo Carvalho de Melo, David Ahern, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian From: Arnaldo Carvalho de Melo <acme@redhat.com> It is allocated at ui_browser__show(), so free it in its counterpart, ui_browser__hide(). Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-g449kvnbcpli4ceyxbe2jp1e@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/ui/browser.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/perf/ui/browser.c b/tools/perf/ui/browser.c index 588bcb2..809ea46 100644 --- a/tools/perf/ui/browser.c +++ b/tools/perf/ui/browser.c @@ -273,6 +273,8 @@ void ui_browser__hide(struct ui_browser *browser __maybe_unused) { pthread_mutex_lock(&ui__lock); ui_helpline__pop(); + free(browser->helpline); + browser->helpline = NULL; pthread_mutex_unlock(&ui__lock); } -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 08/21] perf tests: Call machine__exit in the vmlinux matches kallsyms test 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (6 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 07/21] perf ui browser: Free browser->helpline() on ui_browser__hide() Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 09/21] perf tests: Fix leaks on PERF_RECORD_* test Arnaldo Carvalho de Melo ` (13 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Arnaldo Carvalho de Melo, David Ahern, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian From: Arnaldo Carvalho de Melo <acme@redhat.com> Removing leaks with valgrind. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-x9hja7wxwexe8ca9v2j8qtlg@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/tests/vmlinux-kallsyms.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/perf/tests/vmlinux-kallsyms.c b/tools/perf/tests/vmlinux-kallsyms.c index a1a8442..7b4c4d2 100644 --- a/tools/perf/tests/vmlinux-kallsyms.c +++ b/tools/perf/tests/vmlinux-kallsyms.c @@ -44,7 +44,7 @@ int test__vmlinux_matches_kallsyms(void) */ if (machine__create_kernel_maps(&kallsyms) < 0) { pr_debug("machine__create_kernel_maps "); - return -1; + goto out; } /* @@ -227,5 +227,7 @@ detour: map__fprintf(pos, stderr); } out: + machine__exit(&kallsyms); + machine__exit(&vmlinux); return err; } -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 09/21] perf tests: Fix leaks on PERF_RECORD_* test 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (7 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 08/21] perf tests: Call machine__exit in the vmlinux matches kallsyms test Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 10/21] tools: Correct typo in tools Makefile Arnaldo Carvalho de Melo ` (12 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Arnaldo Carvalho de Melo, David Ahern, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian From: Arnaldo Carvalho de Melo <acme@redhat.com> This test: 7: Validate PERF_RECORD_* events & perf_sample fields needs to call perf_evlist__delete_maps(). Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-t3181qy15avffdacqjcxfku2@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/tests/perf-record.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tools/perf/tests/perf-record.c b/tools/perf/tests/perf-record.c index 6ea66cf..1e8e512 100644 --- a/tools/perf/tests/perf-record.c +++ b/tools/perf/tests/perf-record.c @@ -96,7 +96,7 @@ int test__PERF_RECORD(void) err = perf_evlist__prepare_workload(evlist, &opts, argv); if (err < 0) { pr_debug("Couldn't run the workload!\n"); - goto out_delete_evlist; + goto out_delete_maps; } /* @@ -111,7 +111,7 @@ int test__PERF_RECORD(void) err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask); if (err < 0) { pr_debug("sched__get_first_possible_cpu: %s\n", strerror(errno)); - goto out_delete_evlist; + goto out_delete_maps; } cpu = err; @@ -121,7 +121,7 @@ int test__PERF_RECORD(void) */ if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) { pr_debug("sched_setaffinity: %s\n", strerror(errno)); - goto out_delete_evlist; + goto out_delete_maps; } /* @@ -131,7 +131,7 @@ int test__PERF_RECORD(void) err = perf_evlist__open(evlist); if (err < 0) { pr_debug("perf_evlist__open: %s\n", strerror(errno)); - goto out_delete_evlist; + goto out_delete_maps; } /* @@ -142,7 +142,7 @@ int test__PERF_RECORD(void) err = perf_evlist__mmap(evlist, opts.mmap_pages, false); if (err < 0) { pr_debug("perf_evlist__mmap: %s\n", strerror(errno)); - goto out_delete_evlist; + goto out_delete_maps; } /* @@ -305,6 +305,8 @@ found_exit: } out_err: perf_evlist__munmap(evlist); +out_delete_maps: + perf_evlist__delete_maps(evlist); out_delete_evlist: perf_evlist__delete(evlist); out: -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 10/21] tools: Correct typo in tools Makefile 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (8 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 09/21] perf tests: Fix leaks on PERF_RECORD_* test Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 11/21] perf: Add 'perf bench numa mem' NUMA performance measurement suite Arnaldo Carvalho de Melo ` (11 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar; +Cc: linux-kernel, Borislav Petkov, Arnaldo Carvalho de Melo From: Borislav Petkov <bp@suse.de> It should be make -C tools/ <tool>_install Signed-off-by: Borislav Petkov <bp@suse.de> Cc: Ingo Molnar <mingo@kernel.org> Link: http://lkml.kernel.org/r/1359456492-22156-1-git-send-email-bp@alien8.de Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Makefile b/tools/Makefile index 1f9a529..798fa0e 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -15,7 +15,7 @@ help: @echo ' x86_energy_perf_policy - Intel energy policy tool' @echo '' @echo 'You can do:' - @echo ' $$ make -C tools/<tool>_install' + @echo ' $$ make -C tools/ <tool>_install' @echo '' @echo ' from the kernel command line to build and install one of' @echo ' the tools above' -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 11/21] perf: Add 'perf bench numa mem' NUMA performance measurement suite 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (9 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 10/21] tools: Correct typo in tools Makefile Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 12/21] perf tools: Make numa benchmark optional Arnaldo Carvalho de Melo ` (10 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Peter Zijlstra, Arnaldo Carvalho de Melo, Frederic Weisbecker, Mike Galbraith, Steven Rostedt, Linus Torvalds, Andrew Morton, Andrea Arcangeli, Rik van Riel, Mel Gorman, Hugh Dickins From: Ingo Molnar <mingo@kernel.org> Add a suite of NUMA performance benchmarks. The goal was simulate the behavior and access patterns of real NUMA workloads, via a wide range of parameters, so this tool goes well beyond simple bzero() measurements that most NUMA micro-benchmarks use: - It processes the data and creates a chain of data dependencies, like a real workload would. Neither the compiler, nor the kernel (via KSM and other optimizations) nor the CPU can eliminate parts of the workload. - It randomizes the initial state and also randomizes the target addresses of the processing - it's not a simple forward scan of addresses. - It provides flexible options to set process, thread and memory relationship information: -G sets "global" memory shared between all test processes, -P sets "process" memory shared by all threads of a process and -T sets "thread" private memory. - There's a NUMA convergence monitoring and convergence latency measurement option via -c and -m. - Micro-sleeps and synchronization can be injected to provoke lock contention and scheduling, via the -u and -S options. This simulates IO and contention. - The -x option instructs the workload to 'perturb' itself artificially every N seconds, by moving to the first and last CPU of the system periodically. This way the stability of convergence equilibrium and the number of steps taken for the scheduler to reach equilibrium again can be measured. - The amount of work can be specified via the -l loop count, and/or via a -s seconds-timeout value. - CPU and node memory binding options, to test hard binding scenarios. THP can be turned on and off via madvise() calls. - Live reporting of convergence progress in an 'at glance' output format. Printing of convergence and deconvergence events. The 'perf bench numa mem -a' option will start an array of about 30 individual tests that will each output such measurements: # Running 5x5-bw-thread, "perf bench numa mem -p 5 -t 5 -P 512 -s 20 -zZ0q --thp 1" 5x5-bw-thread, 20.276, secs, runtime-max/thread 5x5-bw-thread, 20.004, secs, runtime-min/thread 5x5-bw-thread, 20.155, secs, runtime-avg/thread 5x5-bw-thread, 0.671, %, spread-runtime/thread 5x5-bw-thread, 21.153, GB, data/thread 5x5-bw-thread, 528.818, GB, data-total 5x5-bw-thread, 0.959, nsecs, runtime/byte/thread 5x5-bw-thread, 1.043, GB/sec, thread-speed 5x5-bw-thread, 26.081, GB/sec, total-speed See the help text and the code for more details. Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Rik van Riel <riel@redhat.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Hugh Dickins <hughd@google.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> --- tools/perf/Makefile | 3 +- tools/perf/bench/bench.h | 1 + tools/perf/bench/numa.c | 1731 ++++++++++++++++++++++++++++++++++++++++++++ tools/perf/builtin-bench.c | 13 + 4 files changed, 1747 insertions(+), 1 deletion(-) create mode 100644 tools/perf/bench/numa.c diff --git a/tools/perf/Makefile b/tools/perf/Makefile index a84021a..b62dbc0 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile @@ -103,7 +103,7 @@ ifdef PARSER_DEBUG endif CFLAGS = -fno-omit-frame-pointer -ggdb3 -funwind-tables -Wall -Wextra -std=gnu99 $(CFLAGS_WERROR) $(CFLAGS_OPTIMIZE) $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) $(PARSER_DEBUG_CFLAGS) -EXTLIBS = -lpthread -lrt -lelf -lm +EXTLIBS = -lpthread -lrt -lelf -lm -lnuma ALL_CFLAGS = $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE ALL_LDFLAGS = $(LDFLAGS) STRIP ?= strip @@ -492,6 +492,7 @@ LIB_OBJS += $(OUTPUT)tests/python-use.o BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o BUILTIN_OBJS += $(OUTPUT)builtin-bench.o # Benchmark modules +BUILTIN_OBJS += $(OUTPUT)bench/numa.o BUILTIN_OBJS += $(OUTPUT)bench/sched-messaging.o BUILTIN_OBJS += $(OUTPUT)bench/sched-pipe.o ifeq ($(RAW_ARCH),x86_64) diff --git a/tools/perf/bench/bench.h b/tools/perf/bench/bench.h index 8f89998..a5223e6 100644 --- a/tools/perf/bench/bench.h +++ b/tools/perf/bench/bench.h @@ -1,6 +1,7 @@ #ifndef BENCH_H #define BENCH_H +extern int bench_numa(int argc, const char **argv, const char *prefix); extern int bench_sched_messaging(int argc, const char **argv, const char *prefix); extern int bench_sched_pipe(int argc, const char **argv, const char *prefix); extern int bench_mem_memcpy(int argc, const char **argv, diff --git a/tools/perf/bench/numa.c b/tools/perf/bench/numa.c new file mode 100644 index 0000000..30d1c32 --- /dev/null +++ b/tools/perf/bench/numa.c @@ -0,0 +1,1731 @@ +/* + * numa.c + * + * numa: Simulate NUMA-sensitive workload and measure their NUMA performance + */ + +#include "../perf.h" +#include "../builtin.h" +#include "../util/util.h" +#include "../util/parse-options.h" + +#include "bench.h" + +#include <errno.h> +#include <sched.h> +#include <stdio.h> +#include <assert.h> +#include <malloc.h> +#include <signal.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <pthread.h> +#include <sys/mman.h> +#include <sys/time.h> +#include <sys/wait.h> +#include <sys/prctl.h> +#include <sys/types.h> + +#include <numa.h> +#include <numaif.h> + +/* + * Regular printout to the terminal, supressed if -q is specified: + */ +#define tprintf(x...) do { if (g && g->p.show_details >= 0) printf(x); } while (0) + +/* + * Debug printf: + */ +#define dprintf(x...) do { if (g && g->p.show_details >= 1) printf(x); } while (0) + +struct thread_data { + int curr_cpu; + cpu_set_t bind_cpumask; + int bind_node; + u8 *process_data; + int process_nr; + int thread_nr; + int task_nr; + unsigned int loops_done; + u64 val; + u64 runtime_ns; + pthread_mutex_t *process_lock; +}; + +/* Parameters set by options: */ + +struct params { + /* Startup synchronization: */ + bool serialize_startup; + + /* Task hierarchy: */ + int nr_proc; + int nr_threads; + + /* Working set sizes: */ + const char *mb_global_str; + const char *mb_proc_str; + const char *mb_proc_locked_str; + const char *mb_thread_str; + + double mb_global; + double mb_proc; + double mb_proc_locked; + double mb_thread; + + /* Access patterns to the working set: */ + bool data_reads; + bool data_writes; + bool data_backwards; + bool data_zero_memset; + bool data_rand_walk; + u32 nr_loops; + u32 nr_secs; + u32 sleep_usecs; + + /* Working set initialization: */ + bool init_zero; + bool init_random; + bool init_cpu0; + + /* Misc options: */ + int show_details; + int run_all; + int thp; + + long bytes_global; + long bytes_process; + long bytes_process_locked; + long bytes_thread; + + int nr_tasks; + bool show_quiet; + + bool show_convergence; + bool measure_convergence; + + int perturb_secs; + int nr_cpus; + int nr_nodes; + + /* Affinity options -C and -N: */ + char *cpu_list_str; + char *node_list_str; +}; + + +/* Global, read-writable area, accessible to all processes and threads: */ + +struct global_info { + u8 *data; + + pthread_mutex_t startup_mutex; + int nr_tasks_started; + + pthread_mutex_t startup_done_mutex; + + pthread_mutex_t start_work_mutex; + int nr_tasks_working; + + pthread_mutex_t stop_work_mutex; + u64 bytes_done; + + struct thread_data *threads; + + /* Convergence latency measurement: */ + bool all_converged; + bool stop_work; + + int print_once; + + struct params p; +}; + +static struct global_info *g = NULL; + +static int parse_cpus_opt(const struct option *opt, const char *arg, int unset); +static int parse_nodes_opt(const struct option *opt, const char *arg, int unset); + +struct params p0; + +static const struct option options[] = { + OPT_INTEGER('p', "nr_proc" , &p0.nr_proc, "number of processes"), + OPT_INTEGER('t', "nr_threads" , &p0.nr_threads, "number of threads per process"), + + OPT_STRING('G', "mb_global" , &p0.mb_global_str, "MB", "global memory (MBs)"), + OPT_STRING('P', "mb_proc" , &p0.mb_proc_str, "MB", "process memory (MBs)"), + OPT_STRING('L', "mb_proc_locked", &p0.mb_proc_locked_str,"MB", "process serialized/locked memory access (MBs), <= process_memory"), + OPT_STRING('T', "mb_thread" , &p0.mb_thread_str, "MB", "thread memory (MBs)"), + + OPT_UINTEGER('l', "nr_loops" , &p0.nr_loops, "max number of loops to run"), + OPT_UINTEGER('s', "nr_secs" , &p0.nr_secs, "max number of seconds to run"), + OPT_UINTEGER('u', "usleep" , &p0.sleep_usecs, "usecs to sleep per loop iteration"), + + OPT_BOOLEAN('R', "data_reads" , &p0.data_reads, "access the data via writes (can be mixed with -W)"), + OPT_BOOLEAN('W', "data_writes" , &p0.data_writes, "access the data via writes (can be mixed with -R)"), + OPT_BOOLEAN('B', "data_backwards", &p0.data_backwards, "access the data backwards as well"), + OPT_BOOLEAN('Z', "data_zero_memset", &p0.data_zero_memset,"access the data via glibc bzero only"), + OPT_BOOLEAN('r', "data_rand_walk", &p0.data_rand_walk, "access the data with random (32bit LFSR) walk"), + + + OPT_BOOLEAN('z', "init_zero" , &p0.init_zero, "bzero the initial allocations"), + OPT_BOOLEAN('I', "init_random" , &p0.init_random, "randomize the contents of the initial allocations"), + OPT_BOOLEAN('0', "init_cpu0" , &p0.init_cpu0, "do the initial allocations on CPU#0"), + OPT_INTEGER('x', "perturb_secs", &p0.perturb_secs, "perturb thread 0/0 every X secs, to test convergence stability"), + + OPT_INCR ('d', "show_details" , &p0.show_details, "Show details"), + OPT_INCR ('a', "all" , &p0.run_all, "Run all tests in the suite"), + OPT_INTEGER('H', "thp" , &p0.thp, "MADV_NOHUGEPAGE < 0 < MADV_HUGEPAGE"), + OPT_BOOLEAN('c', "show_convergence", &p0.show_convergence, "show convergence details"), + OPT_BOOLEAN('m', "measure_convergence", &p0.measure_convergence, "measure convergence latency"), + OPT_BOOLEAN('q', "quiet" , &p0.show_quiet, "bzero the initial allocations"), + OPT_BOOLEAN('S', "serialize-startup", &p0.serialize_startup,"serialize thread startup"), + + /* Special option string parsing callbacks: */ + OPT_CALLBACK('C', "cpus", NULL, "cpu[,cpu2,...cpuN]", + "bind the first N tasks to these specific cpus (the rest is unbound)", + parse_cpus_opt), + OPT_CALLBACK('M', "memnodes", NULL, "node[,node2,...nodeN]", + "bind the first N tasks to these specific memory nodes (the rest is unbound)", + parse_nodes_opt), + OPT_END() +}; + +static const char * const bench_numa_usage[] = { + "perf bench numa <options>", + NULL +}; + +static const char * const numa_usage[] = { + "perf bench numa mem [<options>]", + NULL +}; + +static cpu_set_t bind_to_cpu(int target_cpu) +{ + cpu_set_t orig_mask, mask; + int ret; + + ret = sched_getaffinity(0, sizeof(orig_mask), &orig_mask); + BUG_ON(ret); + + CPU_ZERO(&mask); + + if (target_cpu == -1) { + int cpu; + + for (cpu = 0; cpu < g->p.nr_cpus; cpu++) + CPU_SET(cpu, &mask); + } else { + BUG_ON(target_cpu < 0 || target_cpu >= g->p.nr_cpus); + CPU_SET(target_cpu, &mask); + } + + ret = sched_setaffinity(0, sizeof(mask), &mask); + BUG_ON(ret); + + return orig_mask; +} + +static cpu_set_t bind_to_node(int target_node) +{ + int cpus_per_node = g->p.nr_cpus/g->p.nr_nodes; + cpu_set_t orig_mask, mask; + int cpu; + int ret; + + BUG_ON(cpus_per_node*g->p.nr_nodes != g->p.nr_cpus); + BUG_ON(!cpus_per_node); + + ret = sched_getaffinity(0, sizeof(orig_mask), &orig_mask); + BUG_ON(ret); + + CPU_ZERO(&mask); + + if (target_node == -1) { + for (cpu = 0; cpu < g->p.nr_cpus; cpu++) + CPU_SET(cpu, &mask); + } else { + int cpu_start = (target_node + 0) * cpus_per_node; + int cpu_stop = (target_node + 1) * cpus_per_node; + + BUG_ON(cpu_stop > g->p.nr_cpus); + + for (cpu = cpu_start; cpu < cpu_stop; cpu++) + CPU_SET(cpu, &mask); + } + + ret = sched_setaffinity(0, sizeof(mask), &mask); + BUG_ON(ret); + + return orig_mask; +} + +static void bind_to_cpumask(cpu_set_t mask) +{ + int ret; + + ret = sched_setaffinity(0, sizeof(mask), &mask); + BUG_ON(ret); +} + +static void mempol_restore(void) +{ + int ret; + + ret = set_mempolicy(MPOL_DEFAULT, NULL, g->p.nr_nodes-1); + + BUG_ON(ret); +} + +static void bind_to_memnode(int node) +{ + unsigned long nodemask; + int ret; + + if (node == -1) + return; + + BUG_ON(g->p.nr_nodes > (int)sizeof(nodemask)); + nodemask = 1L << node; + + ret = set_mempolicy(MPOL_BIND, &nodemask, sizeof(nodemask)*8); + dprintf("binding to node %d, mask: %016lx => %d\n", node, nodemask, ret); + + BUG_ON(ret); +} + +#define HPSIZE (2*1024*1024) + +#define set_taskname(fmt...) \ +do { \ + char name[20]; \ + \ + snprintf(name, 20, fmt); \ + prctl(PR_SET_NAME, name); \ +} while (0) + +static u8 *alloc_data(ssize_t bytes0, int map_flags, + int init_zero, int init_cpu0, int thp, int init_random) +{ + cpu_set_t orig_mask; + ssize_t bytes; + u8 *buf; + int ret; + + if (!bytes0) + return NULL; + + /* Allocate and initialize all memory on CPU#0: */ + if (init_cpu0) { + orig_mask = bind_to_node(0); + bind_to_memnode(0); + } + + bytes = bytes0 + HPSIZE; + + buf = (void *)mmap(0, bytes, PROT_READ|PROT_WRITE, MAP_ANON|map_flags, -1, 0); + BUG_ON(buf == (void *)-1); + + if (map_flags == MAP_PRIVATE) { + if (thp > 0) { + ret = madvise(buf, bytes, MADV_HUGEPAGE); + if (ret && !g->print_once) { + g->print_once = 1; + printf("WARNING: Could not enable THP - do: 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled'\n"); + } + } + if (thp < 0) { + ret = madvise(buf, bytes, MADV_NOHUGEPAGE); + if (ret && !g->print_once) { + g->print_once = 1; + printf("WARNING: Could not disable THP: run a CONFIG_TRANSPARENT_HUGEPAGE kernel?\n"); + } + } + } + + if (init_zero) { + bzero(buf, bytes); + } else { + /* Initialize random contents, different in each word: */ + if (init_random) { + u64 *wbuf = (void *)buf; + long off = rand(); + long i; + + for (i = 0; i < bytes/8; i++) + wbuf[i] = i + off; + } + } + + /* Align to 2MB boundary: */ + buf = (void *)(((unsigned long)buf + HPSIZE-1) & ~(HPSIZE-1)); + + /* Restore affinity: */ + if (init_cpu0) { + bind_to_cpumask(orig_mask); + mempol_restore(); + } + + return buf; +} + +static void free_data(void *data, ssize_t bytes) +{ + int ret; + + if (!data) + return; + + ret = munmap(data, bytes); + BUG_ON(ret); +} + +/* + * Create a shared memory buffer that can be shared between processes, zeroed: + */ +static void * zalloc_shared_data(ssize_t bytes) +{ + return alloc_data(bytes, MAP_SHARED, 1, g->p.init_cpu0, g->p.thp, g->p.init_random); +} + +/* + * Create a shared memory buffer that can be shared between processes: + */ +static void * setup_shared_data(ssize_t bytes) +{ + return alloc_data(bytes, MAP_SHARED, 0, g->p.init_cpu0, g->p.thp, g->p.init_random); +} + +/* + * Allocate process-local memory - this will either be shared between + * threads of this process, or only be accessed by this thread: + */ +static void * setup_private_data(ssize_t bytes) +{ + return alloc_data(bytes, MAP_PRIVATE, 0, g->p.init_cpu0, g->p.thp, g->p.init_random); +} + +/* + * Return a process-shared (global) mutex: + */ +static void init_global_mutex(pthread_mutex_t *mutex) +{ + pthread_mutexattr_t attr; + + pthread_mutexattr_init(&attr); + pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); + pthread_mutex_init(mutex, &attr); +} + +static int parse_cpu_list(const char *arg) +{ + p0.cpu_list_str = strdup(arg); + + dprintf("got CPU list: {%s}\n", p0.cpu_list_str); + + return 0; +} + +static void parse_setup_cpu_list(void) +{ + struct thread_data *td; + char *str0, *str; + int t; + + if (!g->p.cpu_list_str) + return; + + dprintf("g->p.nr_tasks: %d\n", g->p.nr_tasks); + + str0 = str = strdup(g->p.cpu_list_str); + t = 0; + + BUG_ON(!str); + + tprintf("# binding tasks to CPUs:\n"); + tprintf("# "); + + while (true) { + int bind_cpu, bind_cpu_0, bind_cpu_1; + char *tok, *tok_end, *tok_step, *tok_len, *tok_mul; + int bind_len; + int step; + int mul; + + tok = strsep(&str, ","); + if (!tok) + break; + + tok_end = strstr(tok, "-"); + + dprintf("\ntoken: {%s}, end: {%s}\n", tok, tok_end); + if (!tok_end) { + /* Single CPU specified: */ + bind_cpu_0 = bind_cpu_1 = atol(tok); + } else { + /* CPU range specified (for example: "5-11"): */ + bind_cpu_0 = atol(tok); + bind_cpu_1 = atol(tok_end + 1); + } + + step = 1; + tok_step = strstr(tok, "#"); + if (tok_step) { + step = atol(tok_step + 1); + BUG_ON(step <= 0 || step >= g->p.nr_cpus); + } + + /* + * Mask length. + * Eg: "--cpus 8_4-16#4" means: '--cpus 8_4,12_4,16_4', + * where the _4 means the next 4 CPUs are allowed. + */ + bind_len = 1; + tok_len = strstr(tok, "_"); + if (tok_len) { + bind_len = atol(tok_len + 1); + BUG_ON(bind_len <= 0 || bind_len > g->p.nr_cpus); + } + + /* Multiplicator shortcut, "0x8" is a shortcut for: "0,0,0,0,0,0,0,0" */ + mul = 1; + tok_mul = strstr(tok, "x"); + if (tok_mul) { + mul = atol(tok_mul + 1); + BUG_ON(mul <= 0); + } + + dprintf("CPUs: %d_%d-%d#%dx%d\n", bind_cpu_0, bind_len, bind_cpu_1, step, mul); + + BUG_ON(bind_cpu_0 < 0 || bind_cpu_0 >= g->p.nr_cpus); + BUG_ON(bind_cpu_1 < 0 || bind_cpu_1 >= g->p.nr_cpus); + BUG_ON(bind_cpu_0 > bind_cpu_1); + + for (bind_cpu = bind_cpu_0; bind_cpu <= bind_cpu_1; bind_cpu += step) { + int i; + + for (i = 0; i < mul; i++) { + int cpu; + + if (t >= g->p.nr_tasks) { + printf("\n# NOTE: ignoring bind CPUs starting at CPU#%d\n #", bind_cpu); + goto out; + } + td = g->threads + t; + + if (t) + tprintf(","); + if (bind_len > 1) { + tprintf("%2d/%d", bind_cpu, bind_len); + } else { + tprintf("%2d", bind_cpu); + } + + CPU_ZERO(&td->bind_cpumask); + for (cpu = bind_cpu; cpu < bind_cpu+bind_len; cpu++) { + BUG_ON(cpu < 0 || cpu >= g->p.nr_cpus); + CPU_SET(cpu, &td->bind_cpumask); + } + t++; + } + } + } +out: + + tprintf("\n"); + + if (t < g->p.nr_tasks) + printf("# NOTE: %d tasks bound, %d tasks unbound\n", t, g->p.nr_tasks - t); + + free(str0); +} + +static int parse_cpus_opt(const struct option *opt __maybe_unused, + const char *arg, int unset __maybe_unused) +{ + if (!arg) + return -1; + + return parse_cpu_list(arg); +} + +static int parse_node_list(const char *arg) +{ + p0.node_list_str = strdup(arg); + + dprintf("got NODE list: {%s}\n", p0.node_list_str); + + return 0; +} + +static void parse_setup_node_list(void) +{ + struct thread_data *td; + char *str0, *str; + int t; + + if (!g->p.node_list_str) + return; + + dprintf("g->p.nr_tasks: %d\n", g->p.nr_tasks); + + str0 = str = strdup(g->p.node_list_str); + t = 0; + + BUG_ON(!str); + + tprintf("# binding tasks to NODEs:\n"); + tprintf("# "); + + while (true) { + int bind_node, bind_node_0, bind_node_1; + char *tok, *tok_end, *tok_step, *tok_mul; + int step; + int mul; + + tok = strsep(&str, ","); + if (!tok) + break; + + tok_end = strstr(tok, "-"); + + dprintf("\ntoken: {%s}, end: {%s}\n", tok, tok_end); + if (!tok_end) { + /* Single NODE specified: */ + bind_node_0 = bind_node_1 = atol(tok); + } else { + /* NODE range specified (for example: "5-11"): */ + bind_node_0 = atol(tok); + bind_node_1 = atol(tok_end + 1); + } + + step = 1; + tok_step = strstr(tok, "#"); + if (tok_step) { + step = atol(tok_step + 1); + BUG_ON(step <= 0 || step >= g->p.nr_nodes); + } + + /* Multiplicator shortcut, "0x8" is a shortcut for: "0,0,0,0,0,0,0,0" */ + mul = 1; + tok_mul = strstr(tok, "x"); + if (tok_mul) { + mul = atol(tok_mul + 1); + BUG_ON(mul <= 0); + } + + dprintf("NODEs: %d-%d #%d\n", bind_node_0, bind_node_1, step); + + BUG_ON(bind_node_0 < 0 || bind_node_0 >= g->p.nr_nodes); + BUG_ON(bind_node_1 < 0 || bind_node_1 >= g->p.nr_nodes); + BUG_ON(bind_node_0 > bind_node_1); + + for (bind_node = bind_node_0; bind_node <= bind_node_1; bind_node += step) { + int i; + + for (i = 0; i < mul; i++) { + if (t >= g->p.nr_tasks) { + printf("\n# NOTE: ignoring bind NODEs starting at NODE#%d\n", bind_node); + goto out; + } + td = g->threads + t; + + if (!t) + tprintf(" %2d", bind_node); + else + tprintf(",%2d", bind_node); + + td->bind_node = bind_node; + t++; + } + } + } +out: + + tprintf("\n"); + + if (t < g->p.nr_tasks) + printf("# NOTE: %d tasks mem-bound, %d tasks unbound\n", t, g->p.nr_tasks - t); + + free(str0); +} + +static int parse_nodes_opt(const struct option *opt __maybe_unused, + const char *arg, int unset __maybe_unused) +{ + if (!arg) + return -1; + + return parse_node_list(arg); + + return 0; +} + +#define BIT(x) (1ul << x) + +static inline uint32_t lfsr_32(uint32_t lfsr) +{ + const uint32_t taps = BIT(1) | BIT(5) | BIT(6) | BIT(31); + return (lfsr>>1) ^ ((0x0u - (lfsr & 0x1u)) & taps); +} + +/* + * Make sure there's real data dependency to RAM (when read + * accesses are enabled), so the compiler, the CPU and the + * kernel (KSM, zero page, etc.) cannot optimize away RAM + * accesses: + */ +static inline u64 access_data(u64 *data __attribute__((unused)), u64 val) +{ + if (g->p.data_reads) + val += *data; + if (g->p.data_writes) + *data = val + 1; + return val; +} + +/* + * The worker process does two types of work, a forwards going + * loop and a backwards going loop. + * + * We do this so that on multiprocessor systems we do not create + * a 'train' of processing, with highly synchronized processes, + * skewing the whole benchmark. + */ +static u64 do_work(u8 *__data, long bytes, int nr, int nr_max, int loop, u64 val) +{ + long words = bytes/sizeof(u64); + u64 *data = (void *)__data; + long chunk_0, chunk_1; + u64 *d0, *d, *d1; + long off; + long i; + + BUG_ON(!data && words); + BUG_ON(data && !words); + + if (!data) + return val; + + /* Very simple memset() work variant: */ + if (g->p.data_zero_memset && !g->p.data_rand_walk) { + bzero(data, bytes); + return val; + } + + /* Spread out by PID/TID nr and by loop nr: */ + chunk_0 = words/nr_max; + chunk_1 = words/g->p.nr_loops; + off = nr*chunk_0 + loop*chunk_1; + + while (off >= words) + off -= words; + + if (g->p.data_rand_walk) { + u32 lfsr = nr + loop + val; + int j; + + for (i = 0; i < words/1024; i++) { + long start, end; + + lfsr = lfsr_32(lfsr); + + start = lfsr % words; + end = min(start + 1024, words-1); + + if (g->p.data_zero_memset) { + bzero(data + start, (end-start) * sizeof(u64)); + } else { + for (j = start; j < end; j++) + val = access_data(data + j, val); + } + } + } else if (!g->p.data_backwards || (nr + loop) & 1) { + + d0 = data + off; + d = data + off + 1; + d1 = data + words; + + /* Process data forwards: */ + for (;;) { + if (unlikely(d >= d1)) + d = data; + if (unlikely(d == d0)) + break; + + val = access_data(d, val); + + d++; + } + } else { + /* Process data backwards: */ + + d0 = data + off; + d = data + off - 1; + d1 = data + words; + + /* Process data forwards: */ + for (;;) { + if (unlikely(d < data)) + d = data + words-1; + if (unlikely(d == d0)) + break; + + val = access_data(d, val); + + d--; + } + } + + return val; +} + +static void update_curr_cpu(int task_nr, unsigned long bytes_worked) +{ + unsigned int cpu; + + cpu = sched_getcpu(); + + g->threads[task_nr].curr_cpu = cpu; + prctl(0, bytes_worked); +} + +#define MAX_NR_NODES 64 + +/* + * Count the number of nodes a process's threads + * are spread out on. + * + * A count of 1 means that the process is compressed + * to a single node. A count of g->p.nr_nodes means it's + * spread out on the whole system. + */ +static int count_process_nodes(int process_nr) +{ + char node_present[MAX_NR_NODES] = { 0, }; + int nodes; + int n, t; + + for (t = 0; t < g->p.nr_threads; t++) { + struct thread_data *td; + int task_nr; + int node; + + task_nr = process_nr*g->p.nr_threads + t; + td = g->threads + task_nr; + + node = numa_node_of_cpu(td->curr_cpu); + node_present[node] = 1; + } + + nodes = 0; + + for (n = 0; n < MAX_NR_NODES; n++) + nodes += node_present[n]; + + return nodes; +} + +/* + * Count the number of distinct process-threads a node contains. + * + * A count of 1 means that the node contains only a single + * process. If all nodes on the system contain at most one + * process then we are well-converged. + */ +static int count_node_processes(int node) +{ + int processes = 0; + int t, p; + + for (p = 0; p < g->p.nr_proc; p++) { + for (t = 0; t < g->p.nr_threads; t++) { + struct thread_data *td; + int task_nr; + int n; + + task_nr = p*g->p.nr_threads + t; + td = g->threads + task_nr; + + n = numa_node_of_cpu(td->curr_cpu); + if (n == node) { + processes++; + break; + } + } + } + + return processes; +} + +static void calc_convergence_compression(int *strong) +{ + unsigned int nodes_min, nodes_max; + int p; + + nodes_min = -1; + nodes_max = 0; + + for (p = 0; p < g->p.nr_proc; p++) { + unsigned int nodes = count_process_nodes(p); + + nodes_min = min(nodes, nodes_min); + nodes_max = max(nodes, nodes_max); + } + + /* Strong convergence: all threads compress on a single node: */ + if (nodes_min == 1 && nodes_max == 1) { + *strong = 1; + } else { + *strong = 0; + tprintf(" {%d-%d}", nodes_min, nodes_max); + } +} + +static void calc_convergence(double runtime_ns_max, double *convergence) +{ + unsigned int loops_done_min, loops_done_max; + int process_groups; + int nodes[MAX_NR_NODES]; + int distance; + int nr_min; + int nr_max; + int strong; + int sum; + int nr; + int node; + int cpu; + int t; + + if (!g->p.show_convergence && !g->p.measure_convergence) + return; + + for (node = 0; node < g->p.nr_nodes; node++) + nodes[node] = 0; + + loops_done_min = -1; + loops_done_max = 0; + + for (t = 0; t < g->p.nr_tasks; t++) { + struct thread_data *td = g->threads + t; + unsigned int loops_done; + + cpu = td->curr_cpu; + + /* Not all threads have written it yet: */ + if (cpu < 0) + continue; + + node = numa_node_of_cpu(cpu); + + nodes[node]++; + + loops_done = td->loops_done; + loops_done_min = min(loops_done, loops_done_min); + loops_done_max = max(loops_done, loops_done_max); + } + + nr_max = 0; + nr_min = g->p.nr_tasks; + sum = 0; + + for (node = 0; node < g->p.nr_nodes; node++) { + nr = nodes[node]; + nr_min = min(nr, nr_min); + nr_max = max(nr, nr_max); + sum += nr; + } + BUG_ON(nr_min > nr_max); + + BUG_ON(sum > g->p.nr_tasks); + + if (0 && (sum < g->p.nr_tasks)) + return; + + /* + * Count the number of distinct process groups present + * on nodes - when we are converged this will decrease + * to g->p.nr_proc: + */ + process_groups = 0; + + for (node = 0; node < g->p.nr_nodes; node++) { + int processes = count_node_processes(node); + + nr = nodes[node]; + tprintf(" %2d/%-2d", nr, processes); + + process_groups += processes; + } + + distance = nr_max - nr_min; + + tprintf(" [%2d/%-2d]", distance, process_groups); + + tprintf(" l:%3d-%-3d (%3d)", + loops_done_min, loops_done_max, loops_done_max-loops_done_min); + + if (loops_done_min && loops_done_max) { + double skew = 1.0 - (double)loops_done_min/loops_done_max; + + tprintf(" [%4.1f%%]", skew * 100.0); + } + + calc_convergence_compression(&strong); + + if (strong && process_groups == g->p.nr_proc) { + if (!*convergence) { + *convergence = runtime_ns_max; + tprintf(" (%6.1fs converged)\n", *convergence/1e9); + if (g->p.measure_convergence) { + g->all_converged = true; + g->stop_work = true; + } + } + } else { + if (*convergence) { + tprintf(" (%6.1fs de-converged)", runtime_ns_max/1e9); + *convergence = 0; + } + tprintf("\n"); + } +} + +static void show_summary(double runtime_ns_max, int l, double *convergence) +{ + tprintf("\r # %5.1f%% [%.1f mins]", + (double)(l+1)/g->p.nr_loops*100.0, runtime_ns_max/1e9 / 60.0); + + calc_convergence(runtime_ns_max, convergence); + + if (g->p.show_details >= 0) + fflush(stdout); +} + +static void *worker_thread(void *__tdata) +{ + struct thread_data *td = __tdata; + struct timeval start0, start, stop, diff; + int process_nr = td->process_nr; + int thread_nr = td->thread_nr; + unsigned long last_perturbance; + int task_nr = td->task_nr; + int details = g->p.show_details; + int first_task, last_task; + double convergence = 0; + u64 val = td->val; + double runtime_ns_max; + u8 *global_data; + u8 *process_data; + u8 *thread_data; + u64 bytes_done; + long work_done; + u32 l; + + bind_to_cpumask(td->bind_cpumask); + bind_to_memnode(td->bind_node); + + set_taskname("thread %d/%d", process_nr, thread_nr); + + global_data = g->data; + process_data = td->process_data; + thread_data = setup_private_data(g->p.bytes_thread); + + bytes_done = 0; + + last_task = 0; + if (process_nr == g->p.nr_proc-1 && thread_nr == g->p.nr_threads-1) + last_task = 1; + + first_task = 0; + if (process_nr == 0 && thread_nr == 0) + first_task = 1; + + if (details >= 2) { + printf("# thread %2d / %2d global mem: %p, process mem: %p, thread mem: %p\n", + process_nr, thread_nr, global_data, process_data, thread_data); + } + + if (g->p.serialize_startup) { + pthread_mutex_lock(&g->startup_mutex); + g->nr_tasks_started++; + pthread_mutex_unlock(&g->startup_mutex); + + /* Here we will wait for the main process to start us all at once: */ + pthread_mutex_lock(&g->start_work_mutex); + g->nr_tasks_working++; + + /* Last one wake the main process: */ + if (g->nr_tasks_working == g->p.nr_tasks) + pthread_mutex_unlock(&g->startup_done_mutex); + + pthread_mutex_unlock(&g->start_work_mutex); + } + + gettimeofday(&start0, NULL); + + start = stop = start0; + last_perturbance = start.tv_sec; + + for (l = 0; l < g->p.nr_loops; l++) { + start = stop; + + if (g->stop_work) + break; + + val += do_work(global_data, g->p.bytes_global, process_nr, g->p.nr_proc, l, val); + val += do_work(process_data, g->p.bytes_process, thread_nr, g->p.nr_threads, l, val); + val += do_work(thread_data, g->p.bytes_thread, 0, 1, l, val); + + if (g->p.sleep_usecs) { + pthread_mutex_lock(td->process_lock); + usleep(g->p.sleep_usecs); + pthread_mutex_unlock(td->process_lock); + } + /* + * Amount of work to be done under a process-global lock: + */ + if (g->p.bytes_process_locked) { + pthread_mutex_lock(td->process_lock); + val += do_work(process_data, g->p.bytes_process_locked, thread_nr, g->p.nr_threads, l, val); + pthread_mutex_unlock(td->process_lock); + } + + work_done = g->p.bytes_global + g->p.bytes_process + + g->p.bytes_process_locked + g->p.bytes_thread; + + update_curr_cpu(task_nr, work_done); + bytes_done += work_done; + + if (details < 0 && !g->p.perturb_secs && !g->p.measure_convergence && !g->p.nr_secs) + continue; + + td->loops_done = l; + + gettimeofday(&stop, NULL); + + /* Check whether our max runtime timed out: */ + if (g->p.nr_secs) { + timersub(&stop, &start0, &diff); + if (diff.tv_sec >= g->p.nr_secs) { + g->stop_work = true; + break; + } + } + + /* Update the summary at most once per second: */ + if (start.tv_sec == stop.tv_sec) + continue; + + /* + * Perturb the first task's equilibrium every g->p.perturb_secs seconds, + * by migrating to CPU#0: + */ + if (first_task && g->p.perturb_secs && (int)(stop.tv_sec - last_perturbance) >= g->p.perturb_secs) { + cpu_set_t orig_mask; + int target_cpu; + int this_cpu; + + last_perturbance = stop.tv_sec; + + /* + * Depending on where we are running, move into + * the other half of the system, to create some + * real disturbance: + */ + this_cpu = g->threads[task_nr].curr_cpu; + if (this_cpu < g->p.nr_cpus/2) + target_cpu = g->p.nr_cpus-1; + else + target_cpu = 0; + + orig_mask = bind_to_cpu(target_cpu); + + /* Here we are running on the target CPU already */ + if (details >= 1) + printf(" (injecting perturbalance, moved to CPU#%d)\n", target_cpu); + + bind_to_cpumask(orig_mask); + } + + if (details >= 3) { + timersub(&stop, &start, &diff); + runtime_ns_max = diff.tv_sec * 1000000000; + runtime_ns_max += diff.tv_usec * 1000; + + if (details >= 0) { + printf(" #%2d / %2d: %14.2lf nsecs/op [val: %016lx]\n", + process_nr, thread_nr, runtime_ns_max / bytes_done, val); + } + fflush(stdout); + } + if (!last_task) + continue; + + timersub(&stop, &start0, &diff); + runtime_ns_max = diff.tv_sec * 1000000000ULL; + runtime_ns_max += diff.tv_usec * 1000ULL; + + show_summary(runtime_ns_max, l, &convergence); + } + + gettimeofday(&stop, NULL); + timersub(&stop, &start0, &diff); + td->runtime_ns = diff.tv_sec * 1000000000ULL; + td->runtime_ns += diff.tv_usec * 1000ULL; + + free_data(thread_data, g->p.bytes_thread); + + pthread_mutex_lock(&g->stop_work_mutex); + g->bytes_done += bytes_done; + pthread_mutex_unlock(&g->stop_work_mutex); + + return NULL; +} + +/* + * A worker process starts a couple of threads: + */ +static void worker_process(int process_nr) +{ + pthread_mutex_t process_lock; + struct thread_data *td; + pthread_t *pthreads; + u8 *process_data; + int task_nr; + int ret; + int t; + + pthread_mutex_init(&process_lock, NULL); + set_taskname("process %d", process_nr); + + /* + * Pick up the memory policy and the CPU binding of our first thread, + * so that we initialize memory accordingly: + */ + task_nr = process_nr*g->p.nr_threads; + td = g->threads + task_nr; + + bind_to_memnode(td->bind_node); + bind_to_cpumask(td->bind_cpumask); + + pthreads = zalloc(g->p.nr_threads * sizeof(pthread_t)); + process_data = setup_private_data(g->p.bytes_process); + + if (g->p.show_details >= 3) { + printf(" # process %2d global mem: %p, process mem: %p\n", + process_nr, g->data, process_data); + } + + for (t = 0; t < g->p.nr_threads; t++) { + task_nr = process_nr*g->p.nr_threads + t; + td = g->threads + task_nr; + + td->process_data = process_data; + td->process_nr = process_nr; + td->thread_nr = t; + td->task_nr = task_nr; + td->val = rand(); + td->curr_cpu = -1; + td->process_lock = &process_lock; + + ret = pthread_create(pthreads + t, NULL, worker_thread, td); + BUG_ON(ret); + } + + for (t = 0; t < g->p.nr_threads; t++) { + ret = pthread_join(pthreads[t], NULL); + BUG_ON(ret); + } + + free_data(process_data, g->p.bytes_process); + free(pthreads); +} + +static void print_summary(void) +{ + if (g->p.show_details < 0) + return; + + printf("\n ###\n"); + printf(" # %d %s will execute (on %d nodes, %d CPUs):\n", + g->p.nr_tasks, g->p.nr_tasks == 1 ? "task" : "tasks", g->p.nr_nodes, g->p.nr_cpus); + printf(" # %5dx %5ldMB global shared mem operations\n", + g->p.nr_loops, g->p.bytes_global/1024/1024); + printf(" # %5dx %5ldMB process shared mem operations\n", + g->p.nr_loops, g->p.bytes_process/1024/1024); + printf(" # %5dx %5ldMB thread local mem operations\n", + g->p.nr_loops, g->p.bytes_thread/1024/1024); + + printf(" ###\n"); + + printf("\n ###\n"); fflush(stdout); +} + +static void init_thread_data(void) +{ + ssize_t size = sizeof(*g->threads)*g->p.nr_tasks; + int t; + + g->threads = zalloc_shared_data(size); + + for (t = 0; t < g->p.nr_tasks; t++) { + struct thread_data *td = g->threads + t; + int cpu; + + /* Allow all nodes by default: */ + td->bind_node = -1; + + /* Allow all CPUs by default: */ + CPU_ZERO(&td->bind_cpumask); + for (cpu = 0; cpu < g->p.nr_cpus; cpu++) + CPU_SET(cpu, &td->bind_cpumask); + } +} + +static void deinit_thread_data(void) +{ + ssize_t size = sizeof(*g->threads)*g->p.nr_tasks; + + free_data(g->threads, size); +} + +static int init(void) +{ + g = (void *)alloc_data(sizeof(*g), MAP_SHARED, 1, 0, 0 /* THP */, 0); + + /* Copy over options: */ + g->p = p0; + + g->p.nr_cpus = numa_num_configured_cpus(); + + g->p.nr_nodes = numa_max_node() + 1; + + /* char array in count_process_nodes(): */ + BUG_ON(g->p.nr_nodes > MAX_NR_NODES || g->p.nr_nodes < 0); + + if (g->p.show_quiet && !g->p.show_details) + g->p.show_details = -1; + + /* Some memory should be specified: */ + if (!g->p.mb_global_str && !g->p.mb_proc_str && !g->p.mb_thread_str) + return -1; + + if (g->p.mb_global_str) { + g->p.mb_global = atof(g->p.mb_global_str); + BUG_ON(g->p.mb_global < 0); + } + + if (g->p.mb_proc_str) { + g->p.mb_proc = atof(g->p.mb_proc_str); + BUG_ON(g->p.mb_proc < 0); + } + + if (g->p.mb_proc_locked_str) { + g->p.mb_proc_locked = atof(g->p.mb_proc_locked_str); + BUG_ON(g->p.mb_proc_locked < 0); + BUG_ON(g->p.mb_proc_locked > g->p.mb_proc); + } + + if (g->p.mb_thread_str) { + g->p.mb_thread = atof(g->p.mb_thread_str); + BUG_ON(g->p.mb_thread < 0); + } + + BUG_ON(g->p.nr_threads <= 0); + BUG_ON(g->p.nr_proc <= 0); + + g->p.nr_tasks = g->p.nr_proc*g->p.nr_threads; + + g->p.bytes_global = g->p.mb_global *1024L*1024L; + g->p.bytes_process = g->p.mb_proc *1024L*1024L; + g->p.bytes_process_locked = g->p.mb_proc_locked *1024L*1024L; + g->p.bytes_thread = g->p.mb_thread *1024L*1024L; + + g->data = setup_shared_data(g->p.bytes_global); + + /* Startup serialization: */ + init_global_mutex(&g->start_work_mutex); + init_global_mutex(&g->startup_mutex); + init_global_mutex(&g->startup_done_mutex); + init_global_mutex(&g->stop_work_mutex); + + init_thread_data(); + + tprintf("#\n"); + parse_setup_cpu_list(); + parse_setup_node_list(); + tprintf("#\n"); + + print_summary(); + + return 0; +} + +static void deinit(void) +{ + free_data(g->data, g->p.bytes_global); + g->data = NULL; + + deinit_thread_data(); + + free_data(g, sizeof(*g)); + g = NULL; +} + +/* + * Print a short or long result, depending on the verbosity setting: + */ +static void print_res(const char *name, double val, + const char *txt_unit, const char *txt_short, const char *txt_long) +{ + if (!name) + name = "main,"; + + if (g->p.show_quiet) + printf(" %-30s %15.3f, %-15s %s\n", name, val, txt_unit, txt_short); + else + printf(" %14.3f %s\n", val, txt_long); +} + +static int __bench_numa(const char *name) +{ + struct timeval start, stop, diff; + u64 runtime_ns_min, runtime_ns_sum; + pid_t *pids, pid, wpid; + double delta_runtime; + double runtime_avg; + double runtime_sec_max; + double runtime_sec_min; + int wait_stat; + double bytes; + int i, t; + + if (init()) + return -1; + + pids = zalloc(g->p.nr_proc * sizeof(*pids)); + pid = -1; + + /* All threads try to acquire it, this way we can wait for them to start up: */ + pthread_mutex_lock(&g->start_work_mutex); + + if (g->p.serialize_startup) { + tprintf(" #\n"); + tprintf(" # Startup synchronization: ..."); fflush(stdout); + } + + gettimeofday(&start, NULL); + + for (i = 0; i < g->p.nr_proc; i++) { + pid = fork(); + dprintf(" # process %2d: PID %d\n", i, pid); + + BUG_ON(pid < 0); + if (!pid) { + /* Child process: */ + worker_process(i); + + exit(0); + } + pids[i] = pid; + + } + /* Wait for all the threads to start up: */ + while (g->nr_tasks_started != g->p.nr_tasks) + usleep(1000); + + BUG_ON(g->nr_tasks_started != g->p.nr_tasks); + + if (g->p.serialize_startup) { + double startup_sec; + + pthread_mutex_lock(&g->startup_done_mutex); + + /* This will start all threads: */ + pthread_mutex_unlock(&g->start_work_mutex); + + /* This mutex is locked - the last started thread will wake us: */ + pthread_mutex_lock(&g->startup_done_mutex); + + gettimeofday(&stop, NULL); + + timersub(&stop, &start, &diff); + + startup_sec = diff.tv_sec * 1000000000.0; + startup_sec += diff.tv_usec * 1000.0; + startup_sec /= 1e9; + + tprintf(" threads initialized in %.6f seconds.\n", startup_sec); + tprintf(" #\n"); + + start = stop; + pthread_mutex_unlock(&g->startup_done_mutex); + } else { + gettimeofday(&start, NULL); + } + + /* Parent process: */ + + + for (i = 0; i < g->p.nr_proc; i++) { + wpid = waitpid(pids[i], &wait_stat, 0); + BUG_ON(wpid < 0); + BUG_ON(!WIFEXITED(wait_stat)); + + } + + runtime_ns_sum = 0; + runtime_ns_min = -1LL; + + for (t = 0; t < g->p.nr_tasks; t++) { + u64 thread_runtime_ns = g->threads[t].runtime_ns; + + runtime_ns_sum += thread_runtime_ns; + runtime_ns_min = min(thread_runtime_ns, runtime_ns_min); + } + + gettimeofday(&stop, NULL); + timersub(&stop, &start, &diff); + + BUG_ON(bench_format != BENCH_FORMAT_DEFAULT); + + tprintf("\n ###\n"); + tprintf("\n"); + + runtime_sec_max = diff.tv_sec * 1000000000.0; + runtime_sec_max += diff.tv_usec * 1000.0; + runtime_sec_max /= 1e9; + + runtime_sec_min = runtime_ns_min/1e9; + + bytes = g->bytes_done; + runtime_avg = (double)runtime_ns_sum / g->p.nr_tasks / 1e9; + + if (g->p.measure_convergence) { + print_res(name, runtime_sec_max, + "secs,", "NUMA-convergence-latency", "secs latency to NUMA-converge"); + } + + print_res(name, runtime_sec_max, + "secs,", "runtime-max/thread", "secs slowest (max) thread-runtime"); + + print_res(name, runtime_sec_min, + "secs,", "runtime-min/thread", "secs fastest (min) thread-runtime"); + + print_res(name, runtime_avg, + "secs,", "runtime-avg/thread", "secs average thread-runtime"); + + delta_runtime = (runtime_sec_max - runtime_sec_min)/2.0; + print_res(name, delta_runtime / runtime_sec_max * 100.0, + "%,", "spread-runtime/thread", "% difference between max/avg runtime"); + + print_res(name, bytes / g->p.nr_tasks / 1e9, + "GB,", "data/thread", "GB data processed, per thread"); + + print_res(name, bytes / 1e9, + "GB,", "data-total", "GB data processed, total"); + + print_res(name, runtime_sec_max * 1e9 / (bytes / g->p.nr_tasks), + "nsecs,", "runtime/byte/thread","nsecs/byte/thread runtime"); + + print_res(name, bytes / g->p.nr_tasks / 1e9 / runtime_sec_max, + "GB/sec,", "thread-speed", "GB/sec/thread speed"); + + print_res(name, bytes / runtime_sec_max / 1e9, + "GB/sec,", "total-speed", "GB/sec total speed"); + + free(pids); + + deinit(); + + return 0; +} + +#define MAX_ARGS 50 + +static int command_size(const char **argv) +{ + int size = 0; + + while (*argv) { + size++; + argv++; + } + + BUG_ON(size >= MAX_ARGS); + + return size; +} + +static void init_params(struct params *p, const char *name, int argc, const char **argv) +{ + int i; + + printf("\n # Running %s \"perf bench numa", name); + + for (i = 0; i < argc; i++) + printf(" %s", argv[i]); + + printf("\"\n"); + + memset(p, 0, sizeof(*p)); + + /* Initialize nonzero defaults: */ + + p->serialize_startup = 1; + p->data_reads = true; + p->data_writes = true; + p->data_backwards = true; + p->data_rand_walk = true; + p->nr_loops = -1; + p->init_random = true; +} + +static int run_bench_numa(const char *name, const char **argv) +{ + int argc = command_size(argv); + + init_params(&p0, name, argc, argv); + argc = parse_options(argc, argv, options, bench_numa_usage, 0); + if (argc) + goto err; + + if (__bench_numa(name)) + goto err; + + return 0; + +err: + usage_with_options(numa_usage, options); + return -1; +} + +#define OPT_BW_RAM "-s", "20", "-zZq", "--thp", " 1", "--no-data_rand_walk" +#define OPT_BW_RAM_NOTHP OPT_BW_RAM, "--thp", "-1" + +#define OPT_CONV "-s", "100", "-zZ0qcm", "--thp", " 1" +#define OPT_CONV_NOTHP OPT_CONV, "--thp", "-1" + +#define OPT_BW "-s", "20", "-zZ0q", "--thp", " 1" +#define OPT_BW_NOTHP OPT_BW, "--thp", "-1" + +/* + * The built-in test-suite executed by "perf bench numa -a". + * + * (A minimum of 4 nodes and 16 GB of RAM is recommended.) + */ +static const char *tests[][MAX_ARGS] = { + /* Basic single-stream NUMA bandwidth measurements: */ + { "RAM-bw-local,", "mem", "-p", "1", "-t", "1", "-P", "1024", + "-C" , "0", "-M", "0", OPT_BW_RAM }, + { "RAM-bw-local-NOTHP,", + "mem", "-p", "1", "-t", "1", "-P", "1024", + "-C" , "0", "-M", "0", OPT_BW_RAM_NOTHP }, + { "RAM-bw-remote,", "mem", "-p", "1", "-t", "1", "-P", "1024", + "-C" , "0", "-M", "1", OPT_BW_RAM }, + + /* 2-stream NUMA bandwidth measurements: */ + { "RAM-bw-local-2x,", "mem", "-p", "2", "-t", "1", "-P", "1024", + "-C", "0,2", "-M", "0x2", OPT_BW_RAM }, + { "RAM-bw-remote-2x,", "mem", "-p", "2", "-t", "1", "-P", "1024", + "-C", "0,2", "-M", "1x2", OPT_BW_RAM }, + + /* Cross-stream NUMA bandwidth measurement: */ + { "RAM-bw-cross,", "mem", "-p", "2", "-t", "1", "-P", "1024", + "-C", "0,8", "-M", "1,0", OPT_BW_RAM }, + + /* Convergence latency measurements: */ + { " 1x3-convergence,", "mem", "-p", "1", "-t", "3", "-P", "512", OPT_CONV }, + { " 1x4-convergence,", "mem", "-p", "1", "-t", "4", "-P", "512", OPT_CONV }, + { " 1x6-convergence,", "mem", "-p", "1", "-t", "6", "-P", "1020", OPT_CONV }, + { " 2x3-convergence,", "mem", "-p", "3", "-t", "3", "-P", "1020", OPT_CONV }, + { " 3x3-convergence,", "mem", "-p", "3", "-t", "3", "-P", "1020", OPT_CONV }, + { " 4x4-convergence,", "mem", "-p", "4", "-t", "4", "-P", "512", OPT_CONV }, + { " 4x4-convergence-NOTHP,", + "mem", "-p", "4", "-t", "4", "-P", "512", OPT_CONV_NOTHP }, + { " 4x6-convergence,", "mem", "-p", "4", "-t", "6", "-P", "1020", OPT_CONV }, + { " 4x8-convergence,", "mem", "-p", "4", "-t", "8", "-P", "512", OPT_CONV }, + { " 8x4-convergence,", "mem", "-p", "8", "-t", "4", "-P", "512", OPT_CONV }, + { " 8x4-convergence-NOTHP,", + "mem", "-p", "8", "-t", "4", "-P", "512", OPT_CONV_NOTHP }, + { " 3x1-convergence,", "mem", "-p", "3", "-t", "1", "-P", "512", OPT_CONV }, + { " 4x1-convergence,", "mem", "-p", "4", "-t", "1", "-P", "512", OPT_CONV }, + { " 8x1-convergence,", "mem", "-p", "8", "-t", "1", "-P", "512", OPT_CONV }, + { "16x1-convergence,", "mem", "-p", "16", "-t", "1", "-P", "256", OPT_CONV }, + { "32x1-convergence,", "mem", "-p", "32", "-t", "1", "-P", "128", OPT_CONV }, + + /* Various NUMA process/thread layout bandwidth measurements: */ + { " 2x1-bw-process,", "mem", "-p", "2", "-t", "1", "-P", "1024", OPT_BW }, + { " 3x1-bw-process,", "mem", "-p", "3", "-t", "1", "-P", "1024", OPT_BW }, + { " 4x1-bw-process,", "mem", "-p", "4", "-t", "1", "-P", "1024", OPT_BW }, + { " 8x1-bw-process,", "mem", "-p", "8", "-t", "1", "-P", " 512", OPT_BW }, + { " 8x1-bw-process-NOTHP,", + "mem", "-p", "8", "-t", "1", "-P", " 512", OPT_BW_NOTHP }, + { "16x1-bw-process,", "mem", "-p", "16", "-t", "1", "-P", "256", OPT_BW }, + + { " 4x1-bw-thread,", "mem", "-p", "1", "-t", "4", "-T", "256", OPT_BW }, + { " 8x1-bw-thread,", "mem", "-p", "1", "-t", "8", "-T", "256", OPT_BW }, + { "16x1-bw-thread,", "mem", "-p", "1", "-t", "16", "-T", "128", OPT_BW }, + { "32x1-bw-thread,", "mem", "-p", "1", "-t", "32", "-T", "64", OPT_BW }, + + { " 2x3-bw-thread,", "mem", "-p", "2", "-t", "3", "-P", "512", OPT_BW }, + { " 4x4-bw-thread,", "mem", "-p", "4", "-t", "4", "-P", "512", OPT_BW }, + { " 4x6-bw-thread,", "mem", "-p", "4", "-t", "6", "-P", "512", OPT_BW }, + { " 4x8-bw-thread,", "mem", "-p", "4", "-t", "8", "-P", "512", OPT_BW }, + { " 4x8-bw-thread-NOTHP,", + "mem", "-p", "4", "-t", "8", "-P", "512", OPT_BW_NOTHP }, + { " 3x3-bw-thread,", "mem", "-p", "3", "-t", "3", "-P", "512", OPT_BW }, + { " 5x5-bw-thread,", "mem", "-p", "5", "-t", "5", "-P", "512", OPT_BW }, + + { "2x16-bw-thread,", "mem", "-p", "2", "-t", "16", "-P", "512", OPT_BW }, + { "1x32-bw-thread,", "mem", "-p", "1", "-t", "32", "-P", "2048", OPT_BW }, + + { "numa02-bw,", "mem", "-p", "1", "-t", "32", "-T", "32", OPT_BW }, + { "numa02-bw-NOTHP,", "mem", "-p", "1", "-t", "32", "-T", "32", OPT_BW_NOTHP }, + { "numa01-bw-thread,", "mem", "-p", "2", "-t", "16", "-T", "192", OPT_BW }, + { "numa01-bw-thread-NOTHP,", + "mem", "-p", "2", "-t", "16", "-T", "192", OPT_BW_NOTHP }, +}; + +static int bench_all(void) +{ + int nr = ARRAY_SIZE(tests); + int ret; + int i; + + ret = system("echo ' #'; echo ' # Running test on: '$(uname -a); echo ' #'"); + BUG_ON(ret < 0); + + for (i = 0; i < nr; i++) { + if (run_bench_numa(tests[i][0], tests[i] + 1)) + return -1; + } + + printf("\n"); + + return 0; +} + +int bench_numa(int argc, const char **argv, const char *prefix __maybe_unused) +{ + init_params(&p0, "main,", argc, argv); + argc = parse_options(argc, argv, options, bench_numa_usage, 0); + if (argc) + goto err; + + if (p0.run_all) + return bench_all(); + + if (__bench_numa(NULL)) + goto err; + + return 0; + +err: + usage_with_options(numa_usage, options); + return -1; +} diff --git a/tools/perf/builtin-bench.c b/tools/perf/builtin-bench.c index afd1255..e5d514b 100644 --- a/tools/perf/builtin-bench.c +++ b/tools/perf/builtin-bench.c @@ -35,6 +35,16 @@ struct bench_suite { /* sentinel: easy for help */ #define suite_all { "all", "Test all benchmark suites", NULL } +static struct bench_suite numa_suites[] = { + { "mem", + "Benchmark for NUMA workloads", + bench_numa }, + suite_all, + { NULL, + NULL, + NULL } +}; + static struct bench_suite sched_suites[] = { { "messaging", "Benchmark for scheduler and IPC mechanisms", @@ -68,6 +78,9 @@ struct bench_subsys { }; static struct bench_subsys subsystems[] = { + { "numa", + "NUMA scheduling and MM behavior", + numa_suites }, { "sched", "scheduler and IPC mechanism", sched_suites }, -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 12/21] perf tools: Make numa benchmark optional 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (10 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 11/21] perf: Add 'perf bench numa mem' NUMA performance measurement suite Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 13/21] perf evsel: Add prev_raw_count field Arnaldo Carvalho de Melo ` (9 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Peter Hurley, Peter Zijlstra, Arnaldo Carvalho de Melo From: Peter Hurley <peter@hurleysoftware.com> Commit "perf: Add 'perf bench numa mem'..." added a NUMA performance benchmark to perf. Make this optional and test for required dependencies. Signed-off-by: Peter Hurley <peter@hurleysoftware.com> Acked-by: Ingo Molnar <mingo@kernel.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1359337882-21821-1-git-send-email-peter@hurleysoftware.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/Makefile | 16 ++++++++++++++-- tools/perf/builtin-bench.c | 4 ++++ tools/perf/config/feature-tests.mak | 11 +++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/tools/perf/Makefile b/tools/perf/Makefile index b62dbc0..4b1044c 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile @@ -47,6 +47,8 @@ include config/utilities.mak # backtrace post unwind. # # Define NO_BACKTRACE if you do not want stack backtrace debug feature +# +# Define NO_LIBNUMA if you do not want numa perf benchmark $(OUTPUT)PERF-VERSION-FILE: .FORCE-PERF-VERSION-FILE @$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT) @@ -103,7 +105,7 @@ ifdef PARSER_DEBUG endif CFLAGS = -fno-omit-frame-pointer -ggdb3 -funwind-tables -Wall -Wextra -std=gnu99 $(CFLAGS_WERROR) $(CFLAGS_OPTIMIZE) $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) $(PARSER_DEBUG_CFLAGS) -EXTLIBS = -lpthread -lrt -lelf -lm -lnuma +EXTLIBS = -lpthread -lrt -lelf -lm ALL_CFLAGS = $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE ALL_LDFLAGS = $(LDFLAGS) STRIP ?= strip @@ -492,7 +494,6 @@ LIB_OBJS += $(OUTPUT)tests/python-use.o BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o BUILTIN_OBJS += $(OUTPUT)builtin-bench.o # Benchmark modules -BUILTIN_OBJS += $(OUTPUT)bench/numa.o BUILTIN_OBJS += $(OUTPUT)bench/sched-messaging.o BUILTIN_OBJS += $(OUTPUT)bench/sched-pipe.o ifeq ($(RAW_ARCH),x86_64) @@ -839,6 +840,17 @@ ifndef NO_BACKTRACE endif endif +ifndef NO_LIBNUMA + FLAGS_LIBNUMA = $(ALL_CFLAGS) $(ALL_LDFLAGS) -lnuma + ifneq ($(call try-cc,$(SOURCE_LIBNUMA),$(FLAGS_LIBNUMA),libnuma),y) + msg := $(warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numa-libs-devel or libnuma-dev); + else + BASIC_CFLAGS += -DLIBNUMA_SUPPORT + BUILTIN_OBJS += $(OUTPUT)bench/numa.o + EXTLIBS += -lnuma + endif +endif + ifdef ASCIIDOC8 export ASCIIDOC8 endif diff --git a/tools/perf/builtin-bench.c b/tools/perf/builtin-bench.c index e5d514b..77298bf 100644 --- a/tools/perf/builtin-bench.c +++ b/tools/perf/builtin-bench.c @@ -35,6 +35,7 @@ struct bench_suite { /* sentinel: easy for help */ #define suite_all { "all", "Test all benchmark suites", NULL } +#ifdef LIBNUMA_SUPPORT static struct bench_suite numa_suites[] = { { "mem", "Benchmark for NUMA workloads", @@ -44,6 +45,7 @@ static struct bench_suite numa_suites[] = { NULL, NULL } }; +#endif static struct bench_suite sched_suites[] = { { "messaging", @@ -78,9 +80,11 @@ struct bench_subsys { }; static struct bench_subsys subsystems[] = { +#ifdef LIBNUMA_SUPPORT { "numa", "NUMA scheduling and MM behavior", numa_suites }, +#endif { "sched", "scheduler and IPC mechanism", sched_suites }, diff --git a/tools/perf/config/feature-tests.mak b/tools/perf/config/feature-tests.mak index f5ac774..b4eabb4 100644 --- a/tools/perf/config/feature-tests.mak +++ b/tools/perf/config/feature-tests.mak @@ -225,3 +225,14 @@ int main(void) return on_exit(NULL, NULL); } endef + +define SOURCE_LIBNUMA +#include <numa.h> +#include <numaif.h> + +int main(void) +{ + numa_available(); + return 0; +} +endef \ No newline at end of file -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 13/21] perf evsel: Add prev_raw_count field 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (11 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 12/21] perf tools: Make numa benchmark optional Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 14/21] perf stat: Add interval printing Arnaldo Carvalho de Melo ` (8 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Stephane Eranian, Andi Kleen, Ingo Molnar, Jiri Olsa, Namhyung Kim, Peter Zijlstra, Arnaldo Carvalho de Melo From: Stephane Eranian <eranian@google.com> This field will be used by commands which print counter deltas on regular timer intervals, such as perf stat -I. Signed-off-by: Stephane Eranian <eranian@google.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung.kim@lge.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1359460064-3060-2-git-send-email-eranian@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/evsel.c | 26 ++++++++++++++++++++++++++ tools/perf/util/evsel.h | 1 + 2 files changed, 27 insertions(+) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index e45332d..dbdcca4 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -659,6 +659,28 @@ void perf_evsel__delete(struct perf_evsel *evsel) free(evsel); } +static inline void compute_deltas(struct perf_evsel *evsel, + int cpu, + struct perf_counts_values *count) +{ + struct perf_counts_values tmp; + + if (!evsel->prev_raw_counts) + return; + + if (cpu == -1) { + tmp = evsel->prev_raw_counts->aggr; + evsel->prev_raw_counts->aggr = *count; + } else { + tmp = evsel->prev_raw_counts->cpu[cpu]; + evsel->prev_raw_counts->cpu[cpu] = *count; + } + + count->val = count->val - tmp.val; + count->ena = count->ena - tmp.ena; + count->run = count->run - tmp.run; +} + int __perf_evsel__read_on_cpu(struct perf_evsel *evsel, int cpu, int thread, bool scale) { @@ -674,6 +696,8 @@ int __perf_evsel__read_on_cpu(struct perf_evsel *evsel, if (readn(FD(evsel, cpu, thread), &count, nv * sizeof(u64)) < 0) return -errno; + compute_deltas(evsel, cpu, &count); + if (scale) { if (count.run == 0) count.val = 0; @@ -712,6 +736,8 @@ int __perf_evsel__read(struct perf_evsel *evsel, } } + compute_deltas(evsel, -1, aggr); + evsel->counts->scaled = 0; if (scale) { if (aggr->run == 0) { diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index c68d1b8..3a4cd60 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -53,6 +53,7 @@ struct perf_evsel { struct xyarray *sample_id; u64 *id; struct perf_counts *counts; + struct perf_counts *prev_raw_counts; int idx; u32 ids; struct hists hists; -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 14/21] perf stat: Add interval printing 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (12 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 13/21] perf evsel: Add prev_raw_count field Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 15/21] perf evsel: Fix memory leaks on evsel->counts Arnaldo Carvalho de Melo ` (7 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Stephane Eranian, Andi Kleen, Ingo Molnar, Jiri Olsa, Namhyung Kim, Peter Zijlstra, Arnaldo Carvalho de Melo From: Stephane Eranian <eranian@google.com> This patch adds a new printing mode for perf stat. It allows interval printing. That means perf stat can now print event deltas at regular time interval. This is useful to detect phases in programs. The -I option enables interval printing. It expects an interval duration in milliseconds. Minimum is 100ms. Once, activated perf stat prints events deltas since last printout. All modes are supported. $ perf stat -I 1000 -e cycles noploop 10 noploop for 10 seconds # time counts events 1.000109853 2,388,560,546 cycles 2.000262846 2,393,332,358 cycles 3.000354131 2,393,176,537 cycles 4.000439503 2,393,203,790 cycles 5.000527075 2,393,167,675 cycles 6.000609052 2,393,203,670 cycles 7.000691082 2,393,175,678 cycles The output format makes it easy to feed into a plotting program such as gnuplot when the -I option is used in combination with the -x option: $ perf stat -x, -I 1000 -e cycles noploop 10 noploop for 10 seconds 1.000084113,2378775498,cycles 2.000245798,2391056897,cycles 3.000354445,2392089414,cycles 4.000459115,2390936603,cycles 5.000565341,2392108173,cycles Signed-off-by: Stephane Eranian <eranian@google.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung.kim@lge.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1359460064-3060-3-git-send-email-eranian@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/Documentation/perf-stat.txt | 4 + tools/perf/builtin-stat.c | 157 +++++++++++++++++++++++++++++---- 2 files changed, 146 insertions(+), 15 deletions(-) diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt index cf0c310..5289da3 100644 --- a/tools/perf/Documentation/perf-stat.txt +++ b/tools/perf/Documentation/perf-stat.txt @@ -114,6 +114,10 @@ with it. --append may be used here. Examples: perf stat --repeat 10 --null --sync --pre 'make -s O=defconfig-build/clean' -- make -s -j64 O=defconfig-build/ bzImage +-I msecs:: +--interval-print msecs:: + print count deltas every N milliseconds (minimum: 100ms) + example: perf stat -I 1000 -e cycles -a sleep 5 EXAMPLES -------- diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 1c2ac14..493043a 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -65,6 +65,10 @@ #define CNTR_NOT_SUPPORTED "<not supported>" #define CNTR_NOT_COUNTED "<not counted>" +static void print_stat(int argc, const char **argv); +static void print_counter_aggr(struct perf_evsel *counter, char *prefix); +static void print_counter(struct perf_evsel *counter, char *prefix); + static struct perf_evlist *evsel_list; static struct perf_target target = { @@ -87,6 +91,8 @@ static FILE *output = NULL; static const char *pre_cmd = NULL; static const char *post_cmd = NULL; static bool sync_run = false; +static unsigned int interval = 0; +static struct timespec ref_time; static volatile int done = 0; @@ -94,6 +100,28 @@ struct perf_stat { struct stats res_stats[3]; }; +static inline void diff_timespec(struct timespec *r, struct timespec *a, + struct timespec *b) +{ + r->tv_sec = a->tv_sec - b->tv_sec; + if (a->tv_nsec < b->tv_nsec) { + r->tv_nsec = a->tv_nsec + 1000000000L - b->tv_nsec; + r->tv_sec--; + } else { + r->tv_nsec = a->tv_nsec - b->tv_nsec ; + } +} + +static inline struct cpu_map *perf_evsel__cpus(struct perf_evsel *evsel) +{ + return (evsel->cpus && !target.cpu_list) ? evsel->cpus : evsel_list->cpus; +} + +static inline int perf_evsel__nr_cpus(struct perf_evsel *evsel) +{ + return perf_evsel__cpus(evsel)->nr; +} + static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel) { evsel->priv = zalloc(sizeof(struct perf_stat)); @@ -106,14 +134,27 @@ static void perf_evsel__free_stat_priv(struct perf_evsel *evsel) evsel->priv = NULL; } -static inline struct cpu_map *perf_evsel__cpus(struct perf_evsel *evsel) +static int perf_evsel__alloc_prev_raw_counts(struct perf_evsel *evsel) { - return (evsel->cpus && !target.cpu_list) ? evsel->cpus : evsel_list->cpus; + void *addr; + size_t sz; + + sz = sizeof(*evsel->counts) + + (perf_evsel__nr_cpus(evsel) * sizeof(struct perf_counts_values)); + + addr = zalloc(sz); + if (!addr) + return -ENOMEM; + + evsel->prev_raw_counts = addr; + + return 0; } -static inline int perf_evsel__nr_cpus(struct perf_evsel *evsel) +static void perf_evsel__free_prev_raw_counts(struct perf_evsel *evsel) { - return perf_evsel__cpus(evsel)->nr; + free(evsel->prev_raw_counts); + evsel->prev_raw_counts = NULL; } static struct stats runtime_nsecs_stats[MAX_NR_CPUS]; @@ -245,16 +286,69 @@ static int read_counter(struct perf_evsel *counter) return 0; } +static void print_interval(void) +{ + static int num_print_interval; + struct perf_evsel *counter; + struct perf_stat *ps; + struct timespec ts, rs; + char prefix[64]; + + if (no_aggr) { + list_for_each_entry(counter, &evsel_list->entries, node) { + ps = counter->priv; + memset(ps->res_stats, 0, sizeof(ps->res_stats)); + read_counter(counter); + } + } else { + list_for_each_entry(counter, &evsel_list->entries, node) { + ps = counter->priv; + memset(ps->res_stats, 0, sizeof(ps->res_stats)); + read_counter_aggr(counter); + } + } + clock_gettime(CLOCK_MONOTONIC, &ts); + diff_timespec(&rs, &ts, &ref_time); + sprintf(prefix, "%6lu.%09lu%s", rs.tv_sec, rs.tv_nsec, csv_sep); + + if (num_print_interval == 0 && !csv_output) { + if (no_aggr) + fprintf(output, "# time CPU counts events\n"); + else + fprintf(output, "# time counts events\n"); + } + + if (++num_print_interval == 25) + num_print_interval = 0; + + if (no_aggr) { + list_for_each_entry(counter, &evsel_list->entries, node) + print_counter(counter, prefix); + } else { + list_for_each_entry(counter, &evsel_list->entries, node) + print_counter_aggr(counter, prefix); + } +} + static int __run_perf_stat(int argc __maybe_unused, const char **argv) { char msg[512]; unsigned long long t0, t1; struct perf_evsel *counter; + struct timespec ts; int status = 0; int child_ready_pipe[2], go_pipe[2]; const bool forks = (argc > 0); char buf; + if (interval) { + ts.tv_sec = interval / 1000; + ts.tv_nsec = (interval % 1000) * 1000000; + } else { + ts.tv_sec = 1; + ts.tv_nsec = 0; + } + if (forks && (pipe(child_ready_pipe) < 0 || pipe(go_pipe) < 0)) { perror("failed to create pipes"); return -1; @@ -347,14 +441,25 @@ static int __run_perf_stat(int argc __maybe_unused, const char **argv) * Enable counters and exec the command: */ t0 = rdclock(); + clock_gettime(CLOCK_MONOTONIC, &ref_time); if (forks) { close(go_pipe[1]); + if (interval) { + while (!waitpid(child_pid, &status, WNOHANG)) { + nanosleep(&ts, NULL); + print_interval(); + } + } wait(&status); if (WIFSIGNALED(status)) psignal(WTERMSIG(status), argv[0]); } else { - while(!done) sleep(1); + while (!done) { + nanosleep(&ts, NULL); + if (interval) + print_interval(); + } } t1 = rdclock(); @@ -440,7 +545,7 @@ static void nsec_printout(int cpu, struct perf_evsel *evsel, double avg) if (evsel->cgrp) fprintf(output, "%s%s", csv_sep, evsel->cgrp->name); - if (csv_output) + if (csv_output || interval) return; if (perf_evsel__match(evsel, SOFTWARE, SW_TASK_CLOCK)) @@ -654,12 +759,11 @@ static void abs_printout(int cpu, struct perf_evsel *evsel, double avg) if (evsel->cgrp) fprintf(output, "%s%s", csv_sep, evsel->cgrp->name); - if (csv_output) + if (csv_output || interval) return; if (perf_evsel__match(evsel, HARDWARE, HW_INSTRUCTIONS)) { total = avg_stats(&runtime_cycles_stats[cpu]); - if (total) ratio = avg / total; @@ -753,12 +857,15 @@ static void abs_printout(int cpu, struct perf_evsel *evsel, double avg) * Print out the results of a single counter: * aggregated counts in system-wide mode */ -static void print_counter_aggr(struct perf_evsel *counter) +static void print_counter_aggr(struct perf_evsel *counter, char *prefix) { struct perf_stat *ps = counter->priv; double avg = avg_stats(&ps->res_stats[0]); int scaled = counter->counts->scaled; + if (prefix) + fprintf(output, "%s", prefix); + if (scaled == -1) { fprintf(output, "%*s%s%*s", csv_output ? 0 : 18, @@ -801,7 +908,7 @@ static void print_counter_aggr(struct perf_evsel *counter) * Print out the results of a single counter: * does not use aggregated count in system-wide */ -static void print_counter(struct perf_evsel *counter) +static void print_counter(struct perf_evsel *counter, char *prefix) { u64 ena, run, val; int cpu; @@ -810,6 +917,10 @@ static void print_counter(struct perf_evsel *counter) val = counter->counts->cpu[cpu].val; ena = counter->counts->cpu[cpu].ena; run = counter->counts->cpu[cpu].run; + + if (prefix) + fprintf(output, "%s", prefix); + if (run == 0 || ena == 0) { fprintf(output, "CPU%*d%s%*s%s%*s", csv_output ? 0 : -4, @@ -871,10 +982,10 @@ static void print_stat(int argc, const char **argv) if (no_aggr) { list_for_each_entry(counter, &evsel_list->entries, node) - print_counter(counter); + print_counter(counter, NULL); } else { list_for_each_entry(counter, &evsel_list->entries, node) - print_counter_aggr(counter); + print_counter_aggr(counter, NULL); } if (!csv_output) { @@ -895,7 +1006,7 @@ static volatile int signr = -1; static void skip_signal(int signo) { - if(child_pid == -1) + if ((child_pid == -1) || interval) done = 1; signr = signo; @@ -1115,6 +1226,8 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused) "command to run prior to the measured command"), OPT_STRING(0, "post", &post_cmd, "command", "command to run after to the measured command"), + OPT_UINTEGER('I', "interval-print", &interval, + "print counts at regular interval in ms (>= 100)"), OPT_END() }; const char * const stat_usage[] = { @@ -1215,12 +1328,23 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused) usage_with_options(stat_usage, options); return -1; } + if (interval && interval < 100) { + pr_err("print interval must be >= 100ms\n"); + usage_with_options(stat_usage, options); + return -1; + } list_for_each_entry(pos, &evsel_list->entries, node) { if (perf_evsel__alloc_stat_priv(pos) < 0 || perf_evsel__alloc_counts(pos, perf_evsel__nr_cpus(pos)) < 0) goto out_free_fd; } + if (interval) { + list_for_each_entry(pos, &evsel_list->entries, node) { + if (perf_evsel__alloc_prev_raw_counts(pos) < 0) + goto out_free_fd; + } + } /* * We dont want to block the signals - that would cause @@ -1230,6 +1354,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused) */ atexit(sig_atexit); signal(SIGINT, skip_signal); + signal(SIGCHLD, skip_signal); signal(SIGALRM, skip_signal); signal(SIGABRT, skip_signal); @@ -1242,11 +1367,13 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused) status = run_perf_stat(argc, argv); } - if (status != -1) + if (status != -1 && !interval) print_stat(argc, argv); out_free_fd: - list_for_each_entry(pos, &evsel_list->entries, node) + list_for_each_entry(pos, &evsel_list->entries, node) { perf_evsel__free_stat_priv(pos); + perf_evsel__free_prev_raw_counts(pos); + } perf_evlist__delete_maps(evsel_list); out: perf_evlist__delete(evsel_list); -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 15/21] perf evsel: Fix memory leaks on evsel->counts 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (13 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 14/21] perf stat: Add interval printing Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 16/21] perf tools, powerpc: Fix compile warnings in tests/attr.c Arnaldo Carvalho de Melo ` (6 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Namhyung Kim, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Arnaldo Carvalho de Melo From: Namhyung Kim <namhyung.kim@lge.com> The ->counts field was never freed in the current code. Add perf_evsel__free_counts() function to free it properly. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1359078284-32080-1-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/builtin-stat.c | 1 + tools/perf/tests/open-syscall-all-cpus.c | 1 + tools/perf/util/evsel.c | 5 +++++ tools/perf/util/evsel.h | 1 + 4 files changed, 8 insertions(+) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 493043a..0368a10 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1372,6 +1372,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused) out_free_fd: list_for_each_entry(pos, &evsel_list->entries, node) { perf_evsel__free_stat_priv(pos); + perf_evsel__free_counts(pos); perf_evsel__free_prev_raw_counts(pos); } perf_evlist__delete_maps(evsel_list); diff --git a/tools/perf/tests/open-syscall-all-cpus.c b/tools/perf/tests/open-syscall-all-cpus.c index 9b920a0..b0657a9 100644 --- a/tools/perf/tests/open-syscall-all-cpus.c +++ b/tools/perf/tests/open-syscall-all-cpus.c @@ -98,6 +98,7 @@ int test__open_syscall_event_on_all_cpus(void) } } + perf_evsel__free_counts(evsel); out_close_fd: perf_evsel__close_fd(evsel, 1, threads->nr); out_evsel_delete: diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index dbdcca4..baa26dd 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -640,6 +640,11 @@ void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads) } } +void perf_evsel__free_counts(struct perf_evsel *evsel) +{ + free(evsel->counts); +} + void perf_evsel__exit(struct perf_evsel *evsel) { assert(list_empty(&evsel->node)); diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 3a4cd60..cbf4232 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -117,6 +117,7 @@ int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads); int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus); void perf_evsel__free_fd(struct perf_evsel *evsel); void perf_evsel__free_id(struct perf_evsel *evsel); +void perf_evsel__free_counts(struct perf_evsel *evsel); void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads); void __perf_evsel__set_sample_bit(struct perf_evsel *evsel, -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 16/21] perf tools, powerpc: Fix compile warnings in tests/attr.c 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (14 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 15/21] perf evsel: Fix memory leaks on evsel->counts Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 17/21] perf tools: Fix possible double free on error Arnaldo Carvalho de Melo ` (5 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Sukadev Bhattiprolu, Anton Blanchard, Jiri Olsa, Michael Ellerman, linuxppc-dev, Arnaldo Carvalho de Melo From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> We print several '__u64' quantities using '%llu'. On powerpc, we by default include '<asm-generic/int-l64.h> which results in __u64 being an unsigned long. This causes compile warnings which are treated as errors due to '-Werror'. By defining __SANE_USERSPACE_TYPES__ we include <asm-generic/int-ll64.h> and define __u64 as unsigned long long. Changelog[v2]: [Michael Ellerman] Use __SANE_USERSPACE_TYPES__ and avoid PRIu64 format specifier - which as Jiri Olsa pointed out, breaks on x86-64. Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Cc: Anton Blanchard <anton@au1.ibm.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Michael Ellerman <ellerman@au1.ibm.com> Cc: linuxppc-dev@ozlabs.org Link: http://lkml.kernel.org/r/20130124054439.GA31588@us.ibm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/tests/attr.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/perf/tests/attr.c b/tools/perf/tests/attr.c index f61dd3f..bdcceb8 100644 --- a/tools/perf/tests/attr.c +++ b/tools/perf/tests/attr.c @@ -19,6 +19,11 @@ * permissions. All the event text files are stored there. */ +/* + * Powerpc needs __SANE_USERSPACE_TYPES__ before <linux/types.h> to select + * 'int-ll64.h' and avoid compile warnings when printing __u64 with %llu. + */ +#define __SANE_USERSPACE_TYPES__ #include <stdlib.h> #include <stdio.h> #include <inttypes.h> -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 17/21] perf tools: Fix possible double free on error 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (15 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 16/21] perf tools, powerpc: Fix compile warnings in tests/attr.c Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 18/21] perf sort: Use pclose() instead of fclose() on pipe stream Arnaldo Carvalho de Melo ` (4 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar; +Cc: linux-kernel, Thomas Jarosch, Arnaldo Carvalho de Melo From: Thomas Jarosch <thomas.jarosch@intra2net.com> Can only be triggered via CROSS_COMPILE env var. Detected by cppcheck. Signed-off-by: Thomas Jarosch <thomas.jarosch@intra2net.com> Link: http://lkml.kernel.org/r/36736865.AIlztKhDqN@storm Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/arch/common.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/perf/arch/common.c b/tools/perf/arch/common.c index 3e975cb..aacef07 100644 --- a/tools/perf/arch/common.c +++ b/tools/perf/arch/common.c @@ -155,6 +155,7 @@ static int perf_session_env__lookup_binutils_path(struct perf_session_env *env, if (lookup_path(buf)) goto out; free(buf); + buf = NULL; } if (!strcmp(arch, "arm")) -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 18/21] perf sort: Use pclose() instead of fclose() on pipe stream 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (16 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 17/21] perf tools: Fix possible double free on error Arnaldo Carvalho de Melo @ 2013-01-30 14:46 ` Arnaldo Carvalho de Melo 2013-01-30 14:47 ` [PATCH 19/21] perf tools: Fix memory leak on error Arnaldo Carvalho de Melo ` (3 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:46 UTC (permalink / raw) To: Ingo Molnar; +Cc: linux-kernel, Thomas Jarosch, Arnaldo Carvalho de Melo From: Thomas Jarosch <thomas.jarosch@intra2net.com> cppcheck message: [tools/perf/util/sort.c:277]: (error) Mismatching allocation and deallocation: fp Also fix descriptor leak on error and always initialize the "fp" variable. Signed-off-by: Thomas Jarosch <thomas.jarosch@intra2net.com> Link: http://lkml.kernel.org/r/1359112354.yZcisNZ4k0@storm Link: http://lkml.kernel.org/r/2266358.qvDXKLvJ67@storm Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/sort.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 7ad6239..8333661 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -249,7 +249,7 @@ static int hist_entry__srcline_snprintf(struct hist_entry *self, char *bf, size_t size, unsigned int width __maybe_unused) { - FILE *fp; + FILE *fp = NULL; char cmd[PATH_MAX + 2], *path = self->srcline, *nl; size_t line_len; @@ -270,7 +270,6 @@ static int hist_entry__srcline_snprintf(struct hist_entry *self, char *bf, if (getline(&path, &line_len, fp) < 0 || !line_len) goto out_ip; - fclose(fp); self->srcline = strdup(path); if (self->srcline == NULL) goto out_ip; @@ -280,8 +279,12 @@ static int hist_entry__srcline_snprintf(struct hist_entry *self, char *bf, *nl = '\0'; path = self->srcline; out_path: + if (fp) + pclose(fp); return repsep_snprintf(bf, size, "%s", path); out_ip: + if (fp) + pclose(fp); return repsep_snprintf(bf, size, "%-#*llx", BITS_PER_LONG / 4, self->ip); } -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 19/21] perf tools: Fix memory leak on error 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (17 preceding siblings ...) 2013-01-30 14:46 ` [PATCH 18/21] perf sort: Use pclose() instead of fclose() on pipe stream Arnaldo Carvalho de Melo @ 2013-01-30 14:47 ` Arnaldo Carvalho de Melo 2013-01-30 14:47 ` [PATCH 20/21] perf header: Fix memory leak for the "Not caching a kptr_restrict'ed /proc/kallsyms" case Arnaldo Carvalho de Melo ` (2 subsequent siblings) 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:47 UTC (permalink / raw) To: Ingo Molnar; +Cc: linux-kernel, Thomas Jarosch, Arnaldo Carvalho de Melo From: Thomas Jarosch <thomas.jarosch@intra2net.com> cppcheck reported: [util/event.c:480]: (error) Memory leak: event Signed-off-by: Thomas Jarosch <thomas.jarosch@intra2net.com> Link: http://lkml.kernel.org/r/2717013.8dV0naNhAV@storm Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/event.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 3cf2c3e..5cd13d7 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -476,8 +476,10 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, } } - if (kallsyms__parse(filename, &args, find_symbol_cb) <= 0) + if (kallsyms__parse(filename, &args, find_symbol_cb) <= 0) { + free(event); return -ENOENT; + } map = machine->vmlinux_maps[MAP__FUNCTION]; size = snprintf(event->mmap.filename, sizeof(event->mmap.filename), -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 20/21] perf header: Fix memory leak for the "Not caching a kptr_restrict'ed /proc/kallsyms" case 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (18 preceding siblings ...) 2013-01-30 14:47 ` [PATCH 19/21] perf tools: Fix memory leak on error Arnaldo Carvalho de Melo @ 2013-01-30 14:47 ` Arnaldo Carvalho de Melo 2013-01-30 14:47 ` [PATCH 21/21] perf header: Fix double fclose() on do_write(fd, xxx) failure Arnaldo Carvalho de Melo 2013-01-31 9:27 ` [GIT PULL 00/21] perf/core improvements and fixes Ingo Molnar 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:47 UTC (permalink / raw) To: Ingo Molnar; +Cc: linux-kernel, Thomas Jarosch, Arnaldo Carvalho de Melo From: Thomas Jarosch <thomas.jarosch@intra2net.com> cppcheck reported: [util/header.c:316]: (error) Memory leak: filename [util/header.c:316]: (error) Memory leak: linkname Signed-off-by: Thomas Jarosch <thomas.jarosch@intra2net.com> Link: http://lkml.kernel.org/r/9377388.0eFDp53iW6@storm Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/header.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index e17a8fe..7b24cf3 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -313,7 +313,8 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, if (is_kallsyms) { if (symbol_conf.kptr_restrict) { pr_debug("Not caching a kptr_restrict'ed /proc/kallsyms\n"); - return 0; + err = 0; + goto out_free; } realname = (char *) name; } else -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* [PATCH 21/21] perf header: Fix double fclose() on do_write(fd, xxx) failure 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (19 preceding siblings ...) 2013-01-30 14:47 ` [PATCH 20/21] perf header: Fix memory leak for the "Not caching a kptr_restrict'ed /proc/kallsyms" case Arnaldo Carvalho de Melo @ 2013-01-30 14:47 ` Arnaldo Carvalho de Melo 2013-01-31 9:27 ` [GIT PULL 00/21] perf/core improvements and fixes Ingo Molnar 21 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-01-30 14:47 UTC (permalink / raw) To: Ingo Molnar; +Cc: linux-kernel, Thomas Jarosch, Arnaldo Carvalho de Melo From: Thomas Jarosch <thomas.jarosch@intra2net.com> cppcheck reported: [util/header.c:983]: (error) Used file that is not opened. Thanks to Arnaldo Carvalho de Melo for pointing out that fclose(NULL) is undefined behavior -> protect against it. Signed-off-by: Thomas Jarosch <thomas.jarosch@intra2net.com> Link: http://lkml.kernel.org/r/1751778.SZQB4fNdIh@storm Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/header.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 7b24cf3..f6081cb3 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -955,6 +955,7 @@ static int write_topo_node(int fd, int node) } fclose(fp); + fp = NULL; ret = do_write(fd, &mem_total, sizeof(u64)); if (ret) @@ -981,7 +982,8 @@ static int write_topo_node(int fd, int node) ret = do_write_string(fd, buf); done: free(buf); - fclose(fp); + if (fp) + fclose(fp); return ret; } -- 1.8.1.1.361.gec3ae6e ^ permalink raw reply related [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo ` (20 preceding siblings ...) 2013-01-30 14:47 ` [PATCH 21/21] perf header: Fix double fclose() on do_write(fd, xxx) failure Arnaldo Carvalho de Melo @ 2013-01-31 9:27 ` Ingo Molnar 21 siblings, 0 replies; 63+ messages in thread From: Ingo Molnar @ 2013-01-31 9:27 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: linux-kernel, Andi Kleen, Andrea Arcangeli, Andrew Morton, Anton Blanchard, Borislav Petkov, Corey Ashford, David Ahern, Frederic Weisbecker, Hugh Dickins, Jiri Olsa, linuxppc-dev, Mel Gorman, Michael Ellerman, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Hurley, Peter Zijlstra, Rik van Riel, Stephane Eranian, Steven Rostedt, Sukadev Bhattiprolu, Thomas Jarosch, arnaldo.melo, Arnaldo Carvalho de Melo * Arnaldo Carvalho de Melo <acme@infradead.org> wrote: > Hi Ingo, > > Please consider pulling. > > Namhyung, Jiri, the 'group report' patches are at acme/perf/group, > will send a pull req later if it survives further testing. > > - Arnaldo > > The following changes since commit a2d28d0c198b65fac28ea6212f5f8edc77b29c27: > > Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2013-01-25 11:34:00 +0100) > > are available in the git repository at: > > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo > > for you to fetch changes up to 5809fde040de2afa477a6c593ce2e8fd2c11d9d3: > > perf header: Fix double fclose() on do_write(fd, xxx) failure (2013-01-30 10:40:44 -0300) > > ---------------------------------------------------------------- > perf/core improvements and fixes: > > . Fix some leaks in exit paths. > > . Use memdup where applicable > > . Remove some die() calls, allowing callers to handle exit paths > gracefully. > > . Correct typo in tools Makefile, fix from Borislav Petkov. > > . Add 'perf bench numa mem' NUMA performance measurement suite, from Ingo Molnar. > > . Handle dynamic array's element size properly, fix from Jiri Olsa. > > . Fix memory leaks on evsel->counts, from Namhyung Kim. > > . Make numa benchmark optional, allowing the build in machines where required > numa libraries are not present, fix from Peter Hurley. > > . Add interval printing in 'perf stat', from Stephane Eranian. > > . Fix compile warnings in tests/attr.c, from Sukadev Bhattiprolu. > > . Fix double free, pclose instead of fclose, leaks and double fclose errors > found with the cppcheck tool, from Thomas Jarosch. > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > > ---------------------------------------------------------------- > Arnaldo Carvalho de Melo (8): > perf tools: Stop using 'self' in strlist > perf tools: Stop using 'self' in map.[ch] > perf tools: Use memdup in map__clone > perf kmem: Use memdup() > perf header: Stop using die() calls when processing tracing data > perf ui browser: Free browser->helpline() on ui_browser__hide() > perf tests: Call machine__exit in the vmlinux matches kallsyms test > perf tests: Fix leaks on PERF_RECORD_* test > > Borislav Petkov (1): > tools: Correct typo in tools Makefile > > Ingo Molnar (1): > perf: Add 'perf bench numa mem' NUMA performance measurement suite > > Jiri Olsa (1): > tools lib traceevent: Handle dynamic array's element size properly > > Namhyung Kim (1): > perf evsel: Fix memory leaks on evsel->counts > > Peter Hurley (1): > perf tools: Make numa benchmark optional > > Stephane Eranian (2): > perf evsel: Add prev_raw_count field > perf stat: Add interval printing > > Sukadev Bhattiprolu (1): > perf tools, powerpc: Fix compile warnings in tests/attr.c > > Thomas Jarosch (5): > perf tools: Fix possible double free on error > perf sort: Use pclose() instead of fclose() on pipe stream > perf tools: Fix memory leak on error > perf header: Fix memory leak for the "Not caching a kptr_restrict'ed /proc/kallsyms" case > perf header: Fix double fclose() on do_write(fd, xxx) failure > > tools/Makefile | 2 +- > tools/lib/traceevent/event-parse.c | 39 +- > tools/perf/Documentation/perf-stat.txt | 4 + > tools/perf/Makefile | 13 + > tools/perf/arch/common.c | 1 + > tools/perf/bench/bench.h | 1 + > tools/perf/bench/numa.c | 1731 ++++++++++++++++++++++++++++++ > tools/perf/builtin-bench.c | 17 + > tools/perf/builtin-kmem.c | 6 +- > tools/perf/builtin-stat.c | 158 ++- > tools/perf/config/feature-tests.mak | 11 + > tools/perf/tests/attr.c | 5 + > tools/perf/tests/open-syscall-all-cpus.c | 1 + > tools/perf/tests/perf-record.c | 12 +- > tools/perf/tests/vmlinux-kallsyms.c | 4 +- > tools/perf/ui/browser.c | 2 + > tools/perf/util/event.c | 4 +- > tools/perf/util/evsel.c | 31 + > tools/perf/util/evsel.h | 2 + > tools/perf/util/header.c | 25 +- > tools/perf/util/map.c | 118 +- > tools/perf/util/map.h | 24 +- > tools/perf/util/sort.c | 7 +- > tools/perf/util/strlist.c | 54 +- > tools/perf/util/strlist.h | 42 +- > 25 files changed, 2154 insertions(+), 160 deletions(-) > create mode 100644 tools/perf/bench/numa.c Pulled, thanks a lot Arnaldo! Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* [GIT PULL 00/21] perf/core improvements and fixes
@ 2018-08-20 16:15 Arnaldo Carvalho de Melo
2018-08-23 8:31 ` Ingo Molnar
0 siblings, 1 reply; 63+ messages in thread
From: Arnaldo Carvalho de Melo @ 2018-08-20 16:15 UTC (permalink / raw)
To: Ingo Molnar
Cc: Clark Williams, linux-kernel, linux-perf-users,
Arnaldo Carvalho de Melo, Adrian Hunter, Alexander Shishkin,
Alexei Starovoitov, Daniel Borkmann, David Ahern, Jack Henschel,
Jan Beulich, Jaroslav Škarvada, Jiri Olsa, Joe Mario,
linux-trace-devel, Martin KaFai Lau, Michael Petlan, Namhyung Kim,
Peter Feiner, Peter Zijlstra, Rasmus Villemoes, Sai Praneeth,
Steven Rostedt, Thomas Gleixner, Tzvetomir Stoyanov, Wang Nan,
Yonghong Song, Yordan Karadzhov, Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pullimg,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit 5804b11034a21e4287daaf017c5ad60ad7af8d67:
Merge tag 'perf-core-for-mingo-4.19-20180815' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent (2018-08-18 13:11:51 +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-4.19-20180820
for you to fetch changes up to 78303650e4cd873c6c4276c6fe3e768ff0b46d22:
tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy' (2018-08-20 10:17:14 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
LLVM/clang/eBPF: (Arnaldo Carvalho de Melo)
- Allow passing options to llc in addition to to clang.
Hardware tracing: (Jack Henschel)
- Improve error message for PMU address filters, clarifying availability of
that feature in hardware having hardware tracing such as Intel PT.
Python interface: (Jiri Olsa)
- Fix read_on_cpu() interface.
ELF/DWARF libraries: (Jiri Olsa)
- Fix handling of the combo compressed module file + decompressed associated
debuginfo file.
Build (Rasmus Villemoes)
- Disable parallelism for 'make clean', avoiding multiple submakes deleting
the same files and causing the build to fail on systems such as Yocto.
Kernel ABI copies: (Arnaldo Carvalho de Melo)
- Update tools's copy of x86's cpufeatures.h.
- Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy'.
Miscellaneous: (Steven Rostedt)
- Change libtraceevent to SPDX License format.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Arnaldo Carvalho de Melo (3):
perf llvm: Allow passing options to llc in addition to clang
tools arch x86: Update tools's copy of cpufeatures.h
tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy'
Jack Henschel (1):
perf parser: Improve error message for PMU address filters
Jiri Olsa (15):
perf tools: Get rid of dso__needs_decompress() call in read_object_code()
perf tools: Get rid of dso__needs_decompress() call in symbol__disassemble()
perf tools: Get rid of dso__needs_decompress() call in __open_dso()
perf tools: Make decompress_to_file() function static
perf tools: Make is_supported_compression() static
perf tools: Add compression id into 'struct kmod_path'
perf tools: Store compression id into struct dso
perf tools: Use compression id in decompress_kmodule()
perf tools: Move the temp file processing into decompress_kmodule
perf tools: Add is_compressed callback to compressions array
perf tools: Add lzma_is_compressed function
perf tools: Add gzip_is_compressed function
perf tools: Remove ext from struct kmod_path
perf mmap: Store real cpu number in 'struct perf_mmap'
perf python: Fix pyrf_evlist__read_on_cpu() interface
Rasmus Villemoes (1):
perf tools: Disable parallelism for 'make clean'
Steven Rostedt (VMware) (1):
tools lib traceevent: Change to SPDX License format
tools/arch/x86/include/asm/cpufeatures.h | 3 +-
tools/arch/x86/lib/memcpy_64.S | 2 +-
tools/lib/traceevent/event-parse.c | 16 +---
tools/lib/traceevent/event-plugin.c | 16 +---
tools/lib/traceevent/event-utils.h | 16 +---
tools/lib/traceevent/kbuffer-parse.c | 17 +---
tools/lib/traceevent/parse-filter.c | 16 +---
tools/lib/traceevent/parse-utils.c | 16 +---
tools/lib/traceevent/trace-seq.c | 16 +---
tools/perf/Makefile | 4 +-
tools/perf/tests/code-reading.c | 4 +-
tools/perf/tests/kmod-path.c | 136 +++++++++++++++----------------
tools/perf/util/annotate.c | 4 +-
tools/perf/util/compress.h | 2 +
tools/perf/util/dso.c | 111 ++++++++++++-------------
tools/perf/util/dso.h | 13 ++-
tools/perf/util/evlist.c | 2 +-
tools/perf/util/llvm-utils.c | 31 ++++++-
tools/perf/util/llvm-utils.h | 9 ++
tools/perf/util/lzma.c | 20 +++++
tools/perf/util/machine.c | 4 +-
tools/perf/util/mmap.c | 3 +-
tools/perf/util/mmap.h | 3 +-
tools/perf/util/parse-events.c | 20 ++---
tools/perf/util/python.c | 20 ++++-
tools/perf/util/zlib.c | 18 ++++
26 files changed, 256 insertions(+), 266 deletions(-)
Test results:
The first ones are container (docker) based builds of tools/perf with
and without libelf support. Where clang is available, it is also used
to build perf with/without libelf, and building with LIBCLANGLLVM=1
(built-in clang) with gcc and clang when clang and its devel libraries
are installed.
The objtool and samples/bpf/ builds are disabled now that I'm switching from
using the sources in a local volume to fetching them from a http server to
build it inside the container, to make it easier to build in a container cluster.
Those will come back later.
Several are cross builds, the ones with -x-ARCH and the android one, and those
may not have all the features built, due to lack of multi-arch devel packages,
available and being used so far on just a few, like
debian:experimental-x-{arm64,mipsel}.
The 'perf test' one will perform a variety of tests exercising
tools/perf/util/, tools/lib/{bpf,traceevent,etc}, as well as run perf commands
with a variety of command line event specifications to then intercept the
sys_perf_event syscall to check that the perf_event_attr fields are set up as
expected, among a variety of other unit tests.
Then there is the 'make -C tools/perf build-test' ones, that build tools/perf/
with a variety of feature sets, exercising the build with an incomplete set of
features as well as with a complete one. It is planned to have it run on each
of the containers mentioned above, using some container orchestration
infrastructure. Get in contact if interested in helping having this in place.
# dm
1 alpine:3.4 : Ok gcc (Alpine 5.3.0) 5.3.0
2 alpine:3.5 : Ok gcc (Alpine 6.2.1) 6.2.1 20160822
3 alpine:3.6 : Ok gcc (Alpine 6.3.0) 6.3.0
4 alpine:3.7 : Ok gcc (Alpine 6.4.0) 6.4.0
5 alpine:3.8 : Ok gcc (Alpine 6.4.0) 6.4.0
6 alpine:edge : Ok gcc (Alpine 6.4.0) 6.4.0
7 amazonlinux:1 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
8 amazonlinux:2 : Ok gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
9 android-ndk:r12b-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease)
10 android-ndk:r15c-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease)
11 centos:5 : Ok gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-55)
12 centos:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23)
13 centos:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
14 debian:7 : Ok gcc (Debian 4.7.2-5) 4.7.2
15 debian:8 : Ok gcc (Debian 4.9.2-10+deb8u1) 4.9.2
16 debian:9 : Ok gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
17 debian:experimental : Ok gcc (Debian 8.2.0-4) 8.2.0
18 debian:experimental-x-arm64 : Ok aarch64-linux-gnu-gcc (Debian 8.1.0-12) 8.1.0
19 debian:experimental-x-mips : Ok mips-linux-gnu-gcc (Debian 8.1.0-12) 8.1.0
20 debian:experimental-x-mips64 : Ok mips64-linux-gnuabi64-gcc (Debian 8.1.0-12) 8.1.0
21 debian:experimental-x-mipsel : Ok mipsel-linux-gnu-gcc (Debian 8.1.0-12) 8.1.0
22 fedora:20 : Ok gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)
23 fedora:21 : Ok gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)
24 fedora:22 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
25 fedora:23 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
26 fedora:24 : Ok gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
27 fedora:24-x-ARC-uClibc : Ok arc-linux-gcc (ARCompact ISA Linux uClibc toolchain 2017.09-rc2) 7.1.1 20170710
28 fedora:25 : Ok gcc (GCC) 6.4.1 20170727 (Red Hat 6.4.1-1)
29 fedora:26 : Ok gcc (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2)
30 fedora:27 : Ok gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-6)
31 fedora:28 : Ok gcc (GCC) 8.1.1 20180712 (Red Hat 8.1.1-5)
32 fedora:rawhide : Ok gcc (GCC) 8.0.1 20180324 (Red Hat 8.0.1-0.20)
33 gentoo-stage3-amd64:latest : Ok gcc (Gentoo 7.3.0-r3 p1.4) 7.3.0
34 mageia:5 : Ok gcc (GCC) 4.9.2
35 mageia:6 : Ok gcc (Mageia 5.5.0-1.mga6) 5.5.0
36 opensuse:13.2 : Ok gcc (SUSE Linux) 4.8.3 20140627 [gcc-4_8-branch revision 212064]
37 opensuse:42.1 : Ok gcc (SUSE Linux) 4.8.5
38 opensuse:42.2 : Ok gcc (SUSE Linux) 4.8.5
39 opensuse:42.3 : Ok gcc (SUSE Linux) 4.8.5
40 opensuse:tumbleweed : Ok gcc (SUSE Linux) 7.3.1 20180323 [gcc-7-branch revision 258812]
41 oraclelinux:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23.0.1)
42 oraclelinux:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28.0.1)
43 ubuntu:12.04.5 : Ok gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
44 ubuntu:14.04.4 : Ok gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
45 ubuntu:14.04.4-x-linaro-arm64 : Ok aarch64-linux-gnu-gcc (Linaro GCC 5.5-2017.10) 5.5.0
46 ubuntu:16.04 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
47 ubuntu:16.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
48 ubuntu:16.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
49 ubuntu:16.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
50 ubuntu:16.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
51 ubuntu:16.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
52 ubuntu:16.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
53 ubuntu:16.10 : Ok gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005
54 ubuntu:17.10 : Ok gcc (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0
55 ubuntu:18.04 : Ok gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
56 ubuntu:18.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 7.3.0-16ubuntu3) 7.3.0
57 ubuntu:18.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 7.3.0-16ubuntu3) 7.3.0
58 ubuntu:18.04-x-m68k : Ok m68k-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
59 ubuntu:18.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
60 ubuntu:18.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
61 ubuntu:18.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
62 ubuntu:18.04-x-riscv64 : Ok riscv64-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
63 ubuntu:18.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
64 ubuntu:18.04-x-sh4 : Ok sh4-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
65 ubuntu:18.04-x-sparc64 : Ok sparc64-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
66 ubuntu:18.10 : Ok gcc (Ubuntu 8.2.0-1ubuntu2) 8.2.0
#
# uname -a
Linux seventh 4.18.0-02978-g1eb46908b35d #1 SMP Wed Aug 15 16:55:17 -03 2018 x86_64 x86_64 x86_64 GNU/Linux
# git log --oneline -1
78303650e4cd (HEAD -> perf/core) tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy'
# perf version --build-options
perf version 4.18.g783036
dwarf: [ on ] # HAVE_DWARF_SUPPORT
dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT
glibc: [ on ] # HAVE_GLIBC_SUPPORT
gtk2: [ on ] # HAVE_GTK2_SUPPORT
syscall_table: [ on ] # HAVE_SYSCALL_TABLE_SUPPORT
libbfd: [ on ] # HAVE_LIBBFD_SUPPORT
libelf: [ on ] # HAVE_LIBELF_SUPPORT
libnuma: [ on ] # HAVE_LIBNUMA_SUPPORT
numa_num_possible_cpus: [ on ] # HAVE_LIBNUMA_SUPPORT
libperl: [ on ] # HAVE_LIBPERL_SUPPORT
libpython: [ on ] # HAVE_LIBPYTHON_SUPPORT
libslang: [ on ] # HAVE_SLANG_SUPPORT
libcrypto: [ on ] # HAVE_LIBCRYPTO_SUPPORT
libunwind: [ on ] # HAVE_LIBUNWIND_SUPPORT
libdw-dwarf-unwind: [ on ] # HAVE_DWARF_SUPPORT
zlib: [ on ] # HAVE_ZLIB_SUPPORT
lzma: [ on ] # HAVE_LZMA_SUPPORT
get_cpuid: [ on ] # HAVE_AUXTRACE_SUPPORT
bpf: [ on ] # HAVE_LIBBPF_SUPPORT
# perf test
1: vmlinux symtab matches kallsyms : Ok
2: Detect openat syscall event : Ok
3: Detect openat syscall event on all cpus : Ok
4: Read samples using the mmap interface : Ok
5: Test data source output : Ok
6: Parse event definition strings : Ok
7: Simple expression parser : Ok
8: PERF_RECORD_* events & perf_sample fields : Ok
9: Parse perf pmu format : Ok
10: DSO data read : Ok
11: DSO data cache : Ok
12: DSO data reopen : Ok
13: Roundtrip evsel->name : Ok
14: Parse sched tracepoints fields : Ok
15: syscalls:sys_enter_openat event fields : Ok
16: Setup struct perf_event_attr : Ok
17: Match and link multiple hists : Ok
18: 'import perf' in python : Ok
19: Breakpoint overflow signal handler : Ok
20: Breakpoint overflow sampling : Ok
21: Breakpoint accounting : Ok
22: Number of exit events of a simple workload : Ok
23: Software clock events period values : Ok
24: Object code reading : Ok
25: Sample parsing : Ok
26: Use a dummy software event to keep tracking : Ok
27: Parse with no sample_id_all bit set : Ok
28: Filter hist entries : Ok
29: Lookup mmap thread : Ok
30: Share thread mg : Ok
31: Sort output of hist entries : Ok
32: Cumulate child hist entries : Ok
33: Track with sched_switch : Ok
34: Filter fds with revents mask in a fdarray : Ok
35: Add fd to a fdarray, making it autogrow : Ok
36: kmod_path__parse : Ok
37: Thread map : Ok
38: LLVM search and compile :
38.1: Basic BPF llvm compile : Ok
38.2: kbuild searching : Ok
38.3: Compile source for BPF prologue generation : Ok
38.4: Compile source for BPF relocation : Ok
39: Session topology : Ok
40: BPF filter :
40.1: Basic BPF filtering : Ok
40.2: BPF pinning : Ok
40.3: BPF prologue generation : Ok
40.4: BPF relocation checker : Ok
41: Synthesize thread map : Ok
42: Remove thread map : Ok
43: Synthesize cpu map : Ok
44: Synthesize stat config : Ok
45: Synthesize stat : Ok
46: Synthesize stat round : Ok
47: Synthesize attr update : Ok
48: Event times : Ok
49: Read backward ring buffer : Ok
50: Print cpu map : Ok
51: Probe SDT events : Ok
52: is_printable_array : Ok
53: Print bitmap : Ok
54: perf hooks : Ok
55: builtin clang support : Skip (not compiled in)
56: unit_number__scnprintf : Ok
57: mem2node : Ok
58: x86 rdpmc : Ok
59: Convert perf time to TSC : Ok
60: DWARF unwind : Ok
61: x86 instruction decoder - new instructions : Ok
62: probe libc's inet_pton & backtrace it with ping : Ok
63: Check open filename arg using perf trace + vfs_getname: Ok
64: Use vfs_getname probe to get syscall args filenames : Ok
65: Add vfs_getname probe to get syscall args filenames : Ok
#
$ make -C tools/perf build-test
make: Entering directory '/home/acme/git/perf/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
make_no_libbionic_O: make NO_LIBBIONIC=1
make_no_libbpf_O: make NO_LIBBPF=1
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_no_demangle_O: make NO_DEMANGLE=1
make_no_slang_O: make NO_SLANG=1
make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
make_help_O: make help
make_no_libaudit_O: make NO_LIBAUDIT=1
make_debug_O: make DEBUG=1
make_static_O: make LDFLAGS=-static
make_install_prefix_O: make install prefix=/tmp/krava
make_tags_O: make tags
make_install_bin_O: make install-bin
make_no_gtk2_O: make NO_GTK2=1
make_no_auxtrace_O: make NO_AUXTRACE=1
make_clean_all_O: make clean all
make_no_libpython_O: make NO_LIBPYTHON=1
make_perf_o_O: make perf.o
make_install_O: make install
make_no_backtrace_O: make NO_BACKTRACE=1
make_doc_O: make doc
make_no_libnuma_O: make NO_LIBNUMA=1
make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1
make_util_pmu_bison_o_O: make util/pmu-bison.o
make_no_libunwind_O: make NO_LIBUNWIND=1
make_util_map_o_O: make util/map.o
make_pure_O: make
make_no_libperl_O: make NO_LIBPERL=1
make_no_libelf_O: make NO_LIBELF=1
make_with_clangllvm_O: make LIBCLANGLLVM=1
make_no_newt_O: make NO_NEWT=1
make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1
make_with_babeltrace_O: make LIBBABELTRACE=1
make_minimal_O: make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1
OK
make: Leaving directory '/home/acme/git/perf/tools/perf'
$
^ permalink raw reply [flat|nested] 63+ messages in thread* Re: [GIT PULL 00/21] perf/core improvements and fixes 2018-08-20 16:15 Arnaldo Carvalho de Melo @ 2018-08-23 8:31 ` Ingo Molnar 0 siblings, 0 replies; 63+ messages in thread From: Ingo Molnar @ 2018-08-23 8:31 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: Clark Williams, linux-kernel, linux-perf-users, Adrian Hunter, Alexander Shishkin, Alexei Starovoitov, Daniel Borkmann, David Ahern, Jack Henschel, Jan Beulich, Jaroslav Škarvada, Jiri Olsa, Joe Mario, linux-trace-devel, Martin KaFai Lau, Michael Petlan, Namhyung Kim, Peter Feiner, Peter Zijlstra, Rasmus Villemoes, Sai Praneeth, Steven Rostedt, Thomas Gleixner, Tzvetomir Stoyanov, Wang Nan, Yonghong Song, Yordan Karadzhov, Arnaldo Carvalho de Melo * Arnaldo Carvalho de Melo <acme@kernel.org> wrote: > Hi Ingo, > > Please consider pullimg, > > - Arnaldo > > > Test results at the end of this message, as usual. > > The following changes since commit 5804b11034a21e4287daaf017c5ad60ad7af8d67: > > Merge tag 'perf-core-for-mingo-4.19-20180815' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent (2018-08-18 13:11:51 +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-4.19-20180820 > > for you to fetch changes up to 78303650e4cd873c6c4276c6fe3e768ff0b46d22: > > tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy' (2018-08-20 10:17:14 -0300) > > ---------------------------------------------------------------- > perf/core improvements and fixes: > > LLVM/clang/eBPF: (Arnaldo Carvalho de Melo) > > - Allow passing options to llc in addition to to clang. > > Hardware tracing: (Jack Henschel) > > - Improve error message for PMU address filters, clarifying availability of > that feature in hardware having hardware tracing such as Intel PT. > > Python interface: (Jiri Olsa) > > - Fix read_on_cpu() interface. > > ELF/DWARF libraries: (Jiri Olsa) > > - Fix handling of the combo compressed module file + decompressed associated > debuginfo file. > > Build (Rasmus Villemoes) > > - Disable parallelism for 'make clean', avoiding multiple submakes deleting > the same files and causing the build to fail on systems such as Yocto. > > Kernel ABI copies: (Arnaldo Carvalho de Melo) > > - Update tools's copy of x86's cpufeatures.h. > > - Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy'. > > Miscellaneous: (Steven Rostedt) > > - Change libtraceevent to SPDX License format. > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > > ---------------------------------------------------------------- > Arnaldo Carvalho de Melo (3): > perf llvm: Allow passing options to llc in addition to clang > tools arch x86: Update tools's copy of cpufeatures.h > tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy' > > Jack Henschel (1): > perf parser: Improve error message for PMU address filters > > Jiri Olsa (15): > perf tools: Get rid of dso__needs_decompress() call in read_object_code() > perf tools: Get rid of dso__needs_decompress() call in symbol__disassemble() > perf tools: Get rid of dso__needs_decompress() call in __open_dso() > perf tools: Make decompress_to_file() function static > perf tools: Make is_supported_compression() static > perf tools: Add compression id into 'struct kmod_path' > perf tools: Store compression id into struct dso > perf tools: Use compression id in decompress_kmodule() > perf tools: Move the temp file processing into decompress_kmodule > perf tools: Add is_compressed callback to compressions array > perf tools: Add lzma_is_compressed function > perf tools: Add gzip_is_compressed function > perf tools: Remove ext from struct kmod_path > perf mmap: Store real cpu number in 'struct perf_mmap' > perf python: Fix pyrf_evlist__read_on_cpu() interface > > Rasmus Villemoes (1): > perf tools: Disable parallelism for 'make clean' > > Steven Rostedt (VMware) (1): > tools lib traceevent: Change to SPDX License format > > tools/arch/x86/include/asm/cpufeatures.h | 3 +- > tools/arch/x86/lib/memcpy_64.S | 2 +- > tools/lib/traceevent/event-parse.c | 16 +--- > tools/lib/traceevent/event-plugin.c | 16 +--- > tools/lib/traceevent/event-utils.h | 16 +--- > tools/lib/traceevent/kbuffer-parse.c | 17 +--- > tools/lib/traceevent/parse-filter.c | 16 +--- > tools/lib/traceevent/parse-utils.c | 16 +--- > tools/lib/traceevent/trace-seq.c | 16 +--- > tools/perf/Makefile | 4 +- > tools/perf/tests/code-reading.c | 4 +- > tools/perf/tests/kmod-path.c | 136 +++++++++++++++---------------- > tools/perf/util/annotate.c | 4 +- > tools/perf/util/compress.h | 2 + > tools/perf/util/dso.c | 111 ++++++++++++------------- > tools/perf/util/dso.h | 13 ++- > tools/perf/util/evlist.c | 2 +- > tools/perf/util/llvm-utils.c | 31 ++++++- > tools/perf/util/llvm-utils.h | 9 ++ > tools/perf/util/lzma.c | 20 +++++ > tools/perf/util/machine.c | 4 +- > tools/perf/util/mmap.c | 3 +- > tools/perf/util/mmap.h | 3 +- > tools/perf/util/parse-events.c | 20 ++--- > tools/perf/util/python.c | 20 ++++- > tools/perf/util/zlib.c | 18 ++++ > 26 files changed, 256 insertions(+), 266 deletions(-) Pulled, thanks a lot Arnaldo! Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* [GIT PULL 00/21] perf/core improvements and fixes
@ 2018-08-01 21:36 Arnaldo Carvalho de Melo
2018-08-02 8:03 ` Ingo Molnar
0 siblings, 1 reply; 63+ messages in thread
From: Arnaldo Carvalho de Melo @ 2018-08-01 21:36 UTC (permalink / raw)
To: Ingo Molnar
Cc: Clark Williams, linux-kernel, linux-perf-users,
Arnaldo Carvalho de Melo, Adrian Hunter, Alexander Shishkin,
Alexey Budankov, Andi Kleen, Christophe Leroy, David Ahern,
Don Zickus, Ganapatrao Kulkarni, Heiko Carstens,
Hendrik Brueckner, Jan Glauber, Jayachandran C, Jiri Olsa,
Joe Mario, Kan Liang, Kim Phillips, Leo Yan, linux-arm-kernel,
linuxppc-dev, Mark Rutland, Martin Schwidefsky, Mathieu Poirier,
Michael Petlan, Mike Leach, Namhyung Kim, Naveen N . Rao,
Peter Zijlstra, Ravi Bangoria, Robert Richter, Robert Walker,
rodia, Sandipan Das, Stefan Liebler, Sunil K Pandey,
Thomas Richter, Vadim Lomovtsev, Wang Nan, Will Deacon,
Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling, contains a recently merged
tip/perf/urgent,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit c2586cfbb905939b79b49a9121fb0a59a5668fd6:
Merge remote-tracking branch 'tip/perf/urgent' into perf/core (2018-07-31 09:55:45 -0300)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-4.19-20180801
for you to fetch changes up to b912885ab75c7c8aa841c615108afd755d0b97f8:
perf trace: Do not require --no-syscalls to suppress strace like output (2018-08-01 16:20:28 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
perf trace: (Arnaldo Carvalho de Melo)
- Do not require --no-syscalls to suppress strace like output, i.e.
# perf trace -e sched:*switch
will show just sched:sched_switch events, not strace-like formatted
syscall events, use --syscalls to get the previous behaviour.
If instead:
# perf trace
is used, i.e. no events specified, then --syscalls is implied and
system wide strace like formatting will be applied to all syscalls.
The behaviour when just a syscall subset is used with '-e' is unchanged:
# perf trace -e *sleep,sched:*switch
will work as before: just the 'nanosleep' syscall will be strace-like
formatted plus the sched:sched_switch tracepoint event, system wide.
- Allow string table generators to use a default header dir, allowing
use of them without parameters to see the table it generates on
stdout, e.g.:
$ tools/perf/trace/beauty/kvm_ioctl.sh
static const char *kvm_ioctl_cmds[] = {
[0x00] = "GET_API_VERSION",
[0x01] = "CREATE_VM",
[0x02] = "GET_MSR_INDEX_LIST",
[0x03] = "CHECK_EXTENSION",
<BIG SNIP>
[0xe0] = "CREATE_DEVICE",
[0xe1] = "SET_DEVICE_ATTR",
[0xe2] = "GET_DEVICE_ATTR",
[0xe3] = "HAS_DEVICE_ATTR",
};
$
See 'ls tools/perf/trace/beauty/*.sh' to see the available string
table generators.
- Add a generator for IPPROTO_ socket's protocol constants.
perf record: (Kan Liang)
- Fix error out while applying initial delay and using LBR, due to
the use of a PERF_TYPE_SOFTWARE/PERF_COUNT_SW_DUMMY event to track
PERF_RECORD_MMAP events while waiting for the initial delay. Such
events fail when configured asking PERF_SAMPLE_BRANCH_STACK in
perf_event_attr.sample_type.
perf c2c: (Jiri Olsa)
- Fix report crash for empty browser, when processing a perf.data file
without events of interest, either because not asked for in
'perf record' or because the workload didn't triggered such events.
perf list: (Michael Petlan)
- Align metric group description format with PMU event description.
perf tests: (Sandipan Das)
- Fix indexing when invoking subtests, which caused BPF tests to
get results for the next test in the list, with the last one
reporting a failure.
eBPF:
- Fix installation directory for header files included from eBPF proggies,
avoiding clashing with relative paths used to build other software projects
such as glibc. (Thomas Richter)
- Show better message when failing to load an object. (Arnaldo Carvalho de Melo)
General: (Christophe Leroy)
- Allow overriding MAX_NR_CPUS at compile time, to make the tooling
usable in systems with less memory, in time this has to be changed
to properly allocate based on _NPROCESSORS_ONLN.
Architecture specific:
- Update arm64's ThunderX2 implementation defined pmu core events (Ganapatrao Kulkarni)
- Fix complex event name parsing in 'perf test' for PowerPC, where the 'umask' event
modifier isn't present. (Sandipan Das)
CoreSight ARM hardware tracing: (Leo Yan)
- Fix start tracing packet handling.
- Support dummy address value for CS_ETM_TRACE_ON packet.
- Generate branch sample when receiving a CS_ETM_TRACE_ON packet.
- Generate branch sample for CS_ETM_TRACE_ON packet.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Arnaldo Carvalho de Melo (9):
perf trace beauty: Default header_dir to cwd to work without parms
tools include uapi: Grab a copy of linux/in.h
perf beauty: Add a generator for IPPROTO_ socket's protocol constants
perf trace beauty: Do not print NULL strarray entries
perf trace beauty: Add beautifiers for 'socket''s 'protocol' arg
perf trace: Beautify the AF_INET & AF_INET6 'socket' syscall 'protocol' args
perf bpf: Show better message when failing to load an object
perf bpf: Include uapi/linux/bpf.h from the 'perf trace' script's bpf.h
perf trace: Do not require --no-syscalls to suppress strace like output
Christophe Leroy (1):
perf tools: Allow overriding MAX_NR_CPUS at compile time
Ganapatrao Kulkarni (1):
perf vendor events arm64: Update ThunderX2 implementation defined pmu core events
Jiri Olsa (1):
perf c2c report: Fix crash for empty browser
Kan Liang (1):
perf evlist: Fix error out while applying initial delay and LBR
Leo Yan (4):
perf cs-etm: Fix start tracing packet handling
perf cs-etm: Support dummy address value for CS_ETM_TRACE_ON packet
perf cs-etm: Generate branch sample when receiving a CS_ETM_TRACE_ON packet
perf cs-etm: Generate branch sample for CS_ETM_TRACE_ON packet
Michael Petlan (1):
perf list: Unify metric group description format with PMU event description
Sandipan Das (2):
perf tests: Fix complex event name parsing
perf tests: Fix indexing when invoking subtests
Thomas Richter (1):
perf build: Fix installation directory for eBPF
tools/include/uapi/linux/in.h | 301 +++++++++++++++++++++
tools/perf/Makefile.config | 4 +-
tools/perf/Makefile.perf | 10 +
tools/perf/builtin-c2c.c | 3 +
tools/perf/builtin-trace.c | 19 +-
tools/perf/check-headers.sh | 1 +
tools/perf/include/bpf/bpf.h | 3 +
tools/perf/perf.h | 2 +
.../arch/arm64/cavium/thunderx2/core-imp-def.json | 87 +++++-
tools/perf/tests/builtin-test.c | 4 +-
tools/perf/tests/parse-events.c | 2 +-
tools/perf/trace/beauty/Build | 1 +
tools/perf/trace/beauty/beauty.h | 3 +
tools/perf/trace/beauty/drm_ioctl.sh | 9 +-
tools/perf/trace/beauty/kcmp_type.sh | 2 +-
tools/perf/trace/beauty/kvm_ioctl.sh | 4 +-
tools/perf/trace/beauty/madvise_behavior.sh | 2 +-
tools/perf/trace/beauty/perf_ioctl.sh | 2 +-
.../perf/trace/beauty/pkey_alloc_access_rights.sh | 2 +-
tools/perf/trace/beauty/sndrv_ctl_ioctl.sh | 4 +-
tools/perf/trace/beauty/sndrv_pcm_ioctl.sh | 4 +-
tools/perf/trace/beauty/socket.c | 28 ++
tools/perf/trace/beauty/socket_ipproto.sh | 11 +
tools/perf/trace/beauty/vhost_virtio_ioctl.sh | 6 +-
tools/perf/util/bpf-loader.c | 4 +-
tools/perf/util/cs-etm-decoder/cs-etm-decoder.h | 1 +
tools/perf/util/cs-etm.c | 68 ++++-
tools/perf/util/evsel.c | 14 +
tools/perf/util/metricgroup.c | 4 +-
29 files changed, 556 insertions(+), 49 deletions(-)
create mode 100644 tools/include/uapi/linux/in.h
create mode 100644 tools/perf/trace/beauty/socket.c
create mode 100755 tools/perf/trace/beauty/socket_ipproto.sh
Test results:
The first ones are container (docker) based builds of tools/perf with
and without libelf support. Where clang is available, it is also used
to build perf with/without libelf, and building with LIBCLANGLLVM=1
(built-in clang) with gcc and clang when clang and its devel libraries
are installed.
The objtool and samples/bpf/ builds are disabled now that I'm switching from
using the sources in a local volume to fetching them from a http server to
build it inside the container, to make it easier to build in a container cluster.
Those will come back later.
Several are cross builds, the ones with -x-ARCH and the android one, and those
may not have all the features built, due to lack of multi-arch devel packages,
available and being used so far on just a few, like
debian:experimental-x-{arm64,mipsel}.
The 'perf test' one will perform a variety of tests exercising
tools/perf/util/, tools/lib/{bpf,traceevent,etc}, as well as run perf commands
with a variety of command line event specifications to then intercept the
sys_perf_event syscall to check that the perf_event_attr fields are set up as
expected, among a variety of other unit tests.
Then there is the 'make -C tools/perf build-test' ones, that build tools/perf/
with a variety of feature sets, exercising the build with an incomplete set of
features as well as with a complete one. It is planned to have it run on each
of the containers mentioned above, using some container orchestration
infrastructure. Get in contact if interested in helping having this in place.
# dm
1 alpine:3.4 : Ok gcc (Alpine 5.3.0) 5.3.0
2 alpine:3.5 : Ok gcc (Alpine 6.2.1) 6.2.1 20160822
3 alpine:3.6 : Ok gcc (Alpine 6.3.0) 6.3.0
4 alpine:3.7 : Ok gcc (Alpine 6.4.0) 6.4.0
5 alpine:edge : Ok gcc (Alpine 6.4.0) 6.4.0
6 amazonlinux:1 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
7 amazonlinux:2 : Ok gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
8 android-ndk:r12b-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease)
9 android-ndk:r15c-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease)
10 centos:5 : Ok gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-55)
11 centos:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18)
12 centos:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
13 debian:7 : Ok gcc (Debian 4.7.2-5) 4.7.2
14 debian:8 : Ok gcc (Debian 4.9.2-10+deb8u1) 4.9.2
15 debian:9 : Ok gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
16 debian:experimental : Ok gcc (Debian 8.2.0-1) 8.2.0
17 debian:experimental-x-arm64 : Ok aarch64-linux-gnu-gcc (Debian 8.1.0-12) 8.1.0
18 debian:experimental-x-mips : Ok mips-linux-gnu-gcc (Debian 8.1.0-12) 8.1.0
19 debian:experimental-x-mips64 : Ok mips64-linux-gnuabi64-gcc (Debian 7.3.0-18) 7.3.0
20 debian:experimental-x-mipsel : Ok mipsel-linux-gnu-gcc (Debian 8.1.0-12) 8.1.0
21 fedora:20 : Ok gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)
22 fedora:21 : Ok gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)
23 fedora:22 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
24 fedora:23 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
25 fedora:24 : Ok gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
26 fedora:24-x-ARC-uClibc : Ok arc-linux-gcc (ARCompact ISA Linux uClibc toolchain 2017.09-rc2) 7.1.1 20170710
27 fedora:25 : Ok gcc (GCC) 6.4.1 20170727 (Red Hat 6.4.1-1)
28 fedora:26 : Ok gcc (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2)
29 fedora:27 : Ok gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
30 fedora:28 : Ok gcc (GCC) 8.1.1 20180502 (Red Hat 8.1.1-1)
31 fedora:rawhide : Ok gcc (GCC) 8.0.1 20180324 (Red Hat 8.0.1-0.20)
32 gentoo-stage3-amd64:latest : Ok gcc (Gentoo 7.3.0-r3 p1.4) 7.3.0
33 mageia:5 : Ok gcc (GCC) 4.9.2
34 mageia:6 : Ok gcc (Mageia 5.5.0-1.mga6) 5.5.0
35 opensuse:42.1 : Ok gcc (SUSE Linux) 4.8.5
36 opensuse:42.2 : Ok gcc (SUSE Linux) 4.8.5
37 opensuse:42.3 : Ok gcc (SUSE Linux) 4.8.5
38 opensuse:tumbleweed : Ok gcc (SUSE Linux) 7.3.1 20180323 [gcc-7-branch revision 258812]
39 oraclelinux:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23.0.1)
40 oraclelinux:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28.0.1)
41 ubuntu:12.04.5 : Ok gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
42 ubuntu:14.04.4 : Ok gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
43 ubuntu:14.04.4-x-linaro-arm64 : Ok aarch64-linux-gnu-gcc (Linaro GCC 5.5-2017.10) 5.5.0
44 ubuntu:16.04 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
45 ubuntu:16.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
46 ubuntu:16.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
47 ubuntu:16.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
48 ubuntu:16.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
49 ubuntu:16.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
50 ubuntu:16.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
51 ubuntu:16.10 : Ok gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005
52 ubuntu:17.04 : Ok gcc (Ubuntu 6.3.0-12ubuntu2) 6.3.0 20170406
53 ubuntu:17.10 : Ok gcc (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0
54 ubuntu:18.04 : Ok gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
55 ubuntu:18.10 : Ok gcc (Ubuntu 8.2.0-1ubuntu2) 8.2.0
#
# uname -a
# Linux seventh 4.17.9-100.fc27.x86_64 #1 SMP Mon Jul 23 22:35:38 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
# git log --oneline -1
b912885ab75c (HEAD -> perf/core) perf trace: Do not require --no-syscalls to suppress strace like output
# perf version --build-options
perf version 4.18.rc7.g822c262
dwarf: [ on ] # HAVE_DWARF_SUPPORT
dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT
glibc: [ on ] # HAVE_GLIBC_SUPPORT
gtk2: [ on ] # HAVE_GTK2_SUPPORT
syscall_table: [ on ] # HAVE_SYSCALL_TABLE_SUPPORT
libbfd: [ on ] # HAVE_LIBBFD_SUPPORT
libelf: [ on ] # HAVE_LIBELF_SUPPORT
libnuma: [ on ] # HAVE_LIBNUMA_SUPPORT
numa_num_possible_cpus: [ on ] # HAVE_LIBNUMA_SUPPORT
libperl: [ on ] # HAVE_LIBPERL_SUPPORT
libpython: [ on ] # HAVE_LIBPYTHON_SUPPORT
libslang: [ on ] # HAVE_SLANG_SUPPORT
libcrypto: [ on ] # HAVE_LIBCRYPTO_SUPPORT
libunwind: [ on ] # HAVE_LIBUNWIND_SUPPORT
libdw-dwarf-unwind: [ on ] # HAVE_DWARF_SUPPORT
zlib: [ on ] # HAVE_ZLIB_SUPPORT
lzma: [ on ] # HAVE_LZMA_SUPPORT
get_cpuid: [ on ] # HAVE_AUXTRACE_SUPPORT
bpf: [ on ] # HAVE_LIBBPF_SUPPORT
# perf test
1: vmlinux symtab matches kallsyms : Ok
2: Detect openat syscall event : Ok
3: Detect openat syscall event on all cpus : Ok
4: Read samples using the mmap interface : Ok
5: Test data source output : Ok
6: Parse event definition strings : Ok
7: Simple expression parser : Ok
8: PERF_RECORD_* events & perf_sample fields : Ok
9: Parse perf pmu format : Ok
10: DSO data read : Ok
11: DSO data cache : Ok
12: DSO data reopen : Ok
13: Roundtrip evsel->name : Ok
14: Parse sched tracepoints fields : Ok
15: syscalls:sys_enter_openat event fields : Ok
16: Setup struct perf_event_attr : Ok
17: Match and link multiple hists : Ok
18: 'import perf' in python : Ok
19: Breakpoint overflow signal handler : Ok
20: Breakpoint overflow sampling : Ok
21: Breakpoint accounting : Ok
22: Number of exit events of a simple workload : Ok
23: Software clock events period values : Ok
24: Object code reading : Ok
25: Sample parsing : Ok
26: Use a dummy software event to keep tracking : Ok
27: Parse with no sample_id_all bit set : Ok
28: Filter hist entries : Ok
29: Lookup mmap thread : Ok
30: Share thread mg : Ok
31: Sort output of hist entries : Ok
32: Cumulate child hist entries : Ok
33: Track with sched_switch : Ok
34: Filter fds with revents mask in a fdarray : Ok
35: Add fd to a fdarray, making it autogrow : Ok
36: kmod_path__parse : Ok
37: Thread map : Ok
38: LLVM search and compile :
38.1: Basic BPF llvm compile : Ok
38.2: kbuild searching : Ok
38.3: Compile source for BPF prologue generation : Ok
38.4: Compile source for BPF relocation : Ok
39: Session topology : Ok
40: BPF filter :
40.1: Basic BPF filtering : Ok
40.2: BPF pinning : Ok
40.3: BPF prologue generation : Ok
40.4: BPF relocation checker : Ok
41: Synthesize thread map : Ok
42: Remove thread map : Ok
43: Synthesize cpu map : Ok
44: Synthesize stat config : Ok
45: Synthesize stat : Ok
46: Synthesize stat round : Ok
47: Synthesize attr update : Ok
48: Event times : Ok
49: Read backward ring buffer : Ok
50: Print cpu map : Ok
51: Probe SDT events : Ok
52: is_printable_array : Ok
53: Print bitmap : Ok
54: perf hooks : Ok
55: builtin clang support : Skip (not compiled in)
56: unit_number__scnprintf : Ok
57: mem2node : Ok
58: x86 rdpmc : Ok
59: Convert perf time to TSC : Ok
60: DWARF unwind : Ok
61: x86 instruction decoder - new instructions : Ok
62: probe libc's inet_pton & backtrace it with ping : Ok
63: Check open filename arg using perf trace + vfs_getname: Ok
64: Use vfs_getname probe to get syscall args filenames : Ok
65: Add vfs_getname probe to get syscall args filenames : Ok
#
$ make -C tools/perf build-test
make: Entering directory '/home/acme/git/perf/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
make_no_libunwind_O: make NO_LIBUNWIND=1
make_no_newt_O: make NO_NEWT=1
make_install_bin_O: make install-bin
make_install_prefix_O: make install prefix=/tmp/krava
make_doc_O: make doc
make_perf_o_O: make perf.o
make_util_map_o_O: make util/map.o
make_no_libbionic_O: make NO_LIBBIONIC=1
make_no_demangle_O: make NO_DEMANGLE=1
make_no_libpython_O: make NO_LIBPYTHON=1
make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1
make_help_O: make help
make_no_slang_O: make NO_SLANG=1
make_no_libperl_O: make NO_LIBPERL=1
make_with_babeltrace_O: make LIBBABELTRACE=1
make_static_O: make LDFLAGS=-static
make_pure_O: make
make_tags_O: make tags
make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
make_no_libelf_O: make NO_LIBELF=1
make_minimal_O: make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1
make_install_O: make install
make_with_clangllvm_O: make LIBCLANGLLVM=1
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_no_libaudit_O: make NO_LIBAUDIT=1
make_no_gtk2_O: make NO_GTK2=1
make_no_libnuma_O: make NO_LIBNUMA=1
make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1
make_no_auxtrace_O: make NO_AUXTRACE=1
make_no_libbpf_O: make NO_LIBBPF=1
make_clean_all_O: make clean all
make_no_backtrace_O: make NO_BACKTRACE=1
make_util_pmu_bison_o_O: make util/pmu-bison.o
make_debug_O: make DEBUG=1
make_cscope_O: make cscope
OK
make: Leaving directory '/home/acme/git/perf/tools/perf'
$
^ permalink raw reply [flat|nested] 63+ messages in thread* Re: [GIT PULL 00/21] perf/core improvements and fixes 2018-08-01 21:36 Arnaldo Carvalho de Melo @ 2018-08-02 8:03 ` Ingo Molnar 0 siblings, 0 replies; 63+ messages in thread From: Ingo Molnar @ 2018-08-02 8:03 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: Clark Williams, linux-kernel, linux-perf-users, Adrian Hunter, Alexander Shishkin, Alexey Budankov, Andi Kleen, Christophe Leroy, David Ahern, Don Zickus, Ganapatrao Kulkarni, Heiko Carstens, Hendrik Brueckner, Jan Glauber, Jayachandran C, Jiri Olsa, Joe Mario, Kan Liang, Kim Phillips, Leo Yan, linux-arm-kernel, linuxppc-dev, Mark Rutland, Martin Schwidefsky, Mathieu Poirier, Michael Petlan, Mike Leach, Namhyung Kim, Naveen N . Rao, Peter Zijlstra, Ravi Bangoria, Robert Richter, Robert Walker, rodia, Sandipan Das, Stefan Liebler, Sunil K Pandey, Thomas Richter, Vadim Lomovtsev, Wang Nan, Will Deacon, Arnaldo Carvalho de Melo * Arnaldo Carvalho de Melo <acme@kernel.org> wrote: > Hi Ingo, > > Please consider pulling, contains a recently merged > tip/perf/urgent, > > - Arnaldo > > Test results at the end of this message, as usual. > > The following changes since commit c2586cfbb905939b79b49a9121fb0a59a5668fd6: > > Merge remote-tracking branch 'tip/perf/urgent' into perf/core (2018-07-31 09:55:45 -0300) > > are available in the Git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-4.19-20180801 > > for you to fetch changes up to b912885ab75c7c8aa841c615108afd755d0b97f8: > > perf trace: Do not require --no-syscalls to suppress strace like output (2018-08-01 16:20:28 -0300) > > ---------------------------------------------------------------- > perf/core improvements and fixes: > > perf trace: (Arnaldo Carvalho de Melo) > > - Do not require --no-syscalls to suppress strace like output, i.e. > > # perf trace -e sched:*switch > > will show just sched:sched_switch events, not strace-like formatted > syscall events, use --syscalls to get the previous behaviour. > > If instead: > > # perf trace > > is used, i.e. no events specified, then --syscalls is implied and > system wide strace like formatting will be applied to all syscalls. > > The behaviour when just a syscall subset is used with '-e' is unchanged: > > # perf trace -e *sleep,sched:*switch > > will work as before: just the 'nanosleep' syscall will be strace-like > formatted plus the sched:sched_switch tracepoint event, system wide. > > - Allow string table generators to use a default header dir, allowing > use of them without parameters to see the table it generates on > stdout, e.g.: > > $ tools/perf/trace/beauty/kvm_ioctl.sh > static const char *kvm_ioctl_cmds[] = { > [0x00] = "GET_API_VERSION", > [0x01] = "CREATE_VM", > [0x02] = "GET_MSR_INDEX_LIST", > [0x03] = "CHECK_EXTENSION", > <BIG SNIP> > [0xe0] = "CREATE_DEVICE", > [0xe1] = "SET_DEVICE_ATTR", > [0xe2] = "GET_DEVICE_ATTR", > [0xe3] = "HAS_DEVICE_ATTR", > }; > $ > > See 'ls tools/perf/trace/beauty/*.sh' to see the available string > table generators. > > - Add a generator for IPPROTO_ socket's protocol constants. > > perf record: (Kan Liang) > > - Fix error out while applying initial delay and using LBR, due to > the use of a PERF_TYPE_SOFTWARE/PERF_COUNT_SW_DUMMY event to track > PERF_RECORD_MMAP events while waiting for the initial delay. Such > events fail when configured asking PERF_SAMPLE_BRANCH_STACK in > perf_event_attr.sample_type. > > perf c2c: (Jiri Olsa) > > - Fix report crash for empty browser, when processing a perf.data file > without events of interest, either because not asked for in > 'perf record' or because the workload didn't triggered such events. > > perf list: (Michael Petlan) > > - Align metric group description format with PMU event description. > > perf tests: (Sandipan Das) > > - Fix indexing when invoking subtests, which caused BPF tests to > get results for the next test in the list, with the last one > reporting a failure. > > eBPF: > > - Fix installation directory for header files included from eBPF proggies, > avoiding clashing with relative paths used to build other software projects > such as glibc. (Thomas Richter) > > - Show better message when failing to load an object. (Arnaldo Carvalho de Melo) > > General: (Christophe Leroy) > > - Allow overriding MAX_NR_CPUS at compile time, to make the tooling > usable in systems with less memory, in time this has to be changed > to properly allocate based on _NPROCESSORS_ONLN. > > Architecture specific: > > - Update arm64's ThunderX2 implementation defined pmu core events (Ganapatrao Kulkarni) > > - Fix complex event name parsing in 'perf test' for PowerPC, where the 'umask' event > modifier isn't present. (Sandipan Das) > > CoreSight ARM hardware tracing: (Leo Yan) > > - Fix start tracing packet handling. > > - Support dummy address value for CS_ETM_TRACE_ON packet. > > - Generate branch sample when receiving a CS_ETM_TRACE_ON packet. > > - Generate branch sample for CS_ETM_TRACE_ON packet. > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > > ---------------------------------------------------------------- > Arnaldo Carvalho de Melo (9): > perf trace beauty: Default header_dir to cwd to work without parms > tools include uapi: Grab a copy of linux/in.h > perf beauty: Add a generator for IPPROTO_ socket's protocol constants > perf trace beauty: Do not print NULL strarray entries > perf trace beauty: Add beautifiers for 'socket''s 'protocol' arg > perf trace: Beautify the AF_INET & AF_INET6 'socket' syscall 'protocol' args > perf bpf: Show better message when failing to load an object > perf bpf: Include uapi/linux/bpf.h from the 'perf trace' script's bpf.h > perf trace: Do not require --no-syscalls to suppress strace like output > > Christophe Leroy (1): > perf tools: Allow overriding MAX_NR_CPUS at compile time > > Ganapatrao Kulkarni (1): > perf vendor events arm64: Update ThunderX2 implementation defined pmu core events > > Jiri Olsa (1): > perf c2c report: Fix crash for empty browser > > Kan Liang (1): > perf evlist: Fix error out while applying initial delay and LBR > > Leo Yan (4): > perf cs-etm: Fix start tracing packet handling > perf cs-etm: Support dummy address value for CS_ETM_TRACE_ON packet > perf cs-etm: Generate branch sample when receiving a CS_ETM_TRACE_ON packet > perf cs-etm: Generate branch sample for CS_ETM_TRACE_ON packet > > Michael Petlan (1): > perf list: Unify metric group description format with PMU event description > > Sandipan Das (2): > perf tests: Fix complex event name parsing > perf tests: Fix indexing when invoking subtests > > Thomas Richter (1): > perf build: Fix installation directory for eBPF > > tools/include/uapi/linux/in.h | 301 +++++++++++++++++++++ > tools/perf/Makefile.config | 4 +- > tools/perf/Makefile.perf | 10 + > tools/perf/builtin-c2c.c | 3 + > tools/perf/builtin-trace.c | 19 +- > tools/perf/check-headers.sh | 1 + > tools/perf/include/bpf/bpf.h | 3 + > tools/perf/perf.h | 2 + > .../arch/arm64/cavium/thunderx2/core-imp-def.json | 87 +++++- > tools/perf/tests/builtin-test.c | 4 +- > tools/perf/tests/parse-events.c | 2 +- > tools/perf/trace/beauty/Build | 1 + > tools/perf/trace/beauty/beauty.h | 3 + > tools/perf/trace/beauty/drm_ioctl.sh | 9 +- > tools/perf/trace/beauty/kcmp_type.sh | 2 +- > tools/perf/trace/beauty/kvm_ioctl.sh | 4 +- > tools/perf/trace/beauty/madvise_behavior.sh | 2 +- > tools/perf/trace/beauty/perf_ioctl.sh | 2 +- > .../perf/trace/beauty/pkey_alloc_access_rights.sh | 2 +- > tools/perf/trace/beauty/sndrv_ctl_ioctl.sh | 4 +- > tools/perf/trace/beauty/sndrv_pcm_ioctl.sh | 4 +- > tools/perf/trace/beauty/socket.c | 28 ++ > tools/perf/trace/beauty/socket_ipproto.sh | 11 + > tools/perf/trace/beauty/vhost_virtio_ioctl.sh | 6 +- > tools/perf/util/bpf-loader.c | 4 +- > tools/perf/util/cs-etm-decoder/cs-etm-decoder.h | 1 + > tools/perf/util/cs-etm.c | 68 ++++- > tools/perf/util/evsel.c | 14 + > tools/perf/util/metricgroup.c | 4 +- > 29 files changed, 556 insertions(+), 49 deletions(-) > create mode 100644 tools/include/uapi/linux/in.h > create mode 100644 tools/perf/trace/beauty/socket.c > create mode 100755 tools/perf/trace/beauty/socket_ipproto.sh Pulled, thanks a lot Arnaldo! Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* [GIT PULL 00/21] perf/core improvements and fixes
@ 2018-02-06 16:53 Arnaldo Carvalho de Melo
0 siblings, 0 replies; 63+ messages in thread
From: Arnaldo Carvalho de Melo @ 2018-02-06 16:53 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, linux-perf-users, Arnaldo Carvalho de Melo,
Alexander Shishkin, Andi Kleen, Andriy Shevchenko, Heiko Carstens,
Hendrik Brueckner, Jin Yao, Jiri Olsa, Kan Liang,
Martin Schwidefsky, Namhyung Kim, Peter Zijlstra, Sangwon Hong,
Taeung Song, Thomas Richter, Wang Nan, William Cohen,
Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit 33ea4b24277b06dbc55d7f5772a46f029600255e:
perf/core: Implement the 'perf_uprobe' PMU (2018-02-06 11:29:28 +0100)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-4.17-20180206
for you to fetch changes up to 52a37001d51a320c1019269fb3ba473a1363650d:
perf test: Fix test trace+probe_libc_inet_pton.sh for s390x (2018-02-06 10:46:58 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
- perf_mmap overwrite mode overhaul, prep work to get 'perf top'
using it, making it bearable to use it in large core count systems
such as Knights Landing/Mill Intel systems (Kan Liang)
- Add perf vendor JSON metrics for ARM Cortex-A53 Processor (William Cohen)
- Use strtoull() instead of home grown function (Andy Shevchenko)
- Document missing 'perf data --force' option (Sangwon Hong)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Andy Shevchenko (1):
perf tools: Substitute yet another strtoull()
Arnaldo Carvalho de Melo (1):
perf evsel: Expose the perf_missing_features struct
Kan Liang (16):
perf evlist: Remove stale mmap read for backward
perf mmap: Recalculate size for overwrite mode
perf mmap: Cleanup perf_mmap__push()
perf mmap: Introduce perf_mmap__read_init()
perf mmap: Add new return value logic for perf_mmap__read_init()
perf mmap: Discard 'prev' in perf_mmap__read()
perf mmap: Introduce perf_mmap__read_done()
perf mmap: Introduce perf_mmap__read_event()
perf test: Update mmap read functions for backward-ring-buffer test
perf mmap: Discard legacy interface for mmap read
perf top: Check per-event overwrite term
perf top: Add overwrite fall back
perf hists browser: Add parameter to disable lost event warning
perf top: Remove lost events checking
perf top: Switch default mode to overwrite mode
perf top: Check the latency of perf_top__mmap_read()
Sangwon Hong (1):
perf data: Document missing --force option
Thomas Richter (1):
perf test: Fix test trace+probe_libc_inet_pton.sh for s390x
William Cohen (1):
perf vendor events aarch64: Add JSON metrics for ARM Cortex-A53 Processor
tools/perf/Documentation/perf-data.txt | 4 +
tools/perf/builtin-c2c.c | 4 +-
tools/perf/builtin-report.c | 3 +-
tools/perf/builtin-top.c | 150 ++++++++++++++++++++-
.../pmu-events/arch/arm64/cortex-a53/branch.json | 27 ++++
.../perf/pmu-events/arch/arm64/cortex-a53/bus.json | 22 +++
.../pmu-events/arch/arm64/cortex-a53/cache.json | 27 ++++
.../pmu-events/arch/arm64/cortex-a53/memory.json | 22 +++
.../pmu-events/arch/arm64/cortex-a53/other.json | 32 +++++
.../pmu-events/arch/arm64/cortex-a53/pipeline.json | 52 +++++++
tools/perf/pmu-events/arch/arm64/mapfile.csv | 1 +
tools/perf/tests/backward-ring-buffer.c | 7 +-
.../perf/tests/shell/trace+probe_libc_inet_pton.sh | 23 +++-
tools/perf/ui/browsers/hists.c | 38 ++++--
tools/perf/ui/browsers/hists.h | 3 +-
tools/perf/util/evlist.c | 17 ---
tools/perf/util/evlist.h | 4 -
tools/perf/util/evsel.c | 12 +-
tools/perf/util/evsel.h | 14 ++
tools/perf/util/hist.h | 6 +-
tools/perf/util/mmap.c | 141 ++++++++++---------
tools/perf/util/mmap.h | 10 +-
tools/perf/util/util.c | 24 +---
23 files changed, 492 insertions(+), 151 deletions(-)
create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/branch.json
create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/bus.json
create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/cache.json
create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/memory.json
create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/other.json
create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/pipeline.json
Test results:
The first ones are container (docker) based builds of tools/perf with and
without libelf support. Where clang is available, it is also used to build
perf with/without libelf.
The objtool and samples/bpf/ builds are disabled now that I'm switching from
using the sources in a local volume to fetching them from a http server to
build it inside the container, to make it easier to build in a container cluster.
Those will come back later.
Several are cross builds, the ones with -x-ARCH and the android one, and those
may not have all the features built, due to lack of multi-arch devel packages,
available and being used so far on just a few, like
debian:experimental-x-{arm64,mipsel}.
The 'perf test' one will perform a variety of tests exercising
tools/perf/util/, tools/lib/{bpf,traceevent,etc}, as well as run perf commands
with a variety of command line event specifications to then intercept the
sys_perf_event syscall to check that the perf_event_attr fields are set up as
expected, among a variety of other unit tests.
Then there is the 'make -C tools/perf build-test' ones, that build tools/perf/
with a variety of feature sets, exercising the build with an incomplete set of
features as well as with a complete one. It is planned to have it run on each
of the containers mentioned above, using some container orchestration
infrastructure. Get in contact if interested in helping having this in place.
# dm
1 alpine:3.4 : Ok gcc (Alpine 5.3.0) 5.3.0
2 alpine:3.5 : Ok gcc (Alpine 6.2.1) 6.2.1 20160822
3 alpine:3.6 : Ok gcc (Alpine 6.3.0) 6.3.0
4 alpine:edge : Ok gcc (Alpine 6.4.0) 6.4.0
5 amazonlinux:1 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)
6 amazonlinux:2 : Ok gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2)
7 android-ndk:r12b-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease)
8 android-ndk:r15c-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease)
9 centos:5 : Ok gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-55)
10 centos:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18)
11 centos:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
12 debian:7 : Ok gcc (Debian 4.7.2-5) 4.7.2
13 debian:8 : Ok gcc (Debian 4.9.2-10) 4.9.2
14 debian:9 : Ok gcc (Debian 6.3.0-18) 6.3.0 20170516
15 debian:experimental : Ok gcc (Debian 7.2.0-17) 7.2.1 20171205
16 debian:experimental-x-arm64 : Ok aarch64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
17 debian:experimental-x-mips : Ok mips-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
18 debian:experimental-x-mips64 : Ok mips64-linux-gnuabi64-gcc (Debian 7.2.0-11) 7.2.0
19 debian:experimental-x-mipsel : Ok mipsel-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
20 fedora:20 : Ok gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)
21 fedora:21 : Ok gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)
22 fedora:22 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
23 fedora:23 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
24 fedora:24 : Ok gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
25 fedora:24-x-ARC-uClibc : Ok arc-linux-gcc (ARCompact ISA Linux uClibc toolchain 2017.09-rc2) 7.1.1 20170710
26 fedora:25 : Ok gcc (GCC) 6.4.1 20170727 (Red Hat 6.4.1-1)
27 fedora:26 : Ok gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2)
28 fedora:27 : Ok gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2)
29 fedora:rawhide : Ok gcc (GCC) 7.2.1 20170829 (Red Hat 7.2.1-1)
30 gentoo-stage3-amd64:latest : Ok gcc (Gentoo 6.4.0-r1 p1.3) 6.4.0
31 mageia:5 : Ok gcc (GCC) 4.9.2
32 mageia:6 : Ok gcc (Mageia 5.4.0-5.mga6) 5.4.0
33 opensuse:42.1 : Ok gcc (SUSE Linux) 4.8.5
34 opensuse:42.2 : Ok gcc (SUSE Linux) 4.8.5
35 opensuse:42.3 : Ok gcc (SUSE Linux) 4.8.5
36 opensuse:tumbleweed : Ok gcc (SUSE Linux) 7.3.0
37 oraclelinux:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18)
38 oraclelinux:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
39 ubuntu:12.04.5 : Ok gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
40 ubuntu:14.04.4 : Ok gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
41 ubuntu:14.04.4-x-linaro-arm64 : Ok aarch64-linux-gnu-gcc (Linaro GCC 5.4-2017.05) 5.4.1 20170404
42 ubuntu:15.04 : Ok gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
43 ubuntu:16.04 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
44 ubuntu:16.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
45 ubuntu:16.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
46 ubuntu:16.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
47 ubuntu:16.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609
48 ubuntu:16.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
49 ubuntu:16.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
50 ubuntu:16.10 : Ok gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005
51 ubuntu:17.04 : Ok gcc (Ubuntu 6.3.0-12ubuntu2) 6.3.0 20170406
52 ubuntu:17.10 : Ok gcc (Ubuntu 7.2.0-8ubuntu3) 7.2.0
53 ubuntu:18.04 : Ok gcc (Ubuntu 7.2.0-16ubuntu1) 7.2.0
# uname -a
Linux jouet 4.15.0-rc9+ #7 SMP Mon Jan 22 18:16:36 -03 2018 x86_64 x86_64 x86_64 GNU/Linux
# perf test
1: vmlinux symtab matches kallsyms : Ok
2: Detect openat syscall event : Ok
3: Detect openat syscall event on all cpus : Ok
4: Read samples using the mmap interface : Ok
5: Test data source output : Ok
6: Parse event definition strings : Ok
7: Simple expression parser : Ok
8: PERF_RECORD_* events & perf_sample fields : Ok
9: Parse perf pmu format : Ok
10: DSO data read : Ok
11: DSO data cache : Ok
12: DSO data reopen : Ok
13: Roundtrip evsel->name : Ok
14: Parse sched tracepoints fields : Ok
15: syscalls:sys_enter_openat event fields : Ok
16: Setup struct perf_event_attr : Ok
17: Match and link multiple hists : Ok
18: 'import perf' in python : Ok
19: Breakpoint overflow signal handler : Ok
20: Breakpoint overflow sampling : Ok
21: Number of exit events of a simple workload : Ok
22: Software clock events period values : Ok
23: Object code reading : Ok
24: Sample parsing : Ok
25: Use a dummy software event to keep tracking : Ok
26: Parse with no sample_id_all bit set : Ok
27: Filter hist entries : Ok
28: Lookup mmap thread : Ok
29: Share thread mg : Ok
30: Sort output of hist entries : Ok
31: Cumulate child hist entries : Ok
32: Track with sched_switch : Ok
33: Filter fds with revents mask in a fdarray : Ok
34: Add fd to a fdarray, making it autogrow : Ok
35: kmod_path__parse : Ok
36: Thread map : Ok
37: LLVM search and compile :
37.1: Basic BPF llvm compile : Ok
37.2: kbuild searching : Ok
37.3: Compile source for BPF prologue generation : Ok
37.4: Compile source for BPF relocation : Ok
38: Session topology : Ok
39: BPF filter :
39.1: Basic BPF filtering : Ok
39.2: BPF pinning : Ok
39.3: BPF prologue generation : Ok
39.4: BPF relocation checker : Ok
40: Synthesize thread map : Ok
41: Remove thread map : Ok
42: Synthesize cpu map : Ok
43: Synthesize stat config : Ok
44: Synthesize stat : Ok
45: Synthesize stat round : Ok
46: Synthesize attr update : Ok
47: Event times : Ok
48: Read backward ring buffer : Ok
49: Print cpu map : Ok
50: Probe SDT events : Ok
51: is_printable_array : Ok
52: Print bitmap : Ok
53: perf hooks : Ok
54: builtin clang support : Skip (not compiled in)
55: unit_number__scnprintf : Ok
56: x86 rdpmc : Ok
57: Convert perf time to TSC : Ok
58: DWARF unwind : Ok
59: x86 instruction decoder - new instructions : Ok
60: Use vfs_getname probe to get syscall args filenames : Ok
61: probe libc's inet_pton & backtrace it with ping : Ok
62: Check open filename arg using perf trace + vfs_getname: Ok
63: Add vfs_getname probe to get syscall args filenames : Ok
#
$ make -C tools/perf build-test
make: Entering directory '/home/acme/git/perf/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
make_perf_o_O: make perf.o
make_no_auxtrace_O: make NO_AUXTRACE=1
make_no_newt_O: make NO_NEWT=1
make_no_libbpf_O: make NO_LIBBPF=1
make_with_clangllvm_O: make LIBCLANGLLVM=1
make_install_O: make install
make_no_slang_O: make NO_SLANG=1
make_util_pmu_bison_o_O: make util/pmu-bison.o
make_no_libunwind_O: make NO_LIBUNWIND=1
make_util_map_o_O: make util/map.o
make_debug_O: make DEBUG=1
make_static_O: make LDFLAGS=-static
make_with_babeltrace_O: make LIBBABELTRACE=1
make_install_bin_O: make install-bin
make_no_demangle_O: make NO_DEMANGLE=1
make_doc_O: make doc
make_install_prefix_O: make install prefix=/tmp/krava
make_help_O: make help
make_no_libaudit_O: make NO_LIBAUDIT=1
make_no_libbionic_O: make NO_LIBBIONIC=1
make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
make_no_libperl_O: make NO_LIBPERL=1
make_clean_all_O: make clean all
make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_no_libpython_O: make NO_LIBPYTHON=1
make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1
make_no_libnuma_O: make NO_LIBNUMA=1
make_tags_O: make tags
make_pure_O: make
make_no_gtk2_O: make NO_GTK2=1
make_no_libelf_O: make NO_LIBELF=1
make_no_backtrace_O: make NO_BACKTRACE=1
make_minimal_O: make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1
OK
make: Leaving directory '/home/acme/git/perf/tools/perf'
$
^ permalink raw reply [flat|nested] 63+ messages in thread* [GIT PULL 00/21] perf/core improvements and fixes
@ 2015-05-04 21:36 Arnaldo Carvalho de Melo
0 siblings, 0 replies; 63+ messages in thread
From: Arnaldo Carvalho de Melo @ 2015-05-04 21:36 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Adrian Hunter,
Ananth N Mavinakayanahalli, David Ahern, Frederic Weisbecker,
Jiri Olsa, Joonsoo Kim, linux-mm, linuxppc-dev, Masami Hiramatsu,
Michael Ellerman, Minchan Kim, Namhyung Kim, Naveen N . Rao,
Pekka Enberg, Peter Zijlstra, Srikar Dronamraju, Stephane Eranian,
Sukadev Bhattiprolu, Taeung Song, Arnaldo Carvalho de Melo
Hi Ingo,
Besides these 21 patches there are 65 other patches, all present in the
perf-core-for-mingo tag, that I sent a pull request for but had some issues
building on older distros (got reports and fixes for OL6, CentOS6, tested it
all on RHEL6), minor stuff, all noted on the comments just before my
Signed-off-by lines.
Please consider pulling,
- Arnaldo
The following changes since commit b64aa553d8430aabd24f303899cfa4de678e2c3a:
perf bench numa: Show more stats of particular threads in verbose mode (2015-05-04 12:43:41 -0300)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-2
for you to fetch changes up to 0c160d495b5616e071bb4f873812e8f473128149:
perf kmem: Add kmem.default config option (2015-05-04 13:34:48 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
User visible:
- perf kmem improvements: (Namhyung Kim)
- Support sort keys on page analysis
- New --live option
- Humand readable gfp flags
- Allow setting the default in perfconfig files
- perf probe --filter improvements (Masami Hiramatsu)
- Improve detection of file/function name in the 'perf probe' pattern (Naveen Rao)
Infrastructure:
- Some more Intel PT prep patches (Adrian Hunter)
- Fix ppc64 ABIv2 symbol decoding (Ananth N Mavinakayanahalli)
Build fixes:
- bison-related build failure on CentOS 6 (Namhyung Kim)
- perf probe fixes for better support powerpc (Naveen Rao)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Adrian Hunter (3):
perf evlist: Amend mmap ref counting for the AUX area mmap
perf script: Always allow fields 'addr' and 'cpu' for auxtrace
perf report: Add Instruction Tracing support
Ananth N Mavinakayanahalli (1):
perf probe ppc64le: Fix ppc64 ABIv2 symbol decoding
Masami Hiramatsu (4):
perf tools: Improve strfilter to append additional rules
perf tools: Add strfilter__string to recover rules string
perf probe: Accept multiple filter options
perf probe: Accept filter argument for --list
Namhyung Kim (6):
perf tools: Fix bison-related build failure on CentOS 6
perf kmem: Implement stat --page --caller
perf kmem: Support sort keys on page analysis
perf kmem: Add --live option for current allocation stat
perf kmem: Print gfp flags in human readable string
perf kmem: Add kmem.default config option
Naveen N. Rao (7):
perf probe ppc: Fix symbol fixup issues due to ELF type
perf probe ppc: Use the right prefix when ignoring SyS symbols on ppc
perf probe ppc: Enable matching against dot symbols automatically
perf probe ppc64le: Prefer symbol table lookup over DWARF
perf probe ppc64le: Fixup function entry if using kallsyms lookup
perf symbols: Warn on build id mismatch
perf probe: Improve detection of file/function name in the probe pattern
tools/perf/Documentation/perf-kmem.txt | 11 +-
tools/perf/Documentation/perf-probe.txt | 6 +-
tools/perf/Documentation/perf-report.txt | 27 +
tools/perf/arch/powerpc/util/Build | 1 +
tools/perf/arch/powerpc/util/sym-handling.c | 82 +++
tools/perf/builtin-kmem.c | 964 +++++++++++++++++++++++++---
tools/perf/builtin-probe.c | 64 +-
tools/perf/builtin-report.c | 11 +
tools/perf/builtin-script.c | 29 +-
tools/perf/util/Build | 2 +-
tools/perf/util/evlist.c | 2 +-
tools/perf/util/map.c | 5 +
tools/perf/util/map.h | 3 +-
tools/perf/util/probe-event.c | 69 +-
tools/perf/util/probe-event.h | 5 +-
tools/perf/util/strfilter.c | 107 +++
tools/perf/util/strfilter.h | 35 +
tools/perf/util/symbol-elf.c | 13 +-
tools/perf/util/symbol.c | 25 +-
tools/perf/util/symbol.h | 10 +
20 files changed, 1313 insertions(+), 158 deletions(-)
create mode 100644 tools/perf/arch/powerpc/util/sym-handling.c
^ permalink raw reply [flat|nested] 63+ messages in thread* [GIT PULL 00/21] perf/core improvements and fixes
@ 2015-02-11 21:08 Arnaldo Carvalho de Melo
2015-03-05 4:30 ` Victor Kamensky
0 siblings, 1 reply; 63+ messages in thread
From: Arnaldo Carvalho de Melo @ 2015-02-11 21:08 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Adrian Hunter,
Andrew Morton, Anton Blanchard, Avi Kivity, Borislav Petkov,
Dave Martin, David Ahern, Don Zickus, Frederic Weisbecker,
Hemant Kumar, Jiri Olsa, Josh Boyer, linux-arm-kernel,
Masami Hiramatsu, Mike Galbraith, Namhyung Kim, Paul Mackerras,
Peter Zijlstra, Peter Zijlstra, Russell King, Stephane Eranian,
Steven Rostedt, Victor Kamensky, Vineet Gupta, Vinson Lee,
Waiman Long, Will Deacon, Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit 2fde4f94e0a9531251e706fa57131b51b0df042e:
perf: Decouple unthrottling and rotating (2015-02-04 08:07:16 +0100)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo
for you to fetch changes up to 39f5704399042fff5f0d5f6af32bbbc3e787a897:
perf tools: Define _GNU_SOURCE on pthread_attr_setaffinity_np feature check (2015-02-11 17:38:55 -0300)
----------------------------------------------------------------
perf/core improvement and fixes:
User visible:
- No need to explicitely enable evsels for workload started from perf, let it
be enabled via perf_event_attr.enable_on_exec, removing some events that take
place in the 'perf trace' before a workload is really started by it.
(Arnaldo Carvalho de Melo)
- Fix to handle optimized not-inlined functions in 'perf probe' (Masami Hiramatsu)
- Update 'perf probe' man page (Masami Hiramatsu)
Infrastructure:
Arnaldo Carvalho de Melo (4):
- Introduce {trace_seq_do,event_format_}_fprintf functions to allow
a default tracepoint field list printer to be used in tools that allows
redirecting output to a file. (Arnaldo Carvalho de Melo)
- The man page for pthread_attr_set_affinity_np states that _GNU_SOURCE
must be defined before pthread.h, do it to fix the build in some
systems (Josh Boyer)
- Cleanups in 'perf buildid-cache' (Masami Hiramatsu)
- Fix dso cache test case (Namhyung Kim)
- Do Not rely on dso__data_read_offset() to open DSO (Namhyung Kim)
- Make perf aware of tracefs (Steven Rostedt).
- Fix build by defining STT_GNU_IFUNC for glibc 2.9 and older (Vinson Lee)
- AArch64 symbol resolution fixes (Victor Kamensky)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Arnaldo Carvalho de Melo (4):
tools lib traceevent: Introduce trace_seq_do_fprintf function
perf tools: Introduce event_format__fprintf method
perf trace: No need to enable evsels for workload started from perf
perf evlist: Fix typo in comment
Josh Boyer (1):
perf tools: Define _GNU_SOURCE on pthread_attr_setaffinity_np feature check
Masami Hiramatsu (4):
perf probe: Fix to handle optimized not-inlined functions
perf probe: Update man page
perf buildid-cache: Remove unneeded debugdir parameters
perf buildid-cache: Consolidate .build-id cache path generators
Namhyung Kim (3):
perf test: Fix dso cache testcase
perf tests: Do not rely on dso__data_read_offset() to open dso
perf tools: Fix a dso open fail message
Steven Rostedt (Red Hat) (6):
perf tools: Do not check debugfs MAGIC for tracing files
tools lib fs: Add helper to find mounted file systems
tools lib api fs: Add tracefs mount helper functions
tools lib api debugfs: Add DEBUGFS_DEFAULT_PATH macro
tools lib api fs: Add {tracefs,debugfs}_configured() functions
perf tools: Make perf aware of tracefs
Victor Kamensky (2):
perf symbols: Ignore mapping symbols on aarch64
perf symbols: debuglink should take symfs option into account
Vinson Lee (1):
perf symbols: Define STT_GNU_IFUNC for glibc 2.9 and older.
tools/lib/api/Makefile | 4 ++
tools/lib/api/fs/debugfs.c | 69 +++++++---------------
tools/lib/api/fs/debugfs.h | 13 +----
tools/lib/api/fs/findfs.c | 63 ++++++++++++++++++++
tools/lib/api/fs/findfs.h | 23 ++++++++
tools/lib/api/fs/tracefs.c | 78 +++++++++++++++++++++++++
tools/lib/api/fs/tracefs.h | 21 +++++++
tools/lib/traceevent/event-parse.h | 2 +
tools/lib/traceevent/trace-seq.c | 13 +++--
tools/perf/Documentation/perf-probe.txt | 16 +++++-
tools/perf/builtin-buildid-cache.c | 37 ++++++------
tools/perf/builtin-trace.c | 4 +-
tools/perf/config/feature-checks/Makefile | 2 +-
tools/perf/tests/dso-data.c | 22 ++++---
tools/perf/tests/open-syscall-all-cpus.c | 7 ++-
tools/perf/tests/open-syscall.c | 7 ++-
tools/perf/tests/parse-events.c | 13 ++++-
tools/perf/util/build-id.c | 96 +++++++++++++++++++------------
tools/perf/util/build-id.h | 4 +-
tools/perf/util/cache.h | 1 +
tools/perf/util/dso.c | 8 +--
tools/perf/util/dwarf-aux.c | 15 +++++
tools/perf/util/dwarf-aux.h | 3 +
tools/perf/util/evlist.c | 3 +-
tools/perf/util/parse-events.c | 19 ------
tools/perf/util/parse-events.h | 2 +-
tools/perf/util/probe-event.c | 24 +++++---
tools/perf/util/probe-finder.c | 12 ++--
tools/perf/util/symbol-elf.c | 11 ++--
tools/perf/util/trace-event-parse.c | 12 +++-
tools/perf/util/trace-event.h | 3 +
tools/perf/util/util.c | 60 +++++++++++++++----
tools/perf/util/util.h | 1 +
33 files changed, 468 insertions(+), 200 deletions(-)
create mode 100644 tools/lib/api/fs/findfs.c
create mode 100644 tools/lib/api/fs/findfs.h
create mode 100644 tools/lib/api/fs/tracefs.c
create mode 100644 tools/lib/api/fs/tracefs.h
^ permalink raw reply [flat|nested] 63+ messages in thread* Re: [GIT PULL 00/21] perf/core improvements and fixes 2015-02-11 21:08 Arnaldo Carvalho de Melo @ 2015-03-05 4:30 ` Victor Kamensky 2015-03-05 6:37 ` Ingo Molnar 0 siblings, 1 reply; 63+ messages in thread From: Victor Kamensky @ 2015-03-05 4:30 UTC (permalink / raw) To: Arnaldo Carvalho de Melo, Ingo Molnar, David Ahern Cc: open list, Adrian Hunter, Andrew Morton, Anton Blanchard, Avi Kivity, Borislav Petkov, Dave Martin, Don Zickus, Frederic Weisbecker, Hemant Kumar, Jiri Olsa, Josh Boyer, linux-arm-kernel@lists.infradead.org, Masami Hiramatsu, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Peter Zijlstra, Russell King, Stephane Eranian, Steven Rostedt, Vineet Gupta, Vinson Lee, Waiman Long, Will Deacon, Arnaldo Carvalho de Melo Hi Arnaldo, Ingo, What happened with this pull request? I already see in v4.0-rc2 changes additions to one requested by this pull request, but I don't see this series itself. For example e370a3d57664cd5e39c0b95d157ebc841b568409 "perf symbols: Define EM_AARCH64 for older OSes" by David is already in v4.0-rc2 and it is supposed to be addition to "perf symbols: Ignore mapping symbols on aarch64" that is part of this pull request but it did not make into v4.0-rcX yet. Looks quite strange. Thanks, Victor On 11 February 2015 at 13:08, Arnaldo Carvalho de Melo <acme@kernel.org> wrote: > Hi Ingo, > > Please consider pulling, > > - Arnaldo > > The following changes since commit 2fde4f94e0a9531251e706fa57131b51b0df042e: > > perf: Decouple unthrottling and rotating (2015-02-04 08:07:16 +0100) > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo > > for you to fetch changes up to 39f5704399042fff5f0d5f6af32bbbc3e787a897: > > perf tools: Define _GNU_SOURCE on pthread_attr_setaffinity_np feature check (2015-02-11 17:38:55 -0300) > > ---------------------------------------------------------------- > perf/core improvement and fixes: > > User visible: > > - No need to explicitely enable evsels for workload started from perf, let it > be enabled via perf_event_attr.enable_on_exec, removing some events that take > place in the 'perf trace' before a workload is really started by it. > (Arnaldo Carvalho de Melo) > > - Fix to handle optimized not-inlined functions in 'perf probe' (Masami Hiramatsu) > > - Update 'perf probe' man page (Masami Hiramatsu) > > Infrastructure: > > Arnaldo Carvalho de Melo (4): > - Introduce {trace_seq_do,event_format_}_fprintf functions to allow > a default tracepoint field list printer to be used in tools that allows > redirecting output to a file. (Arnaldo Carvalho de Melo) > > - The man page for pthread_attr_set_affinity_np states that _GNU_SOURCE > must be defined before pthread.h, do it to fix the build in some > systems (Josh Boyer) > > - Cleanups in 'perf buildid-cache' (Masami Hiramatsu) > > - Fix dso cache test case (Namhyung Kim) > > - Do Not rely on dso__data_read_offset() to open DSO (Namhyung Kim) > > - Make perf aware of tracefs (Steven Rostedt). > > - Fix build by defining STT_GNU_IFUNC for glibc 2.9 and older (Vinson Lee) > > - AArch64 symbol resolution fixes (Victor Kamensky) > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > > ---------------------------------------------------------------- > Arnaldo Carvalho de Melo (4): > tools lib traceevent: Introduce trace_seq_do_fprintf function > perf tools: Introduce event_format__fprintf method > perf trace: No need to enable evsels for workload started from perf > perf evlist: Fix typo in comment > > Josh Boyer (1): > perf tools: Define _GNU_SOURCE on pthread_attr_setaffinity_np feature check > > Masami Hiramatsu (4): > perf probe: Fix to handle optimized not-inlined functions > perf probe: Update man page > perf buildid-cache: Remove unneeded debugdir parameters > perf buildid-cache: Consolidate .build-id cache path generators > > Namhyung Kim (3): > perf test: Fix dso cache testcase > perf tests: Do not rely on dso__data_read_offset() to open dso > perf tools: Fix a dso open fail message > > Steven Rostedt (Red Hat) (6): > perf tools: Do not check debugfs MAGIC for tracing files > tools lib fs: Add helper to find mounted file systems > tools lib api fs: Add tracefs mount helper functions > tools lib api debugfs: Add DEBUGFS_DEFAULT_PATH macro > tools lib api fs: Add {tracefs,debugfs}_configured() functions > perf tools: Make perf aware of tracefs > > Victor Kamensky (2): > perf symbols: Ignore mapping symbols on aarch64 > perf symbols: debuglink should take symfs option into account > > Vinson Lee (1): > perf symbols: Define STT_GNU_IFUNC for glibc 2.9 and older. > > tools/lib/api/Makefile | 4 ++ > tools/lib/api/fs/debugfs.c | 69 +++++++--------------- > tools/lib/api/fs/debugfs.h | 13 +---- > tools/lib/api/fs/findfs.c | 63 ++++++++++++++++++++ > tools/lib/api/fs/findfs.h | 23 ++++++++ > tools/lib/api/fs/tracefs.c | 78 +++++++++++++++++++++++++ > tools/lib/api/fs/tracefs.h | 21 +++++++ > tools/lib/traceevent/event-parse.h | 2 + > tools/lib/traceevent/trace-seq.c | 13 +++-- > tools/perf/Documentation/perf-probe.txt | 16 +++++- > tools/perf/builtin-buildid-cache.c | 37 ++++++------ > tools/perf/builtin-trace.c | 4 +- > tools/perf/config/feature-checks/Makefile | 2 +- > tools/perf/tests/dso-data.c | 22 ++++--- > tools/perf/tests/open-syscall-all-cpus.c | 7 ++- > tools/perf/tests/open-syscall.c | 7 ++- > tools/perf/tests/parse-events.c | 13 ++++- > tools/perf/util/build-id.c | 96 +++++++++++++++++++------------ > tools/perf/util/build-id.h | 4 +- > tools/perf/util/cache.h | 1 + > tools/perf/util/dso.c | 8 +-- > tools/perf/util/dwarf-aux.c | 15 +++++ > tools/perf/util/dwarf-aux.h | 3 + > tools/perf/util/evlist.c | 3 +- > tools/perf/util/parse-events.c | 19 ------ > tools/perf/util/parse-events.h | 2 +- > tools/perf/util/probe-event.c | 24 +++++--- > tools/perf/util/probe-finder.c | 12 ++-- > tools/perf/util/symbol-elf.c | 11 ++-- > tools/perf/util/trace-event-parse.c | 12 +++- > tools/perf/util/trace-event.h | 3 + > tools/perf/util/util.c | 60 +++++++++++++++---- > tools/perf/util/util.h | 1 + > 33 files changed, 468 insertions(+), 200 deletions(-) > create mode 100644 tools/lib/api/fs/findfs.c > create mode 100644 tools/lib/api/fs/findfs.h > create mode 100644 tools/lib/api/fs/tracefs.c > create mode 100644 tools/lib/api/fs/tracefs.h ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2015-03-05 4:30 ` Victor Kamensky @ 2015-03-05 6:37 ` Ingo Molnar 2015-03-05 6:49 ` Victor Kamensky 0 siblings, 1 reply; 63+ messages in thread From: Ingo Molnar @ 2015-03-05 6:37 UTC (permalink / raw) To: Victor Kamensky Cc: Arnaldo Carvalho de Melo, David Ahern, open list, Adrian Hunter, Andrew Morton, Anton Blanchard, Avi Kivity, Borislav Petkov, Dave Martin, Don Zickus, Frederic Weisbecker, Hemant Kumar, Jiri Olsa, Josh Boyer, linux-arm-kernel@lists.infradead.org, Masami Hiramatsu, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Peter Zijlstra, Russell King, Stephane Eranian, Steven Rostedt, Vineet Gupta, Vinson Lee, Waiman Long, Will Deacon, Arnaldo Carvalho de Melo * Victor Kamensky <victor.kamensky@linaro.org> wrote: > Hi Arnaldo, Ingo, > > What happened with this pull request? [...] This pull request was for v4.1, and I merged it in: commit 8a26ce4e544659256349551283414df504889a59 Merge: acba3c7e4652 726f3234dd12 Author: Ingo Molnar <mingo@kernel.org> Date: Wed Feb 18 19:14:54 2015 +0100 Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo: User visible changes: > [...] I already see in v4.0-rc2 changes additions to one requested > by this pull request, but I don't see this series itself. > > For example e370a3d57664cd5e39c0b95d157ebc841b568409 > "perf symbols: Define EM_AARCH64 for older OSes" by David > is already in v4.0-rc2 and it is supposed to be addition to > "perf symbols: Ignore mapping symbols on aarch64" that is part > of this pull request but it did not make into v4.0-rcX yet. Looks > quite strange. If some commits of the v4.1 queue are needed in v4.0 as well then they should be cherry-picked back into the urgent queue. But maybe e370a3d57 was merged prematurely - in that case it appears to be harmless and v4.1 will sort it out. Arnaldo? Thanks, Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2015-03-05 6:37 ` Ingo Molnar @ 2015-03-05 6:49 ` Victor Kamensky 0 siblings, 0 replies; 63+ messages in thread From: Victor Kamensky @ 2015-03-05 6:49 UTC (permalink / raw) To: Ingo Molnar Cc: Arnaldo Carvalho de Melo, David Ahern, open list, Adrian Hunter, Andrew Morton, Anton Blanchard, Avi Kivity, Borislav Petkov, Dave Martin, Don Zickus, Frederic Weisbecker, Hemant Kumar, Jiri Olsa, Josh Boyer, linux-arm-kernel@lists.infradead.org, Masami Hiramatsu, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Peter Zijlstra, Russell King, Stephane Eranian, Steven Rostedt, Vineet Gupta, Vinson Lee, Waiman Long, Will Deacon, Arnaldo Carvalho de Melo On 4 March 2015 at 22:37, Ingo Molnar <mingo@kernel.org> wrote: > > * Victor Kamensky <victor.kamensky@linaro.org> wrote: > >> Hi Arnaldo, Ingo, >> >> What happened with this pull request? [...] > > This pull request was for v4.1, and I merged it in: Ok, I got it. Sorry I missed that before. > commit 8a26ce4e544659256349551283414df504889a59 > Merge: acba3c7e4652 726f3234dd12 > Author: Ingo Molnar <mingo@kernel.org> > Date: Wed Feb 18 19:14:54 2015 +0100 > > Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core > > Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo: > > User visible changes: > >> [...] I already see in v4.0-rc2 changes additions to one requested >> by this pull request, but I don't see this series itself. >> >> For example e370a3d57664cd5e39c0b95d157ebc841b568409 >> "perf symbols: Define EM_AARCH64 for older OSes" by David >> is already in v4.0-rc2 and it is supposed to be addition to >> "perf symbols: Ignore mapping symbols on aarch64" that is part >> of this pull request but it did not make into v4.0-rcX yet. Looks >> quite strange. > > If some commits of the v4.1 queue are needed in v4.0 as well then they > should be cherry-picked back into the urgent queue. > > But maybe e370a3d57 was merged prematurely - in that case it appears > to be harmless and v4.1 will sort it out. Yes, this merge is harmless. Indeed it should be OK with v4.1. Thanks for explanation. - Victor > Arnaldo? > > Thanks, > > Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* [GIT PULL 00/21] perf/core improvements and fixes
@ 2013-12-09 19:36 Arnaldo Carvalho de Melo
2013-12-10 11:07 ` Ingo Molnar
2013-12-10 11:12 ` Ingo Molnar
0 siblings, 2 replies; 63+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-12-09 19:36 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Adrian Hunter, Andi Kleen,
Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker,
Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras,
Peter Zijlstra, Stephane Eranian, Steven Rostedt,
Arnaldo Carvalho de Melo
From: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Hi Ingo,
Please consider pulling,
Best Regards,
-Arnaldo
The following changes since commit 6d65894bc028d0342829ea1e64c9e9efad571124:
tools lib traceevent: Update kvm plugin with is_writable_pte helper (2013-12-04 15:38:14 -0300)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo
for you to fetch changes up to e993d10caeb6dca690dbaf86e1981ba240d1414a:
perf symbols: fix bug in usage of the basename() function (2013-12-09 15:41:59 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
. Add an option in 'perf script' to print the source line number, from Adrian Hunter
. Fix symoff printing in callchains in 'perf script', from Adrian Hunter.
. Assorted mmap_pages handling fixes, from Adrian Hunter.
. Fix summary percentage when processing files in 'perf trace', fom David Ahern.
. Handle old kernels where the "raw_syscalls" tracepoints were called plan "syscalls",
in 'perf trace', from David Ahern.
. Several man pages typo fixes from Dongsheng Yang.
. Add '-v' option to 'perf kvm', from Dongsheng Yang.
. Make perf kvm diff support --guestmount, from Dongsheng Yang.
. Get rid of several die() calls in libtraceevent, from Namhyung Kim.
. Use basename() in a more robust way, to avoid problems related to different
system library implementations for that function, from Stephane Eranian.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Adrian Hunter (6):
perf script: Fix symoff printing in callchains
perf script: Add an option to print the source line number
perf record: Fix display of incorrect mmap pages
perf evlist: Remove unnecessary parentheses
perf evlist: Fix max mmap_pages
perf evlist: Fix mmap pages rounding to power of 2
David Ahern (2):
perf trace: Add support for syscalls vs raw_syscalls
perf trace: Fix summary percentage when processing files
Dongsheng Yang (6):
perf kvm: Introduce option -v for perf kvm command.
perf kvm: Fix bug in 'stat report'
perf archive: Remove duplicated 'runs' in man page
perf annotate: Fix typo
perf kvm: Move code to generate filename for perf-kvm to function.
perf kvm: Make perf kvm diff support --guestmount.
Namhyung Kim (5):
tools lib traceevent: Get rid of malloc_or_die() in pevent_filter_alloc()
tools lib traceevent: Get rid of malloc_or_die() in add_event()
tools lib traceevent: Get rid of die() in create_arg_item()
tools lib traceevent: Get rid of malloc_or_die() in pevent_filter_add_filter_str()
tools lib traceevent: Get rid of die() in pevent_filter_clear_trivial()
Stephane Eranian (1):
perf symbols: fix bug in usage of the basename() function
Steven Rostedt (1):
tools lib traceevent: Report better error message on bad function args
tools/lib/traceevent/event-parse.c | 28 +++++++++------
tools/lib/traceevent/event-parse.h | 2 +-
tools/lib/traceevent/parse-filter.c | 57 ++++++++++++++++++++++++-------
tools/perf/Documentation/perf-archive.txt | 6 ++--
tools/perf/Documentation/perf-kvm.txt | 7 ++--
tools/perf/Documentation/perf-script.txt | 2 +-
tools/perf/builtin-annotate.c | 2 +-
tools/perf/builtin-diff.c | 3 +-
tools/perf/builtin-kvm.c | 11 +++---
tools/perf/builtin-record.c | 2 +-
tools/perf/builtin-script.c | 10 ++++++
tools/perf/builtin-trace.c | 32 +++++++++++++++--
tools/perf/util/dso.c | 29 +++++++++++++++-
tools/perf/util/evlist.c | 10 +++---
tools/perf/util/map.c | 17 +++++++++
tools/perf/util/map.h | 2 ++
tools/perf/util/session.c | 15 +++++++-
tools/perf/util/session.h | 1 +
tools/perf/util/util.c | 14 ++++++++
tools/perf/util/util.h | 14 ++++++++
20 files changed, 214 insertions(+), 50 deletions(-)
^ permalink raw reply [flat|nested] 63+ messages in thread* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-09 19:36 Arnaldo Carvalho de Melo @ 2013-12-10 11:07 ` Ingo Molnar 2013-12-10 15:47 ` Jiri Olsa 2013-12-10 11:12 ` Ingo Molnar 1 sibling, 1 reply; 63+ messages in thread From: Ingo Molnar @ 2013-12-10 11:07 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: linux-kernel, Arnaldo Carvalho de Melo, Adrian Hunter, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt, Arnaldo Carvalho de Melo * Arnaldo Carvalho de Melo <acme@infradead.org> wrote: > From: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> > > Hi Ingo, > > Please consider pulling, > > Best Regards, > > -Arnaldo > > The following changes since commit 6d65894bc028d0342829ea1e64c9e9efad571124: > > tools lib traceevent: Update kvm plugin with is_writable_pte helper (2013-12-04 15:38:14 -0300) > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo > > for you to fetch changes up to e993d10caeb6dca690dbaf86e1981ba240d1414a: > > perf symbols: fix bug in usage of the basename() function (2013-12-09 15:41:59 -0300) > > ---------------------------------------------------------------- > perf/core improvements and fixes: > > . Add an option in 'perf script' to print the source line number, from Adrian Hunter > > . Fix symoff printing in callchains in 'perf script', from Adrian Hunter. > > . Assorted mmap_pages handling fixes, from Adrian Hunter. > > . Fix summary percentage when processing files in 'perf trace', fom David Ahern. > > . Handle old kernels where the "raw_syscalls" tracepoints were called plan "syscalls", > in 'perf trace', from David Ahern. > > . Several man pages typo fixes from Dongsheng Yang. > > . Add '-v' option to 'perf kvm', from Dongsheng Yang. > > . Make perf kvm diff support --guestmount, from Dongsheng Yang. > > . Get rid of several die() calls in libtraceevent, from Namhyung Kim. > > . Use basename() in a more robust way, to avoid problems related to different > system library implementations for that function, from Stephane Eranian. > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > > ---------------------------------------------------------------- > Adrian Hunter (6): > perf script: Fix symoff printing in callchains > perf script: Add an option to print the source line number > perf record: Fix display of incorrect mmap pages > perf evlist: Remove unnecessary parentheses > perf evlist: Fix max mmap_pages > perf evlist: Fix mmap pages rounding to power of 2 > > David Ahern (2): > perf trace: Add support for syscalls vs raw_syscalls > perf trace: Fix summary percentage when processing files > > Dongsheng Yang (6): > perf kvm: Introduce option -v for perf kvm command. > perf kvm: Fix bug in 'stat report' > perf archive: Remove duplicated 'runs' in man page > perf annotate: Fix typo > perf kvm: Move code to generate filename for perf-kvm to function. > perf kvm: Make perf kvm diff support --guestmount. > > Namhyung Kim (5): > tools lib traceevent: Get rid of malloc_or_die() in pevent_filter_alloc() > tools lib traceevent: Get rid of malloc_or_die() in add_event() > tools lib traceevent: Get rid of die() in create_arg_item() > tools lib traceevent: Get rid of malloc_or_die() in pevent_filter_add_filter_str() > tools lib traceevent: Get rid of die() in pevent_filter_clear_trivial() > > Stephane Eranian (1): > perf symbols: fix bug in usage of the basename() function > > Steven Rostedt (1): > tools lib traceevent: Report better error message on bad function args > > tools/lib/traceevent/event-parse.c | 28 +++++++++------ > tools/lib/traceevent/event-parse.h | 2 +- > tools/lib/traceevent/parse-filter.c | 57 ++++++++++++++++++++++++------- > tools/perf/Documentation/perf-archive.txt | 6 ++-- > tools/perf/Documentation/perf-kvm.txt | 7 ++-- > tools/perf/Documentation/perf-script.txt | 2 +- > tools/perf/builtin-annotate.c | 2 +- > tools/perf/builtin-diff.c | 3 +- > tools/perf/builtin-kvm.c | 11 +++--- > tools/perf/builtin-record.c | 2 +- > tools/perf/builtin-script.c | 10 ++++++ > tools/perf/builtin-trace.c | 32 +++++++++++++++-- > tools/perf/util/dso.c | 29 +++++++++++++++- > tools/perf/util/evlist.c | 10 +++--- > tools/perf/util/map.c | 17 +++++++++ > tools/perf/util/map.h | 2 ++ > tools/perf/util/session.c | 15 +++++++- > tools/perf/util/session.h | 1 + > tools/perf/util/util.c | 14 ++++++++ > tools/perf/util/util.h | 14 ++++++++ > 20 files changed, 214 insertions(+), 50 deletions(-) Pulled, thanks Arnaldo! There's one detail I noticed about the recent trace-plugin changes: comet:~/tip/tools/perf> make install BUILD: Doing 'make -j12' parallel build SUBDIR Documentation INSTALL Documentation-man INSTALL GTK UI SUBDIR /home/mingo/tip/tools/lib/traceevent/ INSTALL binaries INSTALL plugin_jbd2.so INSTALL plugin_hrtimer.so INSTALL plugin_kmem.so INSTALL plugin_kvm.so INSTALL plugin_mac80211.so INSTALL plugin_sched_switch.so INSTALL plugin_function.so INSTALL plugin_xen.so INSTALL plugin_scsi.so INSTALL plugin_cfg80211.so INSTALL libexec INSTALL perf-archive INSTALL perl-scripts INSTALL python-scripts INSTALL perf_completion-script INSTALL tests those plugin installs are way too verbose, they should really be in a single summarized line, only saying something like: INSTALL plugins Just like we already sum up 'binaries', 'libexec', 'tests', etc. Thanks, Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 11:07 ` Ingo Molnar @ 2013-12-10 15:47 ` Jiri Olsa 2013-12-10 15:49 ` Ingo Molnar 0 siblings, 1 reply; 63+ messages in thread From: Jiri Olsa @ 2013-12-10 15:47 UTC (permalink / raw) To: Ingo Molnar Cc: Arnaldo Carvalho de Melo, linux-kernel, Arnaldo Carvalho de Melo, Adrian Hunter, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt, Arnaldo Carvalho de Melo On Tue, Dec 10, 2013 at 12:07:59PM +0100, Ingo Molnar wrote: > SNIP > > Pulled, thanks Arnaldo! > > There's one detail I noticed about the recent trace-plugin changes: > > comet:~/tip/tools/perf> make install > BUILD: Doing 'make -j12' parallel build > SUBDIR Documentation > INSTALL Documentation-man > INSTALL GTK UI > SUBDIR /home/mingo/tip/tools/lib/traceevent/ > INSTALL binaries > INSTALL plugin_jbd2.so > INSTALL plugin_hrtimer.so > INSTALL plugin_kmem.so > INSTALL plugin_kvm.so > INSTALL plugin_mac80211.so > INSTALL plugin_sched_switch.so > INSTALL plugin_function.so > INSTALL plugin_xen.so > INSTALL plugin_scsi.so > INSTALL plugin_cfg80211.so > INSTALL libexec > INSTALL perf-archive > INSTALL perl-scripts > INSTALL python-scripts > INSTALL perf_completion-script > INSTALL tests > > those plugin installs are way too verbose, they should really be in a > single summarized line, only saying something like: > > INSTALL plugins > > Just like we already sum up 'binaries', 'libexec', 'tests', etc. ok, TODO updated ;-) thanks, jirka ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 15:47 ` Jiri Olsa @ 2013-12-10 15:49 ` Ingo Molnar 0 siblings, 0 replies; 63+ messages in thread From: Ingo Molnar @ 2013-12-10 15:49 UTC (permalink / raw) To: Jiri Olsa Cc: Arnaldo Carvalho de Melo, linux-kernel, Arnaldo Carvalho de Melo, Adrian Hunter, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt, Arnaldo Carvalho de Melo * Jiri Olsa <jolsa@redhat.com> wrote: > On Tue, Dec 10, 2013 at 12:07:59PM +0100, Ingo Molnar wrote: > > > > SNIP > > > > > Pulled, thanks Arnaldo! > > > > There's one detail I noticed about the recent trace-plugin changes: > > > > comet:~/tip/tools/perf> make install > > BUILD: Doing 'make -j12' parallel build > > SUBDIR Documentation > > INSTALL Documentation-man > > INSTALL GTK UI > > SUBDIR /home/mingo/tip/tools/lib/traceevent/ > > INSTALL binaries > > INSTALL plugin_jbd2.so > > INSTALL plugin_hrtimer.so > > INSTALL plugin_kmem.so > > INSTALL plugin_kvm.so > > INSTALL plugin_mac80211.so > > INSTALL plugin_sched_switch.so > > INSTALL plugin_function.so > > INSTALL plugin_xen.so > > INSTALL plugin_scsi.so > > INSTALL plugin_cfg80211.so > > INSTALL libexec > > INSTALL perf-archive > > INSTALL perl-scripts > > INSTALL python-scripts > > INSTALL perf_completion-script > > INSTALL tests > > > > those plugin installs are way too verbose, they should really be in a > > single summarized line, only saying something like: > > > > INSTALL plugins > > > > Just like we already sum up 'binaries', 'libexec', 'tests', etc. > > ok, TODO updated ;-) Consider it a regression! ;-) Thanks, Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-09 19:36 Arnaldo Carvalho de Melo 2013-12-10 11:07 ` Ingo Molnar @ 2013-12-10 11:12 ` Ingo Molnar 2013-12-10 11:44 ` Arnaldo Carvalho de Melo 1 sibling, 1 reply; 63+ messages in thread From: Ingo Molnar @ 2013-12-10 11:12 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: linux-kernel, Arnaldo Carvalho de Melo, Adrian Hunter, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt, Arnaldo Carvalho de Melo Hm, I've unpulled it because 'perf top' crashes on exit, in dso__delete(): [Thread 0x7ffff70df700 (LWP 29561) exited] *** Error in `/fast/mingo/tip/tools/perf/perf': munmap_chunk(): invalid pointer: 0x0000000000587371 *** ======= Backtrace: ========= /lib64/libc.so.6[0x3e5907bbe7] /fast/mingo/tip/tools/perf/perf(dso__delete+0xd9)[0x46da89] /fast/mingo/tip/tools/perf/perf(machines__exit+0xad)[0x482e7d] /fast/mingo/tip/tools/perf/perf(perf_session__delete+0xb6)[0x488c66] /fast/mingo/tip/tools/perf/perf(cmd_top+0xf44)[0x4345f4] /fast/mingo/tip/tools/perf/perf[0x419f95] /fast/mingo/tip/tools/perf/perf(main+0x600)[0x419830] /lib64/libc.so.6(__libc_start_main+0xf5)[0x3e59021b45] /fast/mingo/tip/tools/perf/perf[0x4198fd] ======= Memory map: ======== Program received signal SIGABRT, Aborted. 0x0000003e590359e9 in raise () from /lib64/libc.so.6 Missing separate debuginfos, use: debuginfo-install audit-libs-2.3.2-1.fc19.x86_64 bzip2-libs-1.0.6-8.fc19.x86_64 elfutils-libelf-0.156-5.fc19.x86_64 elfutils-libs-0.156-5.fc19.x86_64 glibc-2.17-19.fc19.x86_64 libgcc-4.8.2-1.fc19.x86_64 libunwind-1.1-2.fc19.x86_64 nss-softokn-freebl-3.15.2-2.fc19.x86_64 numactl-libs-2.0.8-4.fc19.x86_64 perl-libs-5.16.3-266.fc19.x86_64 python-libs-2.7.5-9.fc19.x86_64 slang-2.2.4-8.fc19.x86_64 xz-libs-5.1.2-4alpha.fc19.x86_64 zlib-1.2.7-10.fc19.x86_64 (gdb) (gdb) bt #0 0x0000003e590359e9 in raise () from /lib64/libc.so.6 #1 0x0000003e590370f8 in abort () from /lib64/libc.so.6 #2 0x0000003e59075d17 in __libc_message () from /lib64/libc.so.6 #3 0x0000003e5907bbe7 in malloc_printerr () from /lib64/libc.so.6 #4 0x000000000046da89 in dso__delete (dso=0x8e46f0) at util/dso.c:496 #5 0x0000000000482e7d in dsos__delete (dsos=0x8e4490) at util/machine.c:72 #6 machine__exit (machine=<optimized out>) at util/machine.c:103 #7 machines__exit (machines=machines@entry=0x8e4438) at util/machine.c:123 #8 0x0000000000488c66 in perf_session__delete (session=0x8e4360) at util/session.c:155 #9 0x00000000004345f4 in __cmd_top (top=0x7fffffffb140) at builtin-top.c:985 #10 cmd_top (argc=<optimized out>, argv=<optimized out>, prefix=<optimized out>) at builtin-top.c:1210 #11 0x0000000000419f95 in run_builtin (p=p@entry=0x7ece88 <commands+264>, argc=argc@entry=2, argv=argv@entry=0x7fffffffe420) at perf.c:319 #12 0x0000000000419830 in handle_internal_command (argv=0x7fffffffe420, argc=2) at perf.c:376 #13 run_argv (argv=0x7fffffffe220, argcp=0x7fffffffe22c) at perf.c:420 #14 main (argc=2, argv=0x7fffffffe420) at perf.c:529 (gdb) Running it on an up-to-date installation of Fedora 19. Thanks, Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 11:12 ` Ingo Molnar @ 2013-12-10 11:44 ` Arnaldo Carvalho de Melo 2013-12-10 11:47 ` Ingo Molnar 2013-12-10 12:13 ` Adrian Hunter 0 siblings, 2 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-12-10 11:44 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Adrian Hunter, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt Em Tue, Dec 10, 2013 at 12:12:29PM +0100, Ingo Molnar escreveu: > > Hm, I've unpulled it because 'perf top' crashes on exit, in > dso__delete(): 495 if (dso->sname_alloc) 496 free((char *)dso->short_name) Yeah, must be that basename() patch from Stephane, I'll work on a fix and resubmit this batch, thanks for the report. - Arnaldo > [Thread 0x7ffff70df700 (LWP 29561) exited] > *** Error in `/fast/mingo/tip/tools/perf/perf': munmap_chunk(): invalid pointer: 0x0000000000587371 *** > ======= Backtrace: ========= > /lib64/libc.so.6[0x3e5907bbe7] > /fast/mingo/tip/tools/perf/perf(dso__delete+0xd9)[0x46da89] > /fast/mingo/tip/tools/perf/perf(machines__exit+0xad)[0x482e7d] > /fast/mingo/tip/tools/perf/perf(perf_session__delete+0xb6)[0x488c66] > /fast/mingo/tip/tools/perf/perf(cmd_top+0xf44)[0x4345f4] > /fast/mingo/tip/tools/perf/perf[0x419f95] > /fast/mingo/tip/tools/perf/perf(main+0x600)[0x419830] > /lib64/libc.so.6(__libc_start_main+0xf5)[0x3e59021b45] > /fast/mingo/tip/tools/perf/perf[0x4198fd] > ======= Memory map: ======== > > Program received signal SIGABRT, Aborted. > 0x0000003e590359e9 in raise () from /lib64/libc.so.6 > Missing separate debuginfos, use: debuginfo-install audit-libs-2.3.2-1.fc19.x86_64 bzip2-libs-1.0.6-8.fc19.x86_64 elfutils-libelf-0.156-5.fc19.x86_64 elfutils-libs-0.156-5.fc19.x86_64 glibc-2.17-19.fc19.x86_64 libgcc-4.8.2-1.fc19.x86_64 libunwind-1.1-2.fc19.x86_64 nss-softokn-freebl-3.15.2-2.fc19.x86_64 numactl-libs-2.0.8-4.fc19.x86_64 perl-libs-5.16.3-266.fc19.x86_64 python-libs-2.7.5-9.fc19.x86_64 slang-2.2.4-8.fc19.x86_64 xz-libs-5.1.2-4alpha.fc19.x86_64 zlib-1.2.7-10.fc19.x86_64 > (gdb) > (gdb) bt > #0 0x0000003e590359e9 in raise () from /lib64/libc.so.6 > #1 0x0000003e590370f8 in abort () from /lib64/libc.so.6 > #2 0x0000003e59075d17 in __libc_message () from /lib64/libc.so.6 > #3 0x0000003e5907bbe7 in malloc_printerr () from /lib64/libc.so.6 > #4 0x000000000046da89 in dso__delete (dso=0x8e46f0) at util/dso.c:496 > #5 0x0000000000482e7d in dsos__delete (dsos=0x8e4490) at util/machine.c:72 > #6 machine__exit (machine=<optimized out>) at util/machine.c:103 > #7 machines__exit (machines=machines@entry=0x8e4438) at util/machine.c:123 > #8 0x0000000000488c66 in perf_session__delete (session=0x8e4360) at util/session.c:155 > #9 0x00000000004345f4 in __cmd_top (top=0x7fffffffb140) at builtin-top.c:985 > #10 cmd_top (argc=<optimized out>, argv=<optimized out>, prefix=<optimized out>) at builtin-top.c:1210 > #11 0x0000000000419f95 in run_builtin (p=p@entry=0x7ece88 <commands+264>, argc=argc@entry=2, argv=argv@entry=0x7fffffffe420) at perf.c:319 > #12 0x0000000000419830 in handle_internal_command (argv=0x7fffffffe420, argc=2) at perf.c:376 > #13 run_argv (argv=0x7fffffffe220, argcp=0x7fffffffe22c) at perf.c:420 > #14 main (argc=2, argv=0x7fffffffe420) at perf.c:529 > (gdb) > > Running it on an up-to-date installation of Fedora 19. > > Thanks, > > Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 11:44 ` Arnaldo Carvalho de Melo @ 2013-12-10 11:47 ` Ingo Molnar 2013-12-10 12:01 ` Arnaldo Carvalho de Melo 2013-12-10 12:13 ` Adrian Hunter 1 sibling, 1 reply; 63+ messages in thread From: Ingo Molnar @ 2013-12-10 11:47 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: linux-kernel, Adrian Hunter, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt * Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote: > Em Tue, Dec 10, 2013 at 12:12:29PM +0100, Ingo Molnar escreveu: > > > > Hm, I've unpulled it because 'perf top' crashes on exit, in > > dso__delete(): > > 495 if (dso->sname_alloc) > 496 free((char *)dso->short_name) Btw., instead of trusting flags I'd argue that using the pointer as a flag and clearing the pointer too is a much more robust freeing pattern in general: if (dso->short_name) { free(dso->short_name); dso->short_name = NULL; } or so ... Thanks, Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 11:47 ` Ingo Molnar @ 2013-12-10 12:01 ` Arnaldo Carvalho de Melo 2013-12-10 12:07 ` Ingo Molnar 0 siblings, 1 reply; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-12-10 12:01 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Adrian Hunter, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt Em Tue, Dec 10, 2013 at 12:47:57PM +0100, Ingo Molnar escreveu: > * Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote: > > Em Tue, Dec 10, 2013 at 12:12:29PM +0100, Ingo Molnar escreveu: > > > Hm, I've unpulled it because 'perf top' crashes on exit, in > > > dso__delete(): > > 495 if (dso->sname_alloc) > > 496 free((char *)dso->short_name) > Btw., instead of trusting flags I'd argue that using the pointer as a > flag and clearing the pointer too is a much more robust freeing > pattern in general: > if (dso->short_name) { > free(dso->short_name); > dso->short_name = NULL; > } > > or so ... This is not an unusual idiom, if you look at tools/perf/util/ev{list,sel}.c, for instance, you'll see it in many destructors. In this case there is a micro optimization where sometimes the shortname is just a pointer to the tail part of the long name, hence the flag. - Arnaldo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 12:01 ` Arnaldo Carvalho de Melo @ 2013-12-10 12:07 ` Ingo Molnar 0 siblings, 0 replies; 63+ messages in thread From: Ingo Molnar @ 2013-12-10 12:07 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: linux-kernel, Adrian Hunter, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt * Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote: > Em Tue, Dec 10, 2013 at 12:47:57PM +0100, Ingo Molnar escreveu: > > * Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote: > > > Em Tue, Dec 10, 2013 at 12:12:29PM +0100, Ingo Molnar escreveu: > > > > Hm, I've unpulled it because 'perf top' crashes on exit, in > > > > dso__delete(): > > > > 495 if (dso->sname_alloc) > > > 496 free((char *)dso->short_name) > > > Btw., instead of trusting flags I'd argue that using the pointer as a > > flag and clearing the pointer too is a much more robust freeing > > pattern in general: > > > if (dso->short_name) { > > free(dso->short_name); > > dso->short_name = NULL; > > } > > > > or so ... > > This is not an unusual idiom, if you look at > tools/perf/util/ev{list,sel}.c, for instance, you'll see it in many > destructors. > > In this case there is a micro optimization where sometimes the > shortname is just a pointer to the tail part of the long name, hence > the flag. Sounds fair. [btw., a tiny nit remains: the cast is probably unnecessary, free() will take any pointer.] Thanks, Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 11:44 ` Arnaldo Carvalho de Melo 2013-12-10 11:47 ` Ingo Molnar @ 2013-12-10 12:13 ` Adrian Hunter 2013-12-10 12:10 ` Arnaldo Carvalho de Melo 2013-12-10 12:18 ` Ingo Molnar 1 sibling, 2 replies; 63+ messages in thread From: Adrian Hunter @ 2013-12-10 12:13 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: Ingo Molnar, linux-kernel, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt On 10/12/13 13:44, Arnaldo Carvalho de Melo wrote: > Em Tue, Dec 10, 2013 at 12:12:29PM +0100, Ingo Molnar escreveu: >> >> Hm, I've unpulled it because 'perf top' crashes on exit, in >> dso__delete(): > > 495 if (dso->sname_alloc) > 496 free((char *)dso->short_name) > > Yeah, must be that basename() patch from Stephane, I'll work on a fix > and resubmit this batch, thanks for the report. The problem is sname_alloc is not maintained. Perhaps it should be set in dso__set_short_name() e.g. diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 9fae484..54ed980 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -379,7 +379,7 @@ struct dso *dso__kernel_findnew(struct machine *machine, const char *name, * processing we had no idea this was the kernel dso. */ if (dso != NULL) { - dso__set_short_name(dso, short_name); + dso__set_short_name(dso, short_name, false); dso->kernel = dso_type; } @@ -394,10 +394,13 @@ void dso__set_long_name(struct dso *dso, char *name) dso->long_name_len = strlen(name); } -void dso__set_short_name(struct dso *dso, const char *name) +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc) { if (name == NULL) return; + if (dso->sname_alloc) + free((char *)dso->short_name); + dso->sname_alloc = sname_alloc; dso->short_name = name; dso->short_name_len = strlen(name); } @@ -426,12 +429,7 @@ static void dso__set_basename(struct dso *dso) if (!base) return; - if (dso->sname_alloc) - free((char *)dso->short_name); - else - dso->sname_alloc = 1; - - dso__set_short_name(dso, base); + dso__set_short_name(dso, base, true); } int dso__name_len(const struct dso *dso) @@ -467,7 +465,7 @@ struct dso *dso__new(const char *name) int i; strcpy(dso->name, name); dso__set_long_name(dso, dso->name); - dso__set_short_name(dso, dso->name); + dso__set_short_name(dso, dso->name, false); for (i = 0; i < MAP__NR_TYPES; ++i) dso->symbols[i] = dso->symbol_names[i] = RB_ROOT; dso->cache = RB_ROOT; diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index 384f2d9..166463e 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h @@ -110,7 +110,7 @@ static inline void dso__set_loaded(struct dso *dso, enum map_type type) struct dso *dso__new(const char *name); void dso__delete(struct dso *dso); -void dso__set_short_name(struct dso *dso, const char *name); +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc); void dso__set_long_name(struct dso *dso, char *name); int dso__name_len(const struct dso *dso); > > - Arnaldo > >> [Thread 0x7ffff70df700 (LWP 29561) exited] >> *** Error in `/fast/mingo/tip/tools/perf/perf': munmap_chunk(): invalid pointer: 0x0000000000587371 *** >> ======= Backtrace: ========= >> /lib64/libc.so.6[0x3e5907bbe7] >> /fast/mingo/tip/tools/perf/perf(dso__delete+0xd9)[0x46da89] >> /fast/mingo/tip/tools/perf/perf(machines__exit+0xad)[0x482e7d] >> /fast/mingo/tip/tools/perf/perf(perf_session__delete+0xb6)[0x488c66] >> /fast/mingo/tip/tools/perf/perf(cmd_top+0xf44)[0x4345f4] >> /fast/mingo/tip/tools/perf/perf[0x419f95] >> /fast/mingo/tip/tools/perf/perf(main+0x600)[0x419830] >> /lib64/libc.so.6(__libc_start_main+0xf5)[0x3e59021b45] >> /fast/mingo/tip/tools/perf/perf[0x4198fd] >> ======= Memory map: ======== >> >> Program received signal SIGABRT, Aborted. >> 0x0000003e590359e9 in raise () from /lib64/libc.so.6 >> Missing separate debuginfos, use: debuginfo-install audit-libs-2.3.2-1.fc19.x86_64 bzip2-libs-1.0.6-8.fc19.x86_64 elfutils-libelf-0.156-5.fc19.x86_64 elfutils-libs-0.156-5.fc19.x86_64 glibc-2.17-19.fc19.x86_64 libgcc-4.8.2-1.fc19.x86_64 libunwind-1.1-2.fc19.x86_64 nss-softokn-freebl-3.15.2-2.fc19.x86_64 numactl-libs-2.0.8-4.fc19.x86_64 perl-libs-5.16.3-266.fc19.x86_64 python-libs-2.7.5-9.fc19.x86_64 slang-2.2.4-8.fc19.x86_64 xz-libs-5.1.2-4alpha.fc19.x86_64 zlib-1.2.7-10.fc19.x86_64 >> (gdb) >> (gdb) bt >> #0 0x0000003e590359e9 in raise () from /lib64/libc.so.6 >> #1 0x0000003e590370f8 in abort () from /lib64/libc.so.6 >> #2 0x0000003e59075d17 in __libc_message () from /lib64/libc.so.6 >> #3 0x0000003e5907bbe7 in malloc_printerr () from /lib64/libc.so.6 >> #4 0x000000000046da89 in dso__delete (dso=0x8e46f0) at util/dso.c:496 >> #5 0x0000000000482e7d in dsos__delete (dsos=0x8e4490) at util/machine.c:72 >> #6 machine__exit (machine=<optimized out>) at util/machine.c:103 >> #7 machines__exit (machines=machines@entry=0x8e4438) at util/machine.c:123 >> #8 0x0000000000488c66 in perf_session__delete (session=0x8e4360) at util/session.c:155 >> #9 0x00000000004345f4 in __cmd_top (top=0x7fffffffb140) at builtin-top.c:985 >> #10 cmd_top (argc=<optimized out>, argv=<optimized out>, prefix=<optimized out>) at builtin-top.c:1210 >> #11 0x0000000000419f95 in run_builtin (p=p@entry=0x7ece88 <commands+264>, argc=argc@entry=2, argv=argv@entry=0x7fffffffe420) at perf.c:319 >> #12 0x0000000000419830 in handle_internal_command (argv=0x7fffffffe420, argc=2) at perf.c:376 >> #13 run_argv (argv=0x7fffffffe220, argcp=0x7fffffffe22c) at perf.c:420 >> #14 main (argc=2, argv=0x7fffffffe420) at perf.c:529 >> (gdb) >> >> Running it on an up-to-date installation of Fedora 19. >> >> Thanks, >> >> Ingo > > ^ permalink raw reply related [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 12:13 ` Adrian Hunter @ 2013-12-10 12:10 ` Arnaldo Carvalho de Melo 2013-12-10 12:22 ` Adrian Hunter 2013-12-10 12:18 ` Ingo Molnar 1 sibling, 1 reply; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-12-10 12:10 UTC (permalink / raw) To: Adrian Hunter Cc: Ingo Molnar, linux-kernel, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt Em Tue, Dec 10, 2013 at 02:13:12PM +0200, Adrian Hunter escreveu: > On 10/12/13 13:44, Arnaldo Carvalho de Melo wrote: > > Em Tue, Dec 10, 2013 at 12:12:29PM +0100, Ingo Molnar escreveu: > >> > >> Hm, I've unpulled it because 'perf top' crashes on exit, in > >> dso__delete(): > > > > 495 if (dso->sname_alloc) > > 496 free((char *)dso->short_name) > > > > Yeah, must be that basename() patch from Stephane, I'll work on a fix > > and resubmit this batch, thanks for the report. > > The problem is sname_alloc is not maintained. Perhaps it should be > set in dso__set_short_name() e.g. Yeah, sounds better than having all callers manage that thing, quickie, was this with Stephane's patch applied? I think it should be done as a prep, then apply a modified version of Stephanes, that doesn't deal with the alloc flag (more than using 'true' to say it is a malloc'ed chunk). - Arnaldo > diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c > index 9fae484..54ed980 100644 > --- a/tools/perf/util/dso.c > +++ b/tools/perf/util/dso.c > @@ -379,7 +379,7 @@ struct dso *dso__kernel_findnew(struct machine *machine, > const char *name, > * processing we had no idea this was the kernel dso. > */ > if (dso != NULL) { > - dso__set_short_name(dso, short_name); > + dso__set_short_name(dso, short_name, false); > dso->kernel = dso_type; > } > > @@ -394,10 +394,13 @@ void dso__set_long_name(struct dso *dso, char *name) > dso->long_name_len = strlen(name); > } > > -void dso__set_short_name(struct dso *dso, const char *name) > +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc) > { > if (name == NULL) > return; > + if (dso->sname_alloc) > + free((char *)dso->short_name); > + dso->sname_alloc = sname_alloc; > dso->short_name = name; > dso->short_name_len = strlen(name); > } > @@ -426,12 +429,7 @@ static void dso__set_basename(struct dso *dso) > if (!base) > return; > > - if (dso->sname_alloc) > - free((char *)dso->short_name); > - else > - dso->sname_alloc = 1; > - > - dso__set_short_name(dso, base); > + dso__set_short_name(dso, base, true); > } > > int dso__name_len(const struct dso *dso) > @@ -467,7 +465,7 @@ struct dso *dso__new(const char *name) > int i; > strcpy(dso->name, name); > dso__set_long_name(dso, dso->name); > - dso__set_short_name(dso, dso->name); > + dso__set_short_name(dso, dso->name, false); > for (i = 0; i < MAP__NR_TYPES; ++i) > dso->symbols[i] = dso->symbol_names[i] = RB_ROOT; > dso->cache = RB_ROOT; > diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h > index 384f2d9..166463e 100644 > --- a/tools/perf/util/dso.h > +++ b/tools/perf/util/dso.h > @@ -110,7 +110,7 @@ static inline void dso__set_loaded(struct dso *dso, enum > map_type type) > struct dso *dso__new(const char *name); > void dso__delete(struct dso *dso); > > -void dso__set_short_name(struct dso *dso, const char *name); > +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc); > void dso__set_long_name(struct dso *dso, char *name); > > int dso__name_len(const struct dso *dso); > > > > > > - Arnaldo > > > >> [Thread 0x7ffff70df700 (LWP 29561) exited] > >> *** Error in `/fast/mingo/tip/tools/perf/perf': munmap_chunk(): invalid pointer: 0x0000000000587371 *** > >> ======= Backtrace: ========= > >> /lib64/libc.so.6[0x3e5907bbe7] > >> /fast/mingo/tip/tools/perf/perf(dso__delete+0xd9)[0x46da89] > >> /fast/mingo/tip/tools/perf/perf(machines__exit+0xad)[0x482e7d] > >> /fast/mingo/tip/tools/perf/perf(perf_session__delete+0xb6)[0x488c66] > >> /fast/mingo/tip/tools/perf/perf(cmd_top+0xf44)[0x4345f4] > >> /fast/mingo/tip/tools/perf/perf[0x419f95] > >> /fast/mingo/tip/tools/perf/perf(main+0x600)[0x419830] > >> /lib64/libc.so.6(__libc_start_main+0xf5)[0x3e59021b45] > >> /fast/mingo/tip/tools/perf/perf[0x4198fd] > >> ======= Memory map: ======== > >> > >> Program received signal SIGABRT, Aborted. > >> 0x0000003e590359e9 in raise () from /lib64/libc.so.6 > >> Missing separate debuginfos, use: debuginfo-install audit-libs-2.3.2-1.fc19.x86_64 bzip2-libs-1.0.6-8.fc19.x86_64 elfutils-libelf-0.156-5.fc19.x86_64 elfutils-libs-0.156-5.fc19.x86_64 glibc-2.17-19.fc19.x86_64 libgcc-4.8.2-1.fc19.x86_64 libunwind-1.1-2.fc19.x86_64 nss-softokn-freebl-3.15.2-2.fc19.x86_64 numactl-libs-2.0.8-4.fc19.x86_64 perl-libs-5.16.3-266.fc19.x86_64 python-libs-2.7.5-9.fc19.x86_64 slang-2.2.4-8.fc19.x86_64 xz-libs-5.1.2-4alpha.fc19.x86_64 zlib-1.2.7-10.fc19.x86_64 > >> (gdb) > >> (gdb) bt > >> #0 0x0000003e590359e9 in raise () from /lib64/libc.so.6 > >> #1 0x0000003e590370f8 in abort () from /lib64/libc.so.6 > >> #2 0x0000003e59075d17 in __libc_message () from /lib64/libc.so.6 > >> #3 0x0000003e5907bbe7 in malloc_printerr () from /lib64/libc.so.6 > >> #4 0x000000000046da89 in dso__delete (dso=0x8e46f0) at util/dso.c:496 > >> #5 0x0000000000482e7d in dsos__delete (dsos=0x8e4490) at util/machine.c:72 > >> #6 machine__exit (machine=<optimized out>) at util/machine.c:103 > >> #7 machines__exit (machines=machines@entry=0x8e4438) at util/machine.c:123 > >> #8 0x0000000000488c66 in perf_session__delete (session=0x8e4360) at util/session.c:155 > >> #9 0x00000000004345f4 in __cmd_top (top=0x7fffffffb140) at builtin-top.c:985 > >> #10 cmd_top (argc=<optimized out>, argv=<optimized out>, prefix=<optimized out>) at builtin-top.c:1210 > >> #11 0x0000000000419f95 in run_builtin (p=p@entry=0x7ece88 <commands+264>, argc=argc@entry=2, argv=argv@entry=0x7fffffffe420) at perf.c:319 > >> #12 0x0000000000419830 in handle_internal_command (argv=0x7fffffffe420, argc=2) at perf.c:376 > >> #13 run_argv (argv=0x7fffffffe220, argcp=0x7fffffffe22c) at perf.c:420 > >> #14 main (argc=2, argv=0x7fffffffe420) at perf.c:529 > >> (gdb) > >> > >> Running it on an up-to-date installation of Fedora 19. > >> > >> Thanks, > >> > >> Ingo > > > > ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 12:10 ` Arnaldo Carvalho de Melo @ 2013-12-10 12:22 ` Adrian Hunter 2013-12-10 12:22 ` Arnaldo Carvalho de Melo 0 siblings, 1 reply; 63+ messages in thread From: Adrian Hunter @ 2013-12-10 12:22 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: Ingo Molnar, linux-kernel, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt On 10/12/13 14:10, Arnaldo Carvalho de Melo wrote: > Em Tue, Dec 10, 2013 at 02:13:12PM +0200, Adrian Hunter escreveu: >> On 10/12/13 13:44, Arnaldo Carvalho de Melo wrote: >>> Em Tue, Dec 10, 2013 at 12:12:29PM +0100, Ingo Molnar escreveu: >>>> >>>> Hm, I've unpulled it because 'perf top' crashes on exit, in >>>> dso__delete(): >>> >>> 495 if (dso->sname_alloc) >>> 496 free((char *)dso->short_name) >>> >>> Yeah, must be that basename() patch from Stephane, I'll work on a fix >>> and resubmit this batch, thanks for the report. >> >> The problem is sname_alloc is not maintained. Perhaps it should be >> set in dso__set_short_name() e.g. > > Yeah, sounds better than having all callers manage that thing, quickie, > was this with Stephane's patch applied? Yes it was at e993d10caeb6dca690dbaf86e1981ba240d1414a perf symbols: fix bug in usage of the basename() function > > I think it should be done as a prep, then apply a modified version of > Stephanes, that doesn't deal with the alloc flag (more than using 'true' > to say it is a malloc'ed chunk). > > - Arnaldo > >> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c >> index 9fae484..54ed980 100644 >> --- a/tools/perf/util/dso.c >> +++ b/tools/perf/util/dso.c >> @@ -379,7 +379,7 @@ struct dso *dso__kernel_findnew(struct machine *machine, >> const char *name, >> * processing we had no idea this was the kernel dso. >> */ >> if (dso != NULL) { >> - dso__set_short_name(dso, short_name); >> + dso__set_short_name(dso, short_name, false); >> dso->kernel = dso_type; >> } >> >> @@ -394,10 +394,13 @@ void dso__set_long_name(struct dso *dso, char *name) >> dso->long_name_len = strlen(name); >> } >> >> -void dso__set_short_name(struct dso *dso, const char *name) >> +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc) >> { >> if (name == NULL) >> return; >> + if (dso->sname_alloc) >> + free((char *)dso->short_name); >> + dso->sname_alloc = sname_alloc; >> dso->short_name = name; >> dso->short_name_len = strlen(name); >> } >> @@ -426,12 +429,7 @@ static void dso__set_basename(struct dso *dso) >> if (!base) >> return; >> >> - if (dso->sname_alloc) >> - free((char *)dso->short_name); >> - else >> - dso->sname_alloc = 1; >> - >> - dso__set_short_name(dso, base); >> + dso__set_short_name(dso, base, true); >> } >> >> int dso__name_len(const struct dso *dso) >> @@ -467,7 +465,7 @@ struct dso *dso__new(const char *name) >> int i; >> strcpy(dso->name, name); >> dso__set_long_name(dso, dso->name); >> - dso__set_short_name(dso, dso->name); >> + dso__set_short_name(dso, dso->name, false); >> for (i = 0; i < MAP__NR_TYPES; ++i) >> dso->symbols[i] = dso->symbol_names[i] = RB_ROOT; >> dso->cache = RB_ROOT; >> diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h >> index 384f2d9..166463e 100644 >> --- a/tools/perf/util/dso.h >> +++ b/tools/perf/util/dso.h >> @@ -110,7 +110,7 @@ static inline void dso__set_loaded(struct dso *dso, enum >> map_type type) >> struct dso *dso__new(const char *name); >> void dso__delete(struct dso *dso); >> >> -void dso__set_short_name(struct dso *dso, const char *name); >> +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc); >> void dso__set_long_name(struct dso *dso, char *name); >> >> int dso__name_len(const struct dso *dso); >> >> >>> >>> - Arnaldo >>> >>>> [Thread 0x7ffff70df700 (LWP 29561) exited] >>>> *** Error in `/fast/mingo/tip/tools/perf/perf': munmap_chunk(): invalid pointer: 0x0000000000587371 *** >>>> ======= Backtrace: ========= >>>> /lib64/libc.so.6[0x3e5907bbe7] >>>> /fast/mingo/tip/tools/perf/perf(dso__delete+0xd9)[0x46da89] >>>> /fast/mingo/tip/tools/perf/perf(machines__exit+0xad)[0x482e7d] >>>> /fast/mingo/tip/tools/perf/perf(perf_session__delete+0xb6)[0x488c66] >>>> /fast/mingo/tip/tools/perf/perf(cmd_top+0xf44)[0x4345f4] >>>> /fast/mingo/tip/tools/perf/perf[0x419f95] >>>> /fast/mingo/tip/tools/perf/perf(main+0x600)[0x419830] >>>> /lib64/libc.so.6(__libc_start_main+0xf5)[0x3e59021b45] >>>> /fast/mingo/tip/tools/perf/perf[0x4198fd] >>>> ======= Memory map: ======== >>>> >>>> Program received signal SIGABRT, Aborted. >>>> 0x0000003e590359e9 in raise () from /lib64/libc.so.6 >>>> Missing separate debuginfos, use: debuginfo-install audit-libs-2.3.2-1.fc19.x86_64 bzip2-libs-1.0.6-8.fc19.x86_64 elfutils-libelf-0.156-5.fc19.x86_64 elfutils-libs-0.156-5.fc19.x86_64 glibc-2.17-19.fc19.x86_64 libgcc-4.8.2-1.fc19.x86_64 libunwind-1.1-2.fc19.x86_64 nss-softokn-freebl-3.15.2-2.fc19.x86_64 numactl-libs-2.0.8-4.fc19.x86_64 perl-libs-5.16.3-266.fc19.x86_64 python-libs-2.7.5-9.fc19.x86_64 slang-2.2.4-8.fc19.x86_64 xz-libs-5.1.2-4alpha.fc19.x86_64 zlib-1.2.7-10.fc19.x86_64 >>>> (gdb) >>>> (gdb) bt >>>> #0 0x0000003e590359e9 in raise () from /lib64/libc.so.6 >>>> #1 0x0000003e590370f8 in abort () from /lib64/libc.so.6 >>>> #2 0x0000003e59075d17 in __libc_message () from /lib64/libc.so.6 >>>> #3 0x0000003e5907bbe7 in malloc_printerr () from /lib64/libc.so.6 >>>> #4 0x000000000046da89 in dso__delete (dso=0x8e46f0) at util/dso.c:496 >>>> #5 0x0000000000482e7d in dsos__delete (dsos=0x8e4490) at util/machine.c:72 >>>> #6 machine__exit (machine=<optimized out>) at util/machine.c:103 >>>> #7 machines__exit (machines=machines@entry=0x8e4438) at util/machine.c:123 >>>> #8 0x0000000000488c66 in perf_session__delete (session=0x8e4360) at util/session.c:155 >>>> #9 0x00000000004345f4 in __cmd_top (top=0x7fffffffb140) at builtin-top.c:985 >>>> #10 cmd_top (argc=<optimized out>, argv=<optimized out>, prefix=<optimized out>) at builtin-top.c:1210 >>>> #11 0x0000000000419f95 in run_builtin (p=p@entry=0x7ece88 <commands+264>, argc=argc@entry=2, argv=argv@entry=0x7fffffffe420) at perf.c:319 >>>> #12 0x0000000000419830 in handle_internal_command (argv=0x7fffffffe420, argc=2) at perf.c:376 >>>> #13 run_argv (argv=0x7fffffffe220, argcp=0x7fffffffe22c) at perf.c:420 >>>> #14 main (argc=2, argv=0x7fffffffe420) at perf.c:529 >>>> (gdb) >>>> >>>> Running it on an up-to-date installation of Fedora 19. >>>> >>>> Thanks, >>>> >>>> Ingo >>> >>> > > ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 12:22 ` Adrian Hunter @ 2013-12-10 12:22 ` Arnaldo Carvalho de Melo 2013-12-10 12:23 ` Arnaldo Carvalho de Melo 2013-12-10 12:24 ` Ingo Molnar 0 siblings, 2 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-12-10 12:22 UTC (permalink / raw) To: Adrian Hunter Cc: Ingo Molnar, linux-kernel, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt Em Tue, Dec 10, 2013 at 02:22:58PM +0200, Adrian Hunter escreveu: > On 10/12/13 14:10, Arnaldo Carvalho de Melo wrote: > > Em Tue, Dec 10, 2013 at 02:13:12PM +0200, Adrian Hunter escreveu: > >> On 10/12/13 13:44, Arnaldo Carvalho de Melo wrote: > >>> Em Tue, Dec 10, 2013 at 12:12:29PM +0100, Ingo Molnar escreveu: > >>>> > >>>> Hm, I've unpulled it because 'perf top' crashes on exit, in > >>>> dso__delete(): > >>> > >>> 495 if (dso->sname_alloc) > >>> 496 free((char *)dso->short_name) > >>> > >>> Yeah, must be that basename() patch from Stephane, I'll work on a fix > >>> and resubmit this batch, thanks for the report. > >> > >> The problem is sname_alloc is not maintained. Perhaps it should be > >> set in dso__set_short_name() e.g. > > > > Yeah, sounds better than having all callers manage that thing, quickie, > > was this with Stephane's patch applied? > > Yes it was at > e993d10caeb6dca690dbaf86e1981ba240d1414a > perf symbols: fix bug in usage of the basename() function Yes, this is the buggy patch, my question was if Ingo did the changes that streamlined the dso->sname_alloc management with e993d10caeb6 applied to his working tree. - Arnaldo > > I think it should be done as a prep, then apply a modified version of > > Stephanes, that doesn't deal with the alloc flag (more than using 'true' > > to say it is a malloc'ed chunk). > > > > - Arnaldo > > > >> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c > >> index 9fae484..54ed980 100644 > >> --- a/tools/perf/util/dso.c > >> +++ b/tools/perf/util/dso.c > >> @@ -379,7 +379,7 @@ struct dso *dso__kernel_findnew(struct machine *machine, > >> const char *name, > >> * processing we had no idea this was the kernel dso. > >> */ > >> if (dso != NULL) { > >> - dso__set_short_name(dso, short_name); > >> + dso__set_short_name(dso, short_name, false); > >> dso->kernel = dso_type; > >> } > >> > >> @@ -394,10 +394,13 @@ void dso__set_long_name(struct dso *dso, char *name) > >> dso->long_name_len = strlen(name); > >> } > >> > >> -void dso__set_short_name(struct dso *dso, const char *name) > >> +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc) > >> { > >> if (name == NULL) > >> return; > >> + if (dso->sname_alloc) > >> + free((char *)dso->short_name); > >> + dso->sname_alloc = sname_alloc; > >> dso->short_name = name; > >> dso->short_name_len = strlen(name); > >> } > >> @@ -426,12 +429,7 @@ static void dso__set_basename(struct dso *dso) > >> if (!base) > >> return; > >> > >> - if (dso->sname_alloc) > >> - free((char *)dso->short_name); > >> - else > >> - dso->sname_alloc = 1; > >> - > >> - dso__set_short_name(dso, base); > >> + dso__set_short_name(dso, base, true); > >> } > >> > >> int dso__name_len(const struct dso *dso) > >> @@ -467,7 +465,7 @@ struct dso *dso__new(const char *name) > >> int i; > >> strcpy(dso->name, name); > >> dso__set_long_name(dso, dso->name); > >> - dso__set_short_name(dso, dso->name); > >> + dso__set_short_name(dso, dso->name, false); > >> for (i = 0; i < MAP__NR_TYPES; ++i) > >> dso->symbols[i] = dso->symbol_names[i] = RB_ROOT; > >> dso->cache = RB_ROOT; > >> diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h > >> index 384f2d9..166463e 100644 > >> --- a/tools/perf/util/dso.h > >> +++ b/tools/perf/util/dso.h > >> @@ -110,7 +110,7 @@ static inline void dso__set_loaded(struct dso *dso, enum > >> map_type type) > >> struct dso *dso__new(const char *name); > >> void dso__delete(struct dso *dso); > >> > >> -void dso__set_short_name(struct dso *dso, const char *name); > >> +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc); > >> void dso__set_long_name(struct dso *dso, char *name); > >> > >> int dso__name_len(const struct dso *dso); > >> > >> > >>> > >>> - Arnaldo > >>> > >>>> [Thread 0x7ffff70df700 (LWP 29561) exited] > >>>> *** Error in `/fast/mingo/tip/tools/perf/perf': munmap_chunk(): invalid pointer: 0x0000000000587371 *** > >>>> ======= Backtrace: ========= > >>>> /lib64/libc.so.6[0x3e5907bbe7] > >>>> /fast/mingo/tip/tools/perf/perf(dso__delete+0xd9)[0x46da89] > >>>> /fast/mingo/tip/tools/perf/perf(machines__exit+0xad)[0x482e7d] > >>>> /fast/mingo/tip/tools/perf/perf(perf_session__delete+0xb6)[0x488c66] > >>>> /fast/mingo/tip/tools/perf/perf(cmd_top+0xf44)[0x4345f4] > >>>> /fast/mingo/tip/tools/perf/perf[0x419f95] > >>>> /fast/mingo/tip/tools/perf/perf(main+0x600)[0x419830] > >>>> /lib64/libc.so.6(__libc_start_main+0xf5)[0x3e59021b45] > >>>> /fast/mingo/tip/tools/perf/perf[0x4198fd] > >>>> ======= Memory map: ======== > >>>> > >>>> Program received signal SIGABRT, Aborted. > >>>> 0x0000003e590359e9 in raise () from /lib64/libc.so.6 > >>>> Missing separate debuginfos, use: debuginfo-install audit-libs-2.3.2-1.fc19.x86_64 bzip2-libs-1.0.6-8.fc19.x86_64 elfutils-libelf-0.156-5.fc19.x86_64 elfutils-libs-0.156-5.fc19.x86_64 glibc-2.17-19.fc19.x86_64 libgcc-4.8.2-1.fc19.x86_64 libunwind-1.1-2.fc19.x86_64 nss-softokn-freebl-3.15.2-2.fc19.x86_64 numactl-libs-2.0.8-4.fc19.x86_64 perl-libs-5.16.3-266.fc19.x86_64 python-libs-2.7.5-9.fc19.x86_64 slang-2.2.4-8.fc19.x86_64 xz-libs-5.1.2-4alpha.fc19.x86_64 zlib-1.2.7-10.fc19.x86_64 > >>>> (gdb) > >>>> (gdb) bt > >>>> #0 0x0000003e590359e9 in raise () from /lib64/libc.so.6 > >>>> #1 0x0000003e590370f8 in abort () from /lib64/libc.so.6 > >>>> #2 0x0000003e59075d17 in __libc_message () from /lib64/libc.so.6 > >>>> #3 0x0000003e5907bbe7 in malloc_printerr () from /lib64/libc.so.6 > >>>> #4 0x000000000046da89 in dso__delete (dso=0x8e46f0) at util/dso.c:496 > >>>> #5 0x0000000000482e7d in dsos__delete (dsos=0x8e4490) at util/machine.c:72 > >>>> #6 machine__exit (machine=<optimized out>) at util/machine.c:103 > >>>> #7 machines__exit (machines=machines@entry=0x8e4438) at util/machine.c:123 > >>>> #8 0x0000000000488c66 in perf_session__delete (session=0x8e4360) at util/session.c:155 > >>>> #9 0x00000000004345f4 in __cmd_top (top=0x7fffffffb140) at builtin-top.c:985 > >>>> #10 cmd_top (argc=<optimized out>, argv=<optimized out>, prefix=<optimized out>) at builtin-top.c:1210 > >>>> #11 0x0000000000419f95 in run_builtin (p=p@entry=0x7ece88 <commands+264>, argc=argc@entry=2, argv=argv@entry=0x7fffffffe420) at perf.c:319 > >>>> #12 0x0000000000419830 in handle_internal_command (argv=0x7fffffffe420, argc=2) at perf.c:376 > >>>> #13 run_argv (argv=0x7fffffffe220, argcp=0x7fffffffe22c) at perf.c:420 > >>>> #14 main (argc=2, argv=0x7fffffffe420) at perf.c:529 > >>>> (gdb) > >>>> > >>>> Running it on an up-to-date installation of Fedora 19. > >>>> > >>>> Thanks, > >>>> > >>>> Ingo > >>> > >>> > > > > ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 12:22 ` Arnaldo Carvalho de Melo @ 2013-12-10 12:23 ` Arnaldo Carvalho de Melo 2013-12-10 12:24 ` Ingo Molnar 1 sibling, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-12-10 12:23 UTC (permalink / raw) To: Adrian Hunter Cc: Ingo Molnar, linux-kernel, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt Em Tue, Dec 10, 2013 at 09:22:13AM -0300, Arnaldo Carvalho de Melo escreveu: > Em Tue, Dec 10, 2013 at 02:22:58PM +0200, Adrian Hunter escreveu: > > On 10/12/13 14:10, Arnaldo Carvalho de Melo wrote: > > > Em Tue, Dec 10, 2013 at 02:13:12PM +0200, Adrian Hunter escreveu: > > >> On 10/12/13 13:44, Arnaldo Carvalho de Melo wrote: > > >>> Em Tue, Dec 10, 2013 at 12:12:29PM +0100, Ingo Molnar escreveu: > > >>>> > > >>>> Hm, I've unpulled it because 'perf top' crashes on exit, in > > >>>> dso__delete(): > > >>> > > >>> 495 if (dso->sname_alloc) > > >>> 496 free((char *)dso->short_name) > > >>> > > >>> Yeah, must be that basename() patch from Stephane, I'll work on a fix > > >>> and resubmit this batch, thanks for the report. > > >> > > >> The problem is sname_alloc is not maintained. Perhaps it should be > > >> set in dso__set_short_name() e.g. > > > > > > Yeah, sounds better than having all callers manage that thing, quickie, > > > was this with Stephane's patch applied? > > > > Yes it was at > > e993d10caeb6dca690dbaf86e1981ba240d1414a > > perf symbols: fix bug in usage of the basename() function > > Yes, this is the buggy patch, my question was if Ingo did the changes > that streamlined the dso->sname_alloc management with e993d10caeb6 > applied to his working tree. Sorry Adrian, my bad, I thought Ingo had provided the patch, now I realized my mistake, it was you 8-) > - Arnaldo > > > > I think it should be done as a prep, then apply a modified version of > > > Stephanes, that doesn't deal with the alloc flag (more than using 'true' > > > to say it is a malloc'ed chunk). > > > > > > - Arnaldo > > > > > >> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c > > >> index 9fae484..54ed980 100644 > > >> --- a/tools/perf/util/dso.c > > >> +++ b/tools/perf/util/dso.c > > >> @@ -379,7 +379,7 @@ struct dso *dso__kernel_findnew(struct machine *machine, > > >> const char *name, > > >> * processing we had no idea this was the kernel dso. > > >> */ > > >> if (dso != NULL) { > > >> - dso__set_short_name(dso, short_name); > > >> + dso__set_short_name(dso, short_name, false); > > >> dso->kernel = dso_type; > > >> } > > >> > > >> @@ -394,10 +394,13 @@ void dso__set_long_name(struct dso *dso, char *name) > > >> dso->long_name_len = strlen(name); > > >> } > > >> > > >> -void dso__set_short_name(struct dso *dso, const char *name) > > >> +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc) > > >> { > > >> if (name == NULL) > > >> return; > > >> + if (dso->sname_alloc) > > >> + free((char *)dso->short_name); > > >> + dso->sname_alloc = sname_alloc; > > >> dso->short_name = name; > > >> dso->short_name_len = strlen(name); > > >> } > > >> @@ -426,12 +429,7 @@ static void dso__set_basename(struct dso *dso) > > >> if (!base) > > >> return; > > >> > > >> - if (dso->sname_alloc) > > >> - free((char *)dso->short_name); > > >> - else > > >> - dso->sname_alloc = 1; > > >> - > > >> - dso__set_short_name(dso, base); > > >> + dso__set_short_name(dso, base, true); > > >> } > > >> > > >> int dso__name_len(const struct dso *dso) > > >> @@ -467,7 +465,7 @@ struct dso *dso__new(const char *name) > > >> int i; > > >> strcpy(dso->name, name); > > >> dso__set_long_name(dso, dso->name); > > >> - dso__set_short_name(dso, dso->name); > > >> + dso__set_short_name(dso, dso->name, false); > > >> for (i = 0; i < MAP__NR_TYPES; ++i) > > >> dso->symbols[i] = dso->symbol_names[i] = RB_ROOT; > > >> dso->cache = RB_ROOT; > > >> diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h > > >> index 384f2d9..166463e 100644 > > >> --- a/tools/perf/util/dso.h > > >> +++ b/tools/perf/util/dso.h > > >> @@ -110,7 +110,7 @@ static inline void dso__set_loaded(struct dso *dso, enum > > >> map_type type) > > >> struct dso *dso__new(const char *name); > > >> void dso__delete(struct dso *dso); > > >> > > >> -void dso__set_short_name(struct dso *dso, const char *name); > > >> +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc); > > >> void dso__set_long_name(struct dso *dso, char *name); > > >> > > >> int dso__name_len(const struct dso *dso); > > >> > > >> > > >>> > > >>> - Arnaldo > > >>> > > >>>> [Thread 0x7ffff70df700 (LWP 29561) exited] > > >>>> *** Error in `/fast/mingo/tip/tools/perf/perf': munmap_chunk(): invalid pointer: 0x0000000000587371 *** > > >>>> ======= Backtrace: ========= > > >>>> /lib64/libc.so.6[0x3e5907bbe7] > > >>>> /fast/mingo/tip/tools/perf/perf(dso__delete+0xd9)[0x46da89] > > >>>> /fast/mingo/tip/tools/perf/perf(machines__exit+0xad)[0x482e7d] > > >>>> /fast/mingo/tip/tools/perf/perf(perf_session__delete+0xb6)[0x488c66] > > >>>> /fast/mingo/tip/tools/perf/perf(cmd_top+0xf44)[0x4345f4] > > >>>> /fast/mingo/tip/tools/perf/perf[0x419f95] > > >>>> /fast/mingo/tip/tools/perf/perf(main+0x600)[0x419830] > > >>>> /lib64/libc.so.6(__libc_start_main+0xf5)[0x3e59021b45] > > >>>> /fast/mingo/tip/tools/perf/perf[0x4198fd] > > >>>> ======= Memory map: ======== > > >>>> > > >>>> Program received signal SIGABRT, Aborted. > > >>>> 0x0000003e590359e9 in raise () from /lib64/libc.so.6 > > >>>> Missing separate debuginfos, use: debuginfo-install audit-libs-2.3.2-1.fc19.x86_64 bzip2-libs-1.0.6-8.fc19.x86_64 elfutils-libelf-0.156-5.fc19.x86_64 elfutils-libs-0.156-5.fc19.x86_64 glibc-2.17-19.fc19.x86_64 libgcc-4.8.2-1.fc19.x86_64 libunwind-1.1-2.fc19.x86_64 nss-softokn-freebl-3.15.2-2.fc19.x86_64 numactl-libs-2.0.8-4.fc19.x86_64 perl-libs-5.16.3-266.fc19.x86_64 python-libs-2.7.5-9.fc19.x86_64 slang-2.2.4-8.fc19.x86_64 xz-libs-5.1.2-4alpha.fc19.x86_64 zlib-1.2.7-10.fc19.x86_64 > > >>>> (gdb) > > >>>> (gdb) bt > > >>>> #0 0x0000003e590359e9 in raise () from /lib64/libc.so.6 > > >>>> #1 0x0000003e590370f8 in abort () from /lib64/libc.so.6 > > >>>> #2 0x0000003e59075d17 in __libc_message () from /lib64/libc.so.6 > > >>>> #3 0x0000003e5907bbe7 in malloc_printerr () from /lib64/libc.so.6 > > >>>> #4 0x000000000046da89 in dso__delete (dso=0x8e46f0) at util/dso.c:496 > > >>>> #5 0x0000000000482e7d in dsos__delete (dsos=0x8e4490) at util/machine.c:72 > > >>>> #6 machine__exit (machine=<optimized out>) at util/machine.c:103 > > >>>> #7 machines__exit (machines=machines@entry=0x8e4438) at util/machine.c:123 > > >>>> #8 0x0000000000488c66 in perf_session__delete (session=0x8e4360) at util/session.c:155 > > >>>> #9 0x00000000004345f4 in __cmd_top (top=0x7fffffffb140) at builtin-top.c:985 > > >>>> #10 cmd_top (argc=<optimized out>, argv=<optimized out>, prefix=<optimized out>) at builtin-top.c:1210 > > >>>> #11 0x0000000000419f95 in run_builtin (p=p@entry=0x7ece88 <commands+264>, argc=argc@entry=2, argv=argv@entry=0x7fffffffe420) at perf.c:319 > > >>>> #12 0x0000000000419830 in handle_internal_command (argv=0x7fffffffe420, argc=2) at perf.c:376 > > >>>> #13 run_argv (argv=0x7fffffffe220, argcp=0x7fffffffe22c) at perf.c:420 > > >>>> #14 main (argc=2, argv=0x7fffffffe420) at perf.c:529 > > >>>> (gdb) > > >>>> > > >>>> Running it on an up-to-date installation of Fedora 19. > > >>>> > > >>>> Thanks, > > >>>> > > >>>> Ingo > > >>> > > >>> > > > > > > ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 12:22 ` Arnaldo Carvalho de Melo 2013-12-10 12:23 ` Arnaldo Carvalho de Melo @ 2013-12-10 12:24 ` Ingo Molnar 1 sibling, 0 replies; 63+ messages in thread From: Ingo Molnar @ 2013-12-10 12:24 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: Adrian Hunter, linux-kernel, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt * Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote: > Em Tue, Dec 10, 2013 at 02:22:58PM +0200, Adrian Hunter escreveu: > > On 10/12/13 14:10, Arnaldo Carvalho de Melo wrote: > > > Em Tue, Dec 10, 2013 at 02:13:12PM +0200, Adrian Hunter escreveu: > > >> On 10/12/13 13:44, Arnaldo Carvalho de Melo wrote: > > >>> Em Tue, Dec 10, 2013 at 12:12:29PM +0100, Ingo Molnar escreveu: > > >>>> > > >>>> Hm, I've unpulled it because 'perf top' crashes on exit, in > > >>>> dso__delete(): > > >>> > > >>> 495 if (dso->sname_alloc) > > >>> 496 free((char *)dso->short_name) > > >>> > > >>> Yeah, must be that basename() patch from Stephane, I'll work on a fix > > >>> and resubmit this batch, thanks for the report. > > >> > > >> The problem is sname_alloc is not maintained. Perhaps it should be > > >> set in dso__set_short_name() e.g. > > > > > > Yeah, sounds better than having all callers manage that thing, quickie, > > > was this with Stephane's patch applied? > > > > Yes it was at > > e993d10caeb6dca690dbaf86e1981ba240d1414a > > perf symbols: fix bug in usage of the basename() function > > Yes, this is the buggy patch, my question was if Ingo did the > changes that streamlined the dso->sname_alloc management with > e993d10caeb6 applied to his working tree. My current perf/core head is: 789790791ad2 tools/perf/build: Fix install dependency which does not have e993d10c. [ Btw., a small nit: the capitalization of the commit title looks inconsistent. ] Thanks, Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 12:13 ` Adrian Hunter 2013-12-10 12:10 ` Arnaldo Carvalho de Melo @ 2013-12-10 12:18 ` Ingo Molnar 2013-12-10 12:46 ` Ingo Molnar 2013-12-10 13:49 ` Arnaldo Carvalho de Melo 1 sibling, 2 replies; 63+ messages in thread From: Ingo Molnar @ 2013-12-10 12:18 UTC (permalink / raw) To: Adrian Hunter Cc: Arnaldo Carvalho de Melo, linux-kernel, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt * Adrian Hunter <adrian.hunter@intel.com> wrote: > -void dso__set_short_name(struct dso *dso, const char *name) > +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc) > { > if (name == NULL) > return; > + if (dso->sname_alloc) > + free((char *)dso->short_name); > + dso->sname_alloc = sname_alloc; Calling the function option the same as the field name is asking for trouble - I'd suggest 'new_sname_alloc' for the parameter, or so. And I'd also remove the 'const' from struct dso::short_name, it probably does not help code generation, because 'dso' is passed in as const in all the non-lifetime methods anyway. That way the cast can be dropped from the free(). Similar problems exist with the usage of 'short_name' - it overloads the field name which makes it somewhat confusing, and it's also sometimes inconsistently named, such as 'name' in dso__set_short_name(). Ditto for 'long_name' handling. Also, the 'sname_alloc' name sucks, it does not make it obvious that it's related to 'short_name', hiding its true significance (and hiding the broken life time handling of the flag/pointer combo). I'd rename it to something more descriptive, like ->short_name_allocated - or I'd rename everything to 'sname'/'lname' naming for short/long names. Every time one runs into a crash like this it's a canary signal that cleanliness principles need hardening. Thanks, Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 12:18 ` Ingo Molnar @ 2013-12-10 12:46 ` Ingo Molnar 2013-12-10 13:29 ` Arnaldo Carvalho de Melo 2013-12-10 13:49 ` Arnaldo Carvalho de Melo 1 sibling, 1 reply; 63+ messages in thread From: Ingo Molnar @ 2013-12-10 12:46 UTC (permalink / raw) To: Adrian Hunter Cc: Arnaldo Carvalho de Melo, linux-kernel, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt * Ingo Molnar <mingo@kernel.org> wrote: > > * Adrian Hunter <adrian.hunter@intel.com> wrote: > > > -void dso__set_short_name(struct dso *dso, const char *name) > > +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc) > > { > > if (name == NULL) > > return; > > + if (dso->sname_alloc) > > + free((char *)dso->short_name); > > + dso->sname_alloc = sname_alloc; > > Calling the function option the same as the field name is asking for > trouble - I'd suggest 'new_sname_alloc' for the parameter, or so. > > And I'd also remove the 'const' from struct dso::short_name, it > probably does not help code generation, because 'dso' is passed in as > const in all the non-lifetime methods anyway. > > That way the cast can be dropped from the free(). > > Similar problems exist with the usage of 'short_name' - it overloads > the field name which makes it somewhat confusing, and it's also > sometimes inconsistently named, such as 'name' in > dso__set_short_name(). > > Ditto for 'long_name' handling. > > Also, the 'sname_alloc' name sucks, it does not make it obvious that > it's related to 'short_name', hiding its true significance (and hiding > the broken life time handling of the flag/pointer combo). I'd rename > it to something more descriptive, like ->short_name_allocated - or I'd > rename everything to 'sname'/'lname' naming for short/long names. > > Every time one runs into a crash like this it's a canary signal that > cleanliness principles need hardening. More observations about util/dso.c: - dso__binary_type_file() should probably pass in 'const struct dso' - dso__binary_type_file()'s filename string parameter should be named 'filename', not 'file' ... - build_id__sprintf() looks fragile: every single use of it appears to follow this pattern: build_id__sprintf(x, sizeof(x), ...) this could be simplified (and eliminating the possibility to typo a bug) by changing the function to __build_id__snprintf() and adding a build_id__sprintf() wrapper macro around it: build_id__sprintf(x, ...) that generates the size itself. - dso__binary_type_file() is a method without a verb, so it's unclear what it does. It probably wants to be renamed to dso__set_binary_type_file() or so? - dso_cache__find() probably wants to pass in a const rb_root. - 'struct dso *pos' should probably be named 'struct dso *dso_pos' or so - 'pos' is frequently used for integer variable names so its use for an object iterator feels confusing. - the 'head' argument of dsos__find() wants to be constified too I guess Thanks, Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 12:46 ` Ingo Molnar @ 2013-12-10 13:29 ` Arnaldo Carvalho de Melo 0 siblings, 0 replies; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-12-10 13:29 UTC (permalink / raw) To: Ingo Molnar Cc: Adrian Hunter, linux-kernel, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt Em Tue, Dec 10, 2013 at 01:46:58PM +0100, Ingo Molnar escreveu: > * Ingo Molnar <mingo@kernel.org> wrote: > > Every time one runs into a crash like this it's a canary signal that > > cleanliness principles need hardening. > > More observations about util/dso.c: > > - dso__binary_type_file() should probably pass in 'const struct dso' > > - dso__binary_type_file()'s filename string parameter should be named > 'filename', not 'file' ... > > - build_id__sprintf() looks fragile: every single use of it appears > to follow this pattern: > > build_id__sprintf(x, sizeof(x), ...) > > this could be simplified (and eliminating the possibility to typo a > bug) by changing the function to __build_id__snprintf() and adding > a build_id__sprintf() wrapper macro around it: > > build_id__sprintf(x, ...) > > that generates the size itself. Right, like: int __perf_evlist__add_default_attrs(struct perf_evlist *evlist, struct perf_event_attr *attrs, size_t nr_attrs); #define perf_evlist__add_default_attrs(evlist, array) \ __perf_evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array)) This is all a matter of being more dilligent and judicious at employing these and other good practices. But don't be shy to point anything (like you did here), as time permits we can go on doing patchkits to address things people notice. - Arnaldo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 12:18 ` Ingo Molnar 2013-12-10 12:46 ` Ingo Molnar @ 2013-12-10 13:49 ` Arnaldo Carvalho de Melo 2013-12-10 15:05 ` Ingo Molnar 1 sibling, 1 reply; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2013-12-10 13:49 UTC (permalink / raw) To: Ingo Molnar Cc: Adrian Hunter, linux-kernel, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt Em Tue, Dec 10, 2013 at 01:18:01PM +0100, Ingo Molnar escreveu: > > * Adrian Hunter <adrian.hunter@intel.com> wrote: > > > -void dso__set_short_name(struct dso *dso, const char *name) > > +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc) > > { > > if (name == NULL) > > return; > > + if (dso->sname_alloc) > > + free((char *)dso->short_name); > > + dso->sname_alloc = sname_alloc; > > Calling the function option the same as the field name is asking for > trouble - I'd suggest 'new_sname_alloc' for the parameter, or so. > > And I'd also remove the 'const' from struct dso::short_name, it > probably does not help code generation, because 'dso' is passed in as > const in all the non-lifetime methods anyway. > That way the cast can be dropped from the free(). Not that simple, there are multiple places that pass a constant short_name, for instance: machine__get_kernel() kernel = dso__kernel_findnew(machine, vmlinux_name, "[kernel]", DSO_TYPE_KERNEL); dso__set_short_name(dso, short_name); So dso->short_name will point to "[kernel]", which is a const char *. > Similar problems exist with the usage of 'short_name' - it overloads > the field name which makes it somewhat confusing, and it's also > sometimes inconsistently named, such as 'name' in > dso__set_short_name(). > > Ditto for 'long_name' handling. > > Also, the 'sname_alloc' name sucks, it does not make it obvious that > it's related to 'short_name', hiding its true significance (and hiding > the broken life time handling of the flag/pointer combo). I'd rename > it to something more descriptive, like ->short_name_allocated - or I'd > rename everything to 'sname'/'lname' naming for short/long names. Ok, we can use rename it to short_name_alloc, like we have short_name_len. > Every time one runs into a crash like this it's a canary signal that > cleanliness principles need hardening. Hardening we go then! > Thanks, > > Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-12-10 13:49 ` Arnaldo Carvalho de Melo @ 2013-12-10 15:05 ` Ingo Molnar 0 siblings, 0 replies; 63+ messages in thread From: Ingo Molnar @ 2013-12-10 15:05 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: Adrian Hunter, linux-kernel, Andi Kleen, Ben Cheng, David Ahern, Dongsheng Yang, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt * Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote: > Em Tue, Dec 10, 2013 at 01:18:01PM +0100, Ingo Molnar escreveu: > > > > * Adrian Hunter <adrian.hunter@intel.com> wrote: > > > > > -void dso__set_short_name(struct dso *dso, const char *name) > > > +void dso__set_short_name(struct dso *dso, const char *name, bool sname_alloc) > > > { > > > if (name == NULL) > > > return; > > > + if (dso->sname_alloc) > > > + free((char *)dso->short_name); > > > + dso->sname_alloc = sname_alloc; > > > > Calling the function option the same as the field name is asking for > > trouble - I'd suggest 'new_sname_alloc' for the parameter, or so. > > > > And I'd also remove the 'const' from struct dso::short_name, it > > probably does not help code generation, because 'dso' is passed in as > > const in all the non-lifetime methods anyway. > > > That way the cast can be dropped from the free(). > > Not that simple, there are multiple places that pass a constant > short_name, for instance: > > machine__get_kernel() > kernel = dso__kernel_findnew(machine, vmlinux_name, > "[kernel]", DSO_TYPE_KERNEL); > dso__set_short_name(dso, short_name); > > So dso->short_name will point to "[kernel]", which is a const char *. Okay, I guess the free() cast is fine then. Thanks, Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* [GIT PULL 00/21] perf/core improvements and fixes
@ 2013-08-28 14:59 Arnaldo Carvalho de Melo
2013-08-29 10:04 ` Ingo Molnar
0 siblings, 1 reply; 63+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-08-28 14:59 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Adrian Hunter, Andi Kleen,
Borislav Petkov, David Ahern, Frederic Weisbecker, Jiri Olsa,
Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Stephane Eranian, Steven Rostedt, Arnaldo Carvalho de Melo
From: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Hi Ingo,
Please consider pulling, another batch, more to come soon,
- Arnaldo
The following changes since commit 5ec4c599a52362896c3e7c6a31ba6145dca9c6f5:
perf: Do not compute time values unnecessarily (2013-08-16 17:55:52 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo
for you to fetch changes up to 456da532a5fb04f8a79622df7dd49e84e04f31a8:
tools lib traceevent: Fixup jobserver setup (2013-08-27 11:05:55 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
. Don't install scripting files files when perl/python support is disabled.
. Support ! in -e expressions in 'perf trace', to filter a list of syscalls.
. Add --verbose and -o/--output options to 'perf trace'.
. Introduce better formatting of syscall arguments in 'perf trace',
including so far beautifiers for mmap, madvise, syscall return
values.
. Fixup jobserver setup in libtraceevent makefile.
. Debug improvements from Adrian Hunter.
. Try to increase the file descriptor limits on EMFILE, from Andi Kleen.
. Remove unused force option in 'perf kvm', from David Ahern.
. Make 'perf trace' command line arguments consistent with 'perf record',
from David Ahern.
. Fix correlation of samples coming after PERF_RECORD_EXIT event, from
David Ahern.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Adrian Hunter (3):
perf tools: Re-implement debug print function for linking python/perf.so
perf tools: Add debug prints
perf tools: Add pid to struct thread
Andi Kleen (1):
perf tools: Try to increase the file descriptor limits on EMFILE
Arnaldo Carvalho de Melo (14):
perf trace: Implement -o/--output filename
perf tools: Don't install scripting files files when disabled
perf trace: Support ! in -e expressions
perf trace: Add --verbose option
perf trace: Hide sys_exit messages about syscall id = -1
perf trace: Introduce syscall arg formatters
perf trace: Simplify sys_exit return printing
perf trace: Allow printing syscall return values in hex
perf trace: Add aliases to remaining syscalls of the sys_enter_newfoo
perf trace: Allow overiding the formatting of syscall fields
perf trace: Add beautifier for mmap prot parm
perf trace: Add beautifier for mmap flags parm
perf trace: Add beautifier for madvise behaviour/advice parm
tools lib traceevent: Fixup jobserver setup
David Ahern (3):
perf kvm: Remove force option to cmd_record
perf trace: Make command line arguments consistent with perf-record
perf tools: Sample after exit loses thread correlation
tools/lib/traceevent/Makefile | 2 +-
tools/perf/Documentation/perf-trace.txt | 16 ++
tools/perf/Makefile | 6 +-
tools/perf/builtin-kvm.c | 1 -
tools/perf/builtin-trace.c | 379 ++++++++++++++++++++++++++------
tools/perf/util/evlist.c | 3 +
tools/perf/util/evsel.c | 93 ++++++++
tools/perf/util/machine.c | 50 +++--
tools/perf/util/python.c | 20 ++
tools/perf/util/thread.c | 3 +-
tools/perf/util/thread.h | 8 +-
11 files changed, 488 insertions(+), 93 deletions(-)
^ permalink raw reply [flat|nested] 63+ messages in thread* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-08-28 14:59 Arnaldo Carvalho de Melo @ 2013-08-29 10:04 ` Ingo Molnar 0 siblings, 0 replies; 63+ messages in thread From: Ingo Molnar @ 2013-08-29 10:04 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: linux-kernel, Arnaldo Carvalho de Melo, Adrian Hunter, Andi Kleen, Borislav Petkov, David Ahern, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Stephane Eranian, Steven Rostedt, Arnaldo Carvalho de Melo * Arnaldo Carvalho de Melo <acme@infradead.org> wrote: > From: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> > > Hi Ingo, > > Please consider pulling, another batch, more to come soon, > > - Arnaldo > > The following changes since commit 5ec4c599a52362896c3e7c6a31ba6145dca9c6f5: > > perf: Do not compute time values unnecessarily (2013-08-16 17:55:52 +0200) > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo > > for you to fetch changes up to 456da532a5fb04f8a79622df7dd49e84e04f31a8: > > tools lib traceevent: Fixup jobserver setup (2013-08-27 11:05:55 -0300) > > ---------------------------------------------------------------- > perf/core improvements and fixes: > > . Don't install scripting files files when perl/python support is disabled. > > . Support ! in -e expressions in 'perf trace', to filter a list of syscalls. > > . Add --verbose and -o/--output options to 'perf trace'. > > . Introduce better formatting of syscall arguments in 'perf trace', > including so far beautifiers for mmap, madvise, syscall return > values. > > . Fixup jobserver setup in libtraceevent makefile. > > . Debug improvements from Adrian Hunter. > > . Try to increase the file descriptor limits on EMFILE, from Andi Kleen. > > . Remove unused force option in 'perf kvm', from David Ahern. > > . Make 'perf trace' command line arguments consistent with 'perf record', > from David Ahern. > > . Fix correlation of samples coming after PERF_RECORD_EXIT event, from > David Ahern. > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > > ---------------------------------------------------------------- > Adrian Hunter (3): > perf tools: Re-implement debug print function for linking python/perf.so > perf tools: Add debug prints > perf tools: Add pid to struct thread > > Andi Kleen (1): > perf tools: Try to increase the file descriptor limits on EMFILE > > Arnaldo Carvalho de Melo (14): > perf trace: Implement -o/--output filename > perf tools: Don't install scripting files files when disabled > perf trace: Support ! in -e expressions > perf trace: Add --verbose option > perf trace: Hide sys_exit messages about syscall id = -1 > perf trace: Introduce syscall arg formatters > perf trace: Simplify sys_exit return printing > perf trace: Allow printing syscall return values in hex > perf trace: Add aliases to remaining syscalls of the sys_enter_newfoo > perf trace: Allow overiding the formatting of syscall fields > perf trace: Add beautifier for mmap prot parm > perf trace: Add beautifier for mmap flags parm > perf trace: Add beautifier for madvise behaviour/advice parm > tools lib traceevent: Fixup jobserver setup > > David Ahern (3): > perf kvm: Remove force option to cmd_record > perf trace: Make command line arguments consistent with perf-record > perf tools: Sample after exit loses thread correlation > > tools/lib/traceevent/Makefile | 2 +- > tools/perf/Documentation/perf-trace.txt | 16 ++ > tools/perf/Makefile | 6 +- > tools/perf/builtin-kvm.c | 1 - > tools/perf/builtin-trace.c | 379 ++++++++++++++++++++++++++------ > tools/perf/util/evlist.c | 3 + > tools/perf/util/evsel.c | 93 ++++++++ > tools/perf/util/machine.c | 50 +++-- > tools/perf/util/python.c | 20 ++ > tools/perf/util/thread.c | 3 +- > tools/perf/util/thread.h | 8 +- > 11 files changed, 488 insertions(+), 93 deletions(-) Pulled, thanks a lot Arnaldo! Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* [GIT PULL 00/21] perf/core improvements and fixes
@ 2013-08-14 18:24 Arnaldo Carvalho de Melo
2013-08-15 7:52 ` Ingo Molnar
0 siblings, 1 reply; 63+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-08-14 18:24 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Adrian Hunter,
David Ahern, Frederic Weisbecker, Jiri Olsa, Mike Galbraith,
Namhyung Kim, Paul Mackerras, Peter Zijlstra, Runzhen Wang,
Stephane Eranian, Xiao Guangrong, Arnaldo Carvalho de Melo
From: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Hi Ingo,
Please consider pulling,
Flushing it out now before processing another batch.
- Arnaldo
The following changes since commit 0a3d23a2568ed5e73bd4fb532dc672fa9f03b1f1:
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2013-08-12 10:14:47 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo
for you to fetch changes up to 2ae3a312c0ccd8ff615372f00aab1700aac27474:
perf trace: Allow specifying which syscalls to trace (2013-08-14 11:44:21 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
. Allow specifying syscalls in 'perf trace', a la strace.
. Simplify symbol filtering by doing it at machine class level,
from Adrian Hunter.
. Add option to 'perf kvm' to print only events that exceed a specified time
duration, from David Ahern.
. 'perf sched' improvements, including removing some tracepoints that provide
the same information as the PERF_RECORD_{FORK,EXIT} events.
. Improve stack trace printing, from David Ahern.
. Update documentation with live command, from David Ahern
. Fix 'perf test' compile failure on do_sort_something, from David Ahern.
. Improve robustness of topology parsing code, from Stephane Eranian.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Adrian Hunter (8):
perf machine: Add symbol filter to struct machine
perf top: Set the machines symbol filter
perf report: Set the machines symbol filter
perf mem: Remove unused symbol filter member
perf annotate: Set the machines symbol filter
perf tools: Remove filter parameter of perf_event__preprocess_sample()
perf tools: Remove filter parameter of thread__find_addr_location()
perf tools: Remove filter parameter of thread__find_addr_map()
Arnaldo Carvalho de Melo (1):
perf trace: Allow specifying which syscalls to trace
David Ahern (11):
perf kvm: Option to print events that exceed a duration
perf kvm: Update documentation with live command
perf sched: Simplify arguments to read_events
perf sched: Remove thread lookup in sample handler
perf sched: Remove sched_process_exit tracepoint
perf sched: Remove sched_process_fork tracepoint
perf tool: Simplify options to perf_evsel__print_ip
perf evsel: Add option to print stack trace on single line
perf evsel: Add option to limit stack depth in callchain dumps
perf session: Change perf_session__has_traces to actually check for tracepoints
perf tests: Fix compile failure on do_sort_something
Stephane Eranian (1):
perf tools: Improve robustness of topology parsing code
tools/perf/Documentation/perf-kvm.txt | 46 +++++++++++++++-
tools/perf/Documentation/perf-trace.txt | 4 ++
tools/perf/builtin-annotate.c | 5 +-
tools/perf/builtin-diff.c | 2 +-
tools/perf/builtin-inject.c | 2 +-
tools/perf/builtin-kvm.c | 25 +++++++--
tools/perf/builtin-mem.c | 4 +-
tools/perf/builtin-report.c | 7 ++-
tools/perf/builtin-sched.c | 94 ++++++++++++++-------------------
tools/perf/builtin-script.c | 35 +++++++++---
tools/perf/builtin-top.c | 5 +-
tools/perf/builtin-trace.c | 52 +++++++++++++++---
tools/perf/perf.h | 3 ++
tools/perf/tests/code-reading.c | 13 +++--
tools/perf/tests/hists_link.c | 4 +-
tools/perf/util/build-id.c | 2 +-
tools/perf/util/event.c | 20 +++----
tools/perf/util/event.h | 3 +-
tools/perf/util/header.c | 11 ++--
tools/perf/util/machine.c | 28 ++++++++--
tools/perf/util/machine.h | 5 ++
tools/perf/util/session.c | 40 +++++++++-----
tools/perf/util/session.h | 8 ++-
tools/perf/util/thread.h | 5 +-
tools/perf/util/unwind.c | 6 +--
25 files changed, 294 insertions(+), 135 deletions(-)
^ permalink raw reply [flat|nested] 63+ messages in thread* Re: [GIT PULL 00/21] perf/core improvements and fixes 2013-08-14 18:24 Arnaldo Carvalho de Melo @ 2013-08-15 7:52 ` Ingo Molnar 0 siblings, 0 replies; 63+ messages in thread From: Ingo Molnar @ 2013-08-15 7:52 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: linux-kernel, Arnaldo Carvalho de Melo, Adrian Hunter, David Ahern, Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Runzhen Wang, Stephane Eranian, Xiao Guangrong, Arnaldo Carvalho de Melo * Arnaldo Carvalho de Melo <acme@infradead.org> wrote: > From: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> > > Hi Ingo, > > Please consider pulling, > > Flushing it out now before processing another batch. > > - Arnaldo > > The following changes since commit 0a3d23a2568ed5e73bd4fb532dc672fa9f03b1f1: > > Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2013-08-12 10:14:47 +0200) > > are available in the git repository at: > > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo > > for you to fetch changes up to 2ae3a312c0ccd8ff615372f00aab1700aac27474: > > perf trace: Allow specifying which syscalls to trace (2013-08-14 11:44:21 -0300) > > ---------------------------------------------------------------- > perf/core improvements and fixes: > > . Allow specifying syscalls in 'perf trace', a la strace. > > . Simplify symbol filtering by doing it at machine class level, > from Adrian Hunter. > > . Add option to 'perf kvm' to print only events that exceed a specified time > duration, from David Ahern. > > . 'perf sched' improvements, including removing some tracepoints that provide > the same information as the PERF_RECORD_{FORK,EXIT} events. > > . Improve stack trace printing, from David Ahern. > > . Update documentation with live command, from David Ahern > > . Fix 'perf test' compile failure on do_sort_something, from David Ahern. > > . Improve robustness of topology parsing code, from Stephane Eranian. > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > > ---------------------------------------------------------------- > Adrian Hunter (8): > perf machine: Add symbol filter to struct machine > perf top: Set the machines symbol filter > perf report: Set the machines symbol filter > perf mem: Remove unused symbol filter member > perf annotate: Set the machines symbol filter > perf tools: Remove filter parameter of perf_event__preprocess_sample() > perf tools: Remove filter parameter of thread__find_addr_location() > perf tools: Remove filter parameter of thread__find_addr_map() > > Arnaldo Carvalho de Melo (1): > perf trace: Allow specifying which syscalls to trace > > David Ahern (11): > perf kvm: Option to print events that exceed a duration > perf kvm: Update documentation with live command > perf sched: Simplify arguments to read_events > perf sched: Remove thread lookup in sample handler > perf sched: Remove sched_process_exit tracepoint > perf sched: Remove sched_process_fork tracepoint > perf tool: Simplify options to perf_evsel__print_ip > perf evsel: Add option to print stack trace on single line > perf evsel: Add option to limit stack depth in callchain dumps > perf session: Change perf_session__has_traces to actually check for tracepoints > perf tests: Fix compile failure on do_sort_something > > Stephane Eranian (1): > perf tools: Improve robustness of topology parsing code > > tools/perf/Documentation/perf-kvm.txt | 46 +++++++++++++++- > tools/perf/Documentation/perf-trace.txt | 4 ++ > tools/perf/builtin-annotate.c | 5 +- > tools/perf/builtin-diff.c | 2 +- > tools/perf/builtin-inject.c | 2 +- > tools/perf/builtin-kvm.c | 25 +++++++-- > tools/perf/builtin-mem.c | 4 +- > tools/perf/builtin-report.c | 7 ++- > tools/perf/builtin-sched.c | 94 ++++++++++++++------------------- > tools/perf/builtin-script.c | 35 +++++++++--- > tools/perf/builtin-top.c | 5 +- > tools/perf/builtin-trace.c | 52 +++++++++++++++--- > tools/perf/perf.h | 3 ++ > tools/perf/tests/code-reading.c | 13 +++-- > tools/perf/tests/hists_link.c | 4 +- > tools/perf/util/build-id.c | 2 +- > tools/perf/util/event.c | 20 +++---- > tools/perf/util/event.h | 3 +- > tools/perf/util/header.c | 11 ++-- > tools/perf/util/machine.c | 28 ++++++++-- > tools/perf/util/machine.h | 5 ++ > tools/perf/util/session.c | 40 +++++++++----- > tools/perf/util/session.h | 8 ++- > tools/perf/util/thread.h | 5 +- > tools/perf/util/unwind.c | 6 +-- > 25 files changed, 294 insertions(+), 135 deletions(-) Pulled, thanks Arnaldo! Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
* [GIT PULL 00/21] perf/core improvements and fixes
@ 2012-11-09 21:42 Arnaldo Carvalho de Melo
2012-11-12 2:10 ` Namhyung Kim
2012-11-13 18:11 ` Ingo Molnar
0 siblings, 2 replies; 63+ messages in thread
From: Arnaldo Carvalho de Melo @ 2012-11-09 21:42 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Andi Kleen, Corey Ashford,
David Ahern, Frederic Weisbecker, Irina Tirdea, Jiri Olsa,
Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra,
stable, Stephane Eranian, Steven Rostedt, Vinson Lee, Zheng Liu,
acme, Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling.
- Arnaldo
The following changes since commit 8dfec403e39b7c37fd6e8813bacc01da1e1210ab:
perf tests: Removing 'optional' field (2012-11-05 14:03:59 -0300)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo
for you to fetch changes up to 27f94d52394003d444a383eaf8d4824daf32432e:
tools lib traceevent: Use 'const' in variables pointing to const strings (2012-11-09 17:42:47 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
. Add a 'link' method for hists, so that we can have the leader with
buckets for all the entries in all the hists. This new method
is now used in the default 'diff' output, making the sum of the 'baseline'
column be 100%, eliminating blind spots. Now we need to use this
for 'diff' with > 2 perf.data files and for multi event 'report' and
'annotate'.
. libtraceevent fixes for compiler warnings trying to make perf it build
on some distros, like fedora 14, 32-bit, some of the warnings really
pointed to real bugs.
. Remove temp dir on failure in 'perf test', fix from Jiri Olsa.
. Fixes for handling data, stack mmaps, from Namhyung Kim.
. Fix live annotation bug related to recent objdump lookup patches, from
Namhyung Kim
. Don't try to follow jump target on PLT symbols in the annotation browser,
fix from Namhyung Kim.
. Fix leak on hist_entry delete, from Namhyung Kim.
. Fix a CPU_ALLOC related build error on builtin-test, from Zheng Liu.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Andi Kleen (1):
perf tools: Add arbitary aliases and support names with -
Arnaldo Carvalho de Melo (10):
perf diff: Start moving to support matching more than two hists
perf diff: Move hists__match to the hists lib
perf hists: Introduce hists__link
perf diff: Use hists__link when not pairing just with baseline
perf machine: Move more methods to machine.[ch]
tools lib traceevent: Add __maybe_unused to unused parameters
tools lib traceevent: Avoid comparisions between signed/unsigned
tools lib traceevent: No need to check for < 0 on an unsigned enum
tools lib traceevent: Handle INVALID_ARG_TYPE errno in pevent_strerror
tools lib traceevent: Use 'const' in variables pointing to const strings
Jiri Olsa (2):
perf tests: Move attr.py temp dir cleanup into finally section
perf tools: Add LIBDW_DIR Makefile variable to for alternate libdw
Namhyung Kim (7):
perf machine: Set kernel data mapping length
perf tools: Fix detection of stack area
perf hists: Free branch_info when freeing hist_entry
perf tools: Don't try to lookup objdump for live mode
perf annotate: Whitespace fixups
perf annotate: Don't try to follow jump target on PLT symbols
perf annotate: Merge same lines in summary view
Zheng Liu (1):
perf test: fix a build error on builtin-test
tools/lib/traceevent/event-parse.c | 22 ++--
tools/perf/Makefile | 12 ++-
tools/perf/arch/common.c | 7 ++
tools/perf/builtin-diff.c | 48 ++-------
tools/perf/tests/attr.py | 30 +++---
tools/perf/tests/builtin-test.c | 39 +++----
tools/perf/tests/dso-data.c | 1 +
tools/perf/ui/browsers/annotate.c | 12 +++
tools/perf/ui/hist.c | 10 +-
tools/perf/util/annotate.c | 69 ++++++++++--
tools/perf/util/annotate.h | 1 +
tools/perf/util/dso.c | 1 +
tools/perf/util/hist.c | 100 ++++++++++++++++++
tools/perf/util/hist.h | 3 +
tools/perf/util/machine.c | 205 ++++++++++++++++++++++++++++++++++--
tools/perf/util/machine.h | 131 ++++++++++++++++++++++-
tools/perf/util/map.c | 181 +------------------------------
tools/perf/util/map.h | 93 ----------------
tools/perf/util/parse-events.l | 2 +
tools/perf/util/session.h | 5 +-
tools/perf/util/sort.h | 27 ++++-
tools/perf/util/symbol.c | 1 +
tools/perf/util/symbol.h | 20 ----
23 files changed, 604 insertions(+), 416 deletions(-)
^ permalink raw reply [flat|nested] 63+ messages in thread* Re: [GIT PULL 00/21] perf/core improvements and fixes 2012-11-09 21:42 Arnaldo Carvalho de Melo @ 2012-11-12 2:10 ` Namhyung Kim 2012-11-12 13:55 ` Jiri Olsa 2012-11-13 18:11 ` Ingo Molnar 1 sibling, 1 reply; 63+ messages in thread From: Namhyung Kim @ 2012-11-12 2:10 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: Ingo Molnar, linux-kernel, Andi Kleen, Corey Ashford, David Ahern, Frederic Weisbecker, Irina Tirdea, Jiri Olsa, Mike Galbraith, Paul Mackerras, Peter Zijlstra, stable, Stephane Eranian, Steven Rostedt, Vinson Lee, Zheng Liu, acme, Arnaldo Carvalho de Melo Hi Arnaldo, On Fri, 9 Nov 2012 18:42:49 -0300, Arnaldo Carvalho de Melo wrote: > Hi Ingo, > > Please consider pulling. > > - Arnaldo > > The following changes since commit 8dfec403e39b7c37fd6e8813bacc01da1e1210ab: > > perf tests: Removing 'optional' field (2012-11-05 14:03:59 -0300) > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo > > for you to fetch changes up to 27f94d52394003d444a383eaf8d4824daf32432e: > > tools lib traceevent: Use 'const' in variables pointing to const strings (2012-11-09 17:42:47 -0300) > > ---------------------------------------------------------------- > perf/core improvements and fixes: > > . Add a 'link' method for hists, so that we can have the leader with > buckets for all the entries in all the hists. This new method > is now used in the default 'diff' output, making the sum of the 'baseline' > column be 100%, eliminating blind spots. Now we need to use this > for 'diff' with > 2 perf.data files and for multi event 'report' and > 'annotate'. I'm not sure it can be used for group report at least in its current form. IIUC it connects multiple hist entries using a list head and create a dummy entry in the leader if need be. But it didn't handle non-leader entries so it's hard to tell which is which if less entries are present only. For example consider following case: leader member1 member2 A A A B C D where leader, member1 and member2 are evsel/hists and A, B, C and D are hist entries. After 'linking' the entries the leader will have following linkage: leader A -> A -> A B C (dummy) -> C D (dummy) -> D In this case, for entry A the leader can determine which entry came from which hists by looking its order in the list. For entry B the leader can use zero value for them since the list is empty. However for entries C and D, it cannot know which one is the right hists unless it records a hist index or creates dummy entry and insert it in a correct order (looks far from an optimal solution). Am I missing something? Thanks, Namhyung ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2012-11-12 2:10 ` Namhyung Kim @ 2012-11-12 13:55 ` Jiri Olsa 2012-11-12 16:01 ` Arnaldo Carvalho de Melo 0 siblings, 1 reply; 63+ messages in thread From: Jiri Olsa @ 2012-11-12 13:55 UTC (permalink / raw) To: Namhyung Kim Cc: Arnaldo Carvalho de Melo, Ingo Molnar, linux-kernel, Andi Kleen, Corey Ashford, David Ahern, Frederic Weisbecker, Irina Tirdea, Mike Galbraith, Paul Mackerras, Peter Zijlstra, stable, Stephane Eranian, Steven Rostedt, Vinson Lee, Zheng Liu, acme, Arnaldo Carvalho de Melo On Mon, Nov 12, 2012 at 11:10:52AM +0900, Namhyung Kim wrote: > Hi Arnaldo, > > On Fri, 9 Nov 2012 18:42:49 -0300, Arnaldo Carvalho de Melo wrote: > > Hi Ingo, > > > > Please consider pulling. > > > > - Arnaldo > > > > The following changes since commit 8dfec403e39b7c37fd6e8813bacc01da1e1210ab: > > > > perf tests: Removing 'optional' field (2012-11-05 14:03:59 -0300) > > > > are available in the git repository at: > > > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo > > > > for you to fetch changes up to 27f94d52394003d444a383eaf8d4824daf32432e: > > > > tools lib traceevent: Use 'const' in variables pointing to const strings (2012-11-09 17:42:47 -0300) > > > > ---------------------------------------------------------------- > > perf/core improvements and fixes: > > > > . Add a 'link' method for hists, so that we can have the leader with > > buckets for all the entries in all the hists. This new method > > is now used in the default 'diff' output, making the sum of the 'baseline' > > column be 100%, eliminating blind spots. Now we need to use this > > for 'diff' with > 2 perf.data files and for multi event 'report' and > > 'annotate'. > > I'm not sure it can be used for group report at least in its current > form. IIUC it connects multiple hist entries using a list head and > create a dummy entry in the leader if need be. But it didn't handle > non-leader entries so it's hard to tell which is which if less entries > are present only. For example consider following case: > > leader member1 member2 > A A A > B > C > D > > where leader, member1 and member2 are evsel/hists and A, B, C and D are > hist entries. After 'linking' the entries the leader will have > following linkage: > > leader > A -> A -> A > B > C (dummy) -> C > D (dummy) -> D > > In this case, for entry A the leader can determine which entry came from > which hists by looking its order in the list. For entry B the leader > can use zero value for them since the list is empty. However for > entries C and D, it cannot know which one is the right hists unless it > records a hist index or creates dummy entry and insert it in a correct > order (looks far from an optimal solution). Am I missing something? there's hists pointer in hist_entry if that's what you look for jirka ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2012-11-12 13:55 ` Jiri Olsa @ 2012-11-12 16:01 ` Arnaldo Carvalho de Melo 2012-11-13 1:20 ` Namhyung Kim 0 siblings, 1 reply; 63+ messages in thread From: Arnaldo Carvalho de Melo @ 2012-11-12 16:01 UTC (permalink / raw) To: Jiri Olsa Cc: Namhyung Kim, Ingo Molnar, linux-kernel, Andi Kleen, Corey Ashford, David Ahern, Frederic Weisbecker, Irina Tirdea, Mike Galbraith, Paul Mackerras, Peter Zijlstra, stable, Stephane Eranian, Steven Rostedt, Vinson Lee, Zheng Liu Em Mon, Nov 12, 2012 at 02:55:46PM +0100, Jiri Olsa escreveu: > On Mon, Nov 12, 2012 at 11:10:52AM +0900, Namhyung Kim wrote: > > On Fri, 9 Nov 2012 18:42:49 -0300, Arnaldo Carvalho de Melo wrote: > > > . Add a 'link' method for hists, so that we can have the leader with > > > buckets for all the entries in all the hists. This new method > > > is now used in the default 'diff' output, making the sum of the 'baseline' > > > column be 100%, eliminating blind spots. Now we need to use this > > > for 'diff' with > 2 perf.data files and for multi event 'report' and > > > 'annotate'. > > I'm not sure it can be used for group report at least in its current > > form. IIUC it connects multiple hist entries using a list head and > > create a dummy entry in the leader if need be. But it didn't handle > > non-leader entries so it's hard to tell which is which if less entries > > are present only. For example consider following case: > > leader member1 member2 > > A A A > > B > > C > > D > > where leader, member1 and member2 are evsel/hists and A, B, C and D are > > hist entries. After 'linking' the entries the leader will have > > following linkage: > > leader > > A -> A -> A > > B > > C (dummy) -> C > > D (dummy) -> D > > In this case, for entry A the leader can determine which entry came from > > which hists by looking its order in the list. For entry B the leader > > can use zero value for them since the list is empty. However for > > entries C and D, it cannot know which one is the right hists unless it > > records a hist index or creates dummy entry and insert it in a correct > > order (looks far from an optimal solution). Am I missing something? > there's hists pointer in hist_entry if that's what you look for And from there to evsel->idx. In your patchset you even introduce hists_2_evsel(), right? - Arnaldo ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2012-11-12 16:01 ` Arnaldo Carvalho de Melo @ 2012-11-13 1:20 ` Namhyung Kim 0 siblings, 0 replies; 63+ messages in thread From: Namhyung Kim @ 2012-11-13 1:20 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: Jiri Olsa, Ingo Molnar, linux-kernel, Andi Kleen, Corey Ashford, David Ahern, Frederic Weisbecker, Irina Tirdea, Mike Galbraith, Paul Mackerras, Peter Zijlstra, stable, Stephane Eranian, Steven Rostedt, Vinson Lee, Zheng Liu On Mon, 12 Nov 2012 13:01:39 -0300, Arnaldo Carvalho de Melo wrote: > Em Mon, Nov 12, 2012 at 02:55:46PM +0100, Jiri Olsa escreveu: >> On Mon, Nov 12, 2012 at 11:10:52AM +0900, Namhyung Kim wrote: >> > On Fri, 9 Nov 2012 18:42:49 -0300, Arnaldo Carvalho de Melo wrote: >> > > . Add a 'link' method for hists, so that we can have the leader with >> > > buckets for all the entries in all the hists. This new method >> > > is now used in the default 'diff' output, making the sum of the 'baseline' >> > > column be 100%, eliminating blind spots. Now we need to use this >> > > for 'diff' with > 2 perf.data files and for multi event 'report' and >> > > 'annotate'. > >> > I'm not sure it can be used for group report at least in its current >> > form. IIUC it connects multiple hist entries using a list head and >> > create a dummy entry in the leader if need be. But it didn't handle >> > non-leader entries so it's hard to tell which is which if less entries >> > are present only. For example consider following case: > >> > leader member1 member2 >> > A A A >> > B >> > C >> > D > >> > where leader, member1 and member2 are evsel/hists and A, B, C and D are >> > hist entries. After 'linking' the entries the leader will have >> > following linkage: > >> > leader >> > A -> A -> A >> > B >> > C (dummy) -> C >> > D (dummy) -> D > >> > In this case, for entry A the leader can determine which entry came from >> > which hists by looking its order in the list. For entry B the leader >> > can use zero value for them since the list is empty. However for >> > entries C and D, it cannot know which one is the right hists unless it >> > records a hist index or creates dummy entry and insert it in a correct >> > order (looks far from an optimal solution). Am I missing something? > >> there's hists pointer in hist_entry if that's what you look for > > And from there to evsel->idx. In your patchset you even introduce > hists_2_evsel(), right? Ah, okay. I worried about a possiblity of non-consecutive event groups for some reason, but that's not gonna happen in the future? Thanks, Namhyung ^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [GIT PULL 00/21] perf/core improvements and fixes 2012-11-09 21:42 Arnaldo Carvalho de Melo 2012-11-12 2:10 ` Namhyung Kim @ 2012-11-13 18:11 ` Ingo Molnar 1 sibling, 0 replies; 63+ messages in thread From: Ingo Molnar @ 2012-11-13 18:11 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: linux-kernel, Andi Kleen, Corey Ashford, David Ahern, Frederic Weisbecker, Irina Tirdea, Jiri Olsa, Mike Galbraith, Namhyung Kim, Paul Mackerras, Peter Zijlstra, stable, Stephane Eranian, Steven Rostedt, Vinson Lee, Zheng Liu, acme, Arnaldo Carvalho de Melo * Arnaldo Carvalho de Melo <acme@infradead.org> wrote: > Hi Ingo, > > Please consider pulling. > > - Arnaldo > > The following changes since commit 8dfec403e39b7c37fd6e8813bacc01da1e1210ab: > > perf tests: Removing 'optional' field (2012-11-05 14:03:59 -0300) > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux tags/perf-core-for-mingo > > for you to fetch changes up to 27f94d52394003d444a383eaf8d4824daf32432e: > > tools lib traceevent: Use 'const' in variables pointing to const strings (2012-11-09 17:42:47 -0300) > > ---------------------------------------------------------------- > perf/core improvements and fixes: > > . Add a 'link' method for hists, so that we can have the leader with > buckets for all the entries in all the hists. This new method > is now used in the default 'diff' output, making the sum of the 'baseline' > column be 100%, eliminating blind spots. Now we need to use this > for 'diff' with > 2 perf.data files and for multi event 'report' and > 'annotate'. > > . libtraceevent fixes for compiler warnings trying to make perf it build > on some distros, like fedora 14, 32-bit, some of the warnings really > pointed to real bugs. > > . Remove temp dir on failure in 'perf test', fix from Jiri Olsa. > > . Fixes for handling data, stack mmaps, from Namhyung Kim. > > . Fix live annotation bug related to recent objdump lookup patches, from > Namhyung Kim > > . Don't try to follow jump target on PLT symbols in the annotation browser, > fix from Namhyung Kim. > > . Fix leak on hist_entry delete, from Namhyung Kim. > > . Fix a CPU_ALLOC related build error on builtin-test, from Zheng Liu. > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > > ---------------------------------------------------------------- > Andi Kleen (1): > perf tools: Add arbitary aliases and support names with - > > Arnaldo Carvalho de Melo (10): > perf diff: Start moving to support matching more than two hists > perf diff: Move hists__match to the hists lib > perf hists: Introduce hists__link > perf diff: Use hists__link when not pairing just with baseline > perf machine: Move more methods to machine.[ch] > tools lib traceevent: Add __maybe_unused to unused parameters > tools lib traceevent: Avoid comparisions between signed/unsigned > tools lib traceevent: No need to check for < 0 on an unsigned enum > tools lib traceevent: Handle INVALID_ARG_TYPE errno in pevent_strerror > tools lib traceevent: Use 'const' in variables pointing to const strings > > Jiri Olsa (2): > perf tests: Move attr.py temp dir cleanup into finally section > perf tools: Add LIBDW_DIR Makefile variable to for alternate libdw > > Namhyung Kim (7): > perf machine: Set kernel data mapping length > perf tools: Fix detection of stack area > perf hists: Free branch_info when freeing hist_entry > perf tools: Don't try to lookup objdump for live mode > perf annotate: Whitespace fixups > perf annotate: Don't try to follow jump target on PLT symbols > perf annotate: Merge same lines in summary view > > Zheng Liu (1): > perf test: fix a build error on builtin-test > > tools/lib/traceevent/event-parse.c | 22 ++-- > tools/perf/Makefile | 12 ++- > tools/perf/arch/common.c | 7 ++ > tools/perf/builtin-diff.c | 48 ++------- > tools/perf/tests/attr.py | 30 +++--- > tools/perf/tests/builtin-test.c | 39 +++---- > tools/perf/tests/dso-data.c | 1 + > tools/perf/ui/browsers/annotate.c | 12 +++ > tools/perf/ui/hist.c | 10 +- > tools/perf/util/annotate.c | 69 ++++++++++-- > tools/perf/util/annotate.h | 1 + > tools/perf/util/dso.c | 1 + > tools/perf/util/hist.c | 100 ++++++++++++++++++ > tools/perf/util/hist.h | 3 + > tools/perf/util/machine.c | 205 ++++++++++++++++++++++++++++++++++-- > tools/perf/util/machine.h | 131 ++++++++++++++++++++++- > tools/perf/util/map.c | 181 +------------------------------ > tools/perf/util/map.h | 93 ---------------- > tools/perf/util/parse-events.l | 2 + > tools/perf/util/session.h | 5 +- > tools/perf/util/sort.h | 27 ++++- > tools/perf/util/symbol.c | 1 + > tools/perf/util/symbol.h | 20 ---- > 23 files changed, 604 insertions(+), 416 deletions(-) Pulled, thanks Arnaldo! Ingo ^ permalink raw reply [flat|nested] 63+ messages in thread
end of thread, other threads:[~2018-08-23 8:31 UTC | newest] Thread overview: 63+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-01-30 14:46 [GIT PULL 00/21] perf/core improvements and fixes Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 01/21] tools lib traceevent: Handle dynamic array's element size properly Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 02/21] perf tools: Stop using 'self' in strlist Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 03/21] perf tools: Stop using 'self' in map.[ch] Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 04/21] perf tools: Use memdup in map__clone Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 05/21] perf kmem: Use memdup() Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 06/21] perf header: Stop using die() calls when processing tracing data Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 07/21] perf ui browser: Free browser->helpline() on ui_browser__hide() Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 08/21] perf tests: Call machine__exit in the vmlinux matches kallsyms test Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 09/21] perf tests: Fix leaks on PERF_RECORD_* test Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 10/21] tools: Correct typo in tools Makefile Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 11/21] perf: Add 'perf bench numa mem' NUMA performance measurement suite Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 12/21] perf tools: Make numa benchmark optional Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 13/21] perf evsel: Add prev_raw_count field Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 14/21] perf stat: Add interval printing Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 15/21] perf evsel: Fix memory leaks on evsel->counts Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 16/21] perf tools, powerpc: Fix compile warnings in tests/attr.c Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 17/21] perf tools: Fix possible double free on error Arnaldo Carvalho de Melo 2013-01-30 14:46 ` [PATCH 18/21] perf sort: Use pclose() instead of fclose() on pipe stream Arnaldo Carvalho de Melo 2013-01-30 14:47 ` [PATCH 19/21] perf tools: Fix memory leak on error Arnaldo Carvalho de Melo 2013-01-30 14:47 ` [PATCH 20/21] perf header: Fix memory leak for the "Not caching a kptr_restrict'ed /proc/kallsyms" case Arnaldo Carvalho de Melo 2013-01-30 14:47 ` [PATCH 21/21] perf header: Fix double fclose() on do_write(fd, xxx) failure Arnaldo Carvalho de Melo 2013-01-31 9:27 ` [GIT PULL 00/21] perf/core improvements and fixes Ingo Molnar -- strict thread matches above, loose matches on Subject: below -- 2018-08-20 16:15 Arnaldo Carvalho de Melo 2018-08-23 8:31 ` Ingo Molnar 2018-08-01 21:36 Arnaldo Carvalho de Melo 2018-08-02 8:03 ` Ingo Molnar 2018-02-06 16:53 Arnaldo Carvalho de Melo 2015-05-04 21:36 Arnaldo Carvalho de Melo 2015-02-11 21:08 Arnaldo Carvalho de Melo 2015-03-05 4:30 ` Victor Kamensky 2015-03-05 6:37 ` Ingo Molnar 2015-03-05 6:49 ` Victor Kamensky 2013-12-09 19:36 Arnaldo Carvalho de Melo 2013-12-10 11:07 ` Ingo Molnar 2013-12-10 15:47 ` Jiri Olsa 2013-12-10 15:49 ` Ingo Molnar 2013-12-10 11:12 ` Ingo Molnar 2013-12-10 11:44 ` Arnaldo Carvalho de Melo 2013-12-10 11:47 ` Ingo Molnar 2013-12-10 12:01 ` Arnaldo Carvalho de Melo 2013-12-10 12:07 ` Ingo Molnar 2013-12-10 12:13 ` Adrian Hunter 2013-12-10 12:10 ` Arnaldo Carvalho de Melo 2013-12-10 12:22 ` Adrian Hunter 2013-12-10 12:22 ` Arnaldo Carvalho de Melo 2013-12-10 12:23 ` Arnaldo Carvalho de Melo 2013-12-10 12:24 ` Ingo Molnar 2013-12-10 12:18 ` Ingo Molnar 2013-12-10 12:46 ` Ingo Molnar 2013-12-10 13:29 ` Arnaldo Carvalho de Melo 2013-12-10 13:49 ` Arnaldo Carvalho de Melo 2013-12-10 15:05 ` Ingo Molnar 2013-08-28 14:59 Arnaldo Carvalho de Melo 2013-08-29 10:04 ` Ingo Molnar 2013-08-14 18:24 Arnaldo Carvalho de Melo 2013-08-15 7:52 ` Ingo Molnar 2012-11-09 21:42 Arnaldo Carvalho de Melo 2012-11-12 2:10 ` Namhyung Kim 2012-11-12 13:55 ` Jiri Olsa 2012-11-12 16:01 ` Arnaldo Carvalho de Melo 2012-11-13 1:20 ` Namhyung Kim 2012-11-13 18:11 ` Ingo Molnar
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).