* [PATCH 1/5] perf symbols: pass the offset to perf_header__read_build_ids
@ 2009-11-16 18:32 Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 2/5] perf tools: debug.h needs to include event.h for event_t Arnaldo Carvalho de Melo
2009-11-16 21:09 ` [tip:perf/core] perf symbols: Pass the offset to perf_header__read_build_ids() tip-bot for Arnaldo Carvalho de Melo
0 siblings, 2 replies; 20+ messages in thread
From: Arnaldo Carvalho de Melo @ 2009-11-16 18:32 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Frederic Weisbecker,
Mike Galbraith, Paul Mackerras, Peter Zijlstra
From: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/data_map.c | 3 +--
tools/perf/util/data_map.h | 2 +-
| 2 +-
3 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/tools/perf/util/data_map.c b/tools/perf/util/data_map.c
index aacb814..14cb846 100644
--- a/tools/perf/util/data_map.c
+++ b/tools/perf/util/data_map.c
@@ -70,11 +70,10 @@ process_event(event_t *event, unsigned long offset, unsigned long head)
}
}
-int perf_header__read_build_ids(int input, off_t size)
+int perf_header__read_build_ids(int input, off_t offset, off_t size)
{
struct build_id_event bev;
char filename[PATH_MAX];
- off_t offset = lseek(input, 0, SEEK_CUR);
off_t limit = offset + size;
int err = -1;
diff --git a/tools/perf/util/data_map.h b/tools/perf/util/data_map.h
index 20b4037..ae036ec 100644
--- a/tools/perf/util/data_map.h
+++ b/tools/perf/util/data_map.h
@@ -27,6 +27,6 @@ int mmap_dispatch_perf_file(struct perf_header **pheader,
int full_paths,
int *cwdlen,
char **cwd);
-int perf_header__read_build_ids(int input, off_t file_size);
+int perf_header__read_build_ids(int input, off_t offset, off_t file_size);
#endif
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index ebed4f4..ca0d657 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -359,7 +359,7 @@ static void perf_header__adds_read(struct perf_header *self, int fd)
buildid_sec = &feat_sec[idx++];
lseek(fd, buildid_sec->offset, SEEK_SET);
- if (perf_header__read_build_ids(fd, buildid_sec->size))
+ if (perf_header__read_build_ids(fd, buildid_sec->offset, buildid_sec->size))
pr_debug("failed to read buildids, continuing...\n");
}
--
1.6.2.5
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 2/5] perf tools: debug.h needs to include event.h for event_t
2009-11-16 18:32 [PATCH 1/5] perf symbols: pass the offset to perf_header__read_build_ids Arnaldo Carvalho de Melo
@ 2009-11-16 18:32 ` Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 3/5] perf tools: Generalize perf_header__adds_read Arnaldo Carvalho de Melo
2009-11-16 21:10 ` [tip:perf/core] perf tools: Debug.h needs to include event.h for event_t tip-bot for Arnaldo Carvalho de Melo
2009-11-16 21:09 ` [tip:perf/core] perf symbols: Pass the offset to perf_header__read_build_ids() tip-bot for Arnaldo Carvalho de Melo
1 sibling, 2 replies; 20+ messages in thread
From: Arnaldo Carvalho de Melo @ 2009-11-16 18:32 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Frederic Weisbecker,
Mike Galbraith, Paul Mackerras, Peter Zijlstra
From: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/debug.h | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/tools/perf/util/debug.h b/tools/perf/util/debug.h
index e8b18a1..c6c24c5 100644
--- a/tools/perf/util/debug.h
+++ b/tools/perf/util/debug.h
@@ -2,6 +2,8 @@
#ifndef __PERF_DEBUG_H
#define __PERF_DEBUG_H
+#include "event.h"
+
extern int verbose;
extern int dump_trace;
--
1.6.2.5
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 3/5] perf tools: Generalize perf_header__adds_read
2009-11-16 18:32 ` [PATCH 2/5] perf tools: debug.h needs to include event.h for event_t Arnaldo Carvalho de Melo
@ 2009-11-16 18:32 ` Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 4/5] perf tools: Introduce dsos__fprintf_buildid Arnaldo Carvalho de Melo
` (2 more replies)
2009-11-16 21:10 ` [tip:perf/core] perf tools: Debug.h needs to include event.h for event_t tip-bot for Arnaldo Carvalho de Melo
1 sibling, 3 replies; 20+ messages in thread
From: Arnaldo Carvalho de Melo @ 2009-11-16 18:32 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Frederic Weisbecker,
Mike Galbraith, Paul Mackerras, Peter Zijlstra
From: Arnaldo Carvalho de Melo <acme@redhat.com>
Renaming it to perf_header__process_sections and passing a callback to
handle each feature.
The next changesets will introduce 'perf buildid-list' that will handle
just the HEADER_BUILD_ID table, ignoring all the other features.
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
| 123 ++++++++++++++++++++++++++--------------------
| 31 +++++++++++-
2 files changed, 98 insertions(+), 56 deletions(-)
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index ca0d657..d8416f0 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -128,26 +128,11 @@ static const char *__perf_magic = "PERFFILE";
#define PERF_MAGIC (*(u64 *)__perf_magic)
-struct perf_file_section {
- u64 offset;
- u64 size;
-};
-
struct perf_file_attr {
struct perf_event_attr attr;
struct perf_file_section ids;
};
-struct perf_file_header {
- u64 magic;
- u64 size;
- u64 attr_size;
- struct perf_file_section attrs;
- struct perf_file_section data;
- struct perf_file_section event_types;
- DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
-};
-
void perf_header__set_feat(struct perf_header *self, int feat)
{
set_bit(feat, self->adds_features);
@@ -324,21 +309,23 @@ static void do_read(int fd, void *buf, size_t size)
}
}
-static void perf_header__adds_read(struct perf_header *self, int fd)
+int perf_header__process_sections(struct perf_header *self, int fd,
+ int (*process)(struct perf_file_section *self,
+ int feat, int fd))
{
struct perf_file_section *feat_sec;
int nr_sections;
int sec_size;
int idx = 0;
-
+ int err = 0, feat = 1;
nr_sections = bitmap_weight(self->adds_features, HEADER_FEAT_BITS);
if (!nr_sections)
- return;
+ return 0;
feat_sec = calloc(sizeof(*feat_sec), nr_sections);
if (!feat_sec)
- die("No memory");
+ return -1;
sec_size = sizeof(*feat_sec) * nr_sections;
@@ -346,25 +333,73 @@ static void perf_header__adds_read(struct perf_header *self, int fd)
do_read(fd, feat_sec, sec_size);
- if (perf_header__has_feat(self, HEADER_TRACE_INFO)) {
- struct perf_file_section *trace_sec;
+ while (idx < nr_sections && feat < HEADER_LAST_FEATURE) {
+ if (perf_header__has_feat(self, feat)) {
+ struct perf_file_section *sec = &feat_sec[idx++];
- trace_sec = &feat_sec[idx++];
- lseek(fd, trace_sec->offset, SEEK_SET);
- trace_report(fd);
+ err = process(sec, feat, fd);
+ if (err < 0)
+ break;
+ }
+ ++feat;
}
- if (perf_header__has_feat(self, HEADER_BUILD_ID)) {
- struct perf_file_section *buildid_sec;
+ free(feat_sec);
+ return err;
+};
- buildid_sec = &feat_sec[idx++];
- lseek(fd, buildid_sec->offset, SEEK_SET);
- if (perf_header__read_build_ids(fd, buildid_sec->offset, buildid_sec->size))
- pr_debug("failed to read buildids, continuing...\n");
+int perf_file_header__read(struct perf_file_header *self,
+ struct perf_header *ph, int fd)
+{
+ lseek(fd, 0, SEEK_SET);
+ do_read(fd, self, sizeof(*self));
+
+ if (self->magic != PERF_MAGIC ||
+ self->attr_size != sizeof(struct perf_file_attr))
+ return -1;
+
+ if (self->size != sizeof(*self)) {
+ /* Support the previous format */
+ if (self->size == offsetof(typeof(*self), adds_features))
+ bitmap_zero(self->adds_features, HEADER_FEAT_BITS);
+ else
+ return -1;
}
- free(feat_sec);
-};
+ memcpy(&ph->adds_features, &self->adds_features,
+ sizeof(self->adds_features));
+
+ ph->event_offset = self->event_types.offset;
+ ph->event_size = self->event_types.size;
+ ph->data_offset = self->data.offset;
+ ph->data_size = self->data.size;
+ return 0;
+}
+
+static int perf_file_section__process(struct perf_file_section *self,
+ int feat, int fd)
+{
+ if (lseek(fd, self->offset, SEEK_SET) < 0) {
+ pr_debug("Failed to lseek to %Ld offset for feature %d, "
+ "continuing...\n", self->offset, feat);
+ return 0;
+ }
+
+ switch (feat) {
+ case HEADER_TRACE_INFO:
+ trace_report(fd);
+ break;
+
+ case HEADER_BUILD_ID:
+ if (perf_header__read_build_ids(fd, self->offset, self->size))
+ pr_debug("Failed to read buildids, continuing...\n");
+ break;
+ default:
+ pr_debug("unknown feature %d, continuing...\n", feat);
+ }
+
+ return 0;
+}
struct perf_header *perf_header__read(int fd)
{
@@ -372,23 +407,11 @@ struct perf_header *perf_header__read(int fd)
struct perf_file_header f_header;
struct perf_file_attr f_attr;
u64 f_id;
-
int nr_attrs, nr_ids, i, j;
- lseek(fd, 0, SEEK_SET);
- do_read(fd, &f_header, sizeof(f_header));
-
- if (f_header.magic != PERF_MAGIC ||
- f_header.attr_size != sizeof(f_attr))
+ if (perf_file_header__read(&f_header, self, fd) < 0)
die("incompatible file format");
- if (f_header.size != sizeof(f_header)) {
- /* Support the previous format */
- if (f_header.size == offsetof(typeof(f_header), adds_features))
- bitmap_zero(f_header.adds_features, HEADER_FEAT_BITS);
- else
- die("incompatible file format");
- }
nr_attrs = f_header.attrs.size / sizeof(f_attr);
lseek(fd, f_header.attrs.offset, SEEK_SET);
@@ -422,15 +445,7 @@ struct perf_header *perf_header__read(int fd)
event_count = f_header.event_types.size / sizeof(struct perf_trace_event_type);
}
- memcpy(&self->adds_features, &f_header.adds_features, sizeof(f_header.adds_features));
-
- self->event_offset = f_header.event_types.offset;
- self->event_size = f_header.event_types.size;
-
- self->data_offset = f_header.data.offset;
- self->data_size = f_header.data.size;
-
- perf_header__adds_read(self, fd);
+ perf_header__process_sections(self, fd, perf_file_section__process);
lseek(fd, self->data_offset, SEEK_SET);
--git a/tools/perf/util/header.h b/tools/perf/util/header.h
index a22d70b..f1b3bf7 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -15,11 +15,34 @@ struct perf_header_attr {
off_t id_offset;
};
-#define HEADER_TRACE_INFO 1
-#define HEADER_BUILD_ID 2
+enum {
+ HEADER_TRACE_INFO = 1,
+ HEADER_BUILD_ID,
+ HEADER_LAST_FEATURE,
+};
#define HEADER_FEAT_BITS 256
+struct perf_file_section {
+ u64 offset;
+ u64 size;
+};
+
+struct perf_file_header {
+ u64 magic;
+ u64 size;
+ u64 attr_size;
+ struct perf_file_section attrs;
+ struct perf_file_section data;
+ struct perf_file_section event_types;
+ DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
+};
+
+struct perf_header;
+
+int perf_file_header__read(struct perf_file_header *self,
+ struct perf_header *ph, int fd);
+
struct perf_header {
int frozen;
int attrs, size;
@@ -54,4 +77,8 @@ bool perf_header__has_feat(const struct perf_header *self, int feat);
struct perf_header *perf_header__new(void);
+int perf_header__process_sections(struct perf_header *self, int fd,
+ int (*process)(struct perf_file_section *self,
+ int feat, int fd));
+
#endif /* __PERF_HEADER_H */
--
1.6.2.5
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 4/5] perf tools: Introduce dsos__fprintf_buildid
2009-11-16 18:32 ` [PATCH 3/5] perf tools: Generalize perf_header__adds_read Arnaldo Carvalho de Melo
@ 2009-11-16 18:32 ` Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 5/5] perf buildid-list: New plumbing command Arnaldo Carvalho de Melo
2009-11-16 21:10 ` [tip:perf/core] perf tools: Introduce dsos__fprintf_buildid tip-bot for Arnaldo Carvalho de Melo
2009-11-16 19:02 ` [PATCH 3/5] perf tools: Generalize perf_header__adds_read Frederic Weisbecker
2009-11-16 21:10 ` [tip:perf/core] perf tools: Generalize perf_header__adds_read() tip-bot for Arnaldo Carvalho de Melo
2 siblings, 2 replies; 20+ messages in thread
From: Arnaldo Carvalho de Melo @ 2009-11-16 18:32 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Frederic Weisbecker,
Mike Galbraith, Paul Mackerras, Peter Zijlstra
From: Arnaldo Carvalho de Melo <acme@redhat.com>
To print the buildids in the list of dsos. Will be used by 'perf
buildid-list'
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/symbol.c | 30 ++++++++++++++++++++++++++----
tools/perf/util/symbol.h | 2 ++
2 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 93e4b52..53de9c4 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -212,14 +212,21 @@ int build_id__sprintf(u8 *self, int len, char *bf)
return raw - self;
}
-size_t dso__fprintf(struct dso *self, FILE *fp)
+size_t dso__fprintf_buildid(struct dso *self, FILE *fp)
{
char sbuild_id[BUILD_ID_SIZE * 2 + 1];
- struct rb_node *nd;
- size_t ret;
build_id__sprintf(self->build_id, sizeof(self->build_id), sbuild_id);
- ret = fprintf(fp, "dso: %s (%s)\n", self->short_name, sbuild_id);
+ return fprintf(fp, "%s", sbuild_id);
+}
+
+size_t dso__fprintf(struct dso *self, FILE *fp)
+{
+ struct rb_node *nd;
+ size_t ret = fprintf(fp, "dso: %s (", self->short_name);
+
+ ret += dso__fprintf_buildid(self, fp);
+ ret += fprintf(fp, ")\n");
for (nd = rb_first(&self->syms); nd; nd = rb_next(nd)) {
struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
@@ -1428,6 +1435,21 @@ void dsos__fprintf(FILE *fp)
dso__fprintf(pos, fp);
}
+size_t dsos__fprintf_buildid(FILE *fp)
+{
+ struct dso *pos;
+ size_t ret = 0;
+
+ list_for_each_entry(pos, &dsos, node) {
+ ret += dso__fprintf_buildid(pos, fp);
+ if (verbose)
+ ret += fprintf(fp, " %s\n", pos->long_name);
+ else
+ ret += fprintf(fp, "\n");
+ }
+ return ret;
+}
+
int load_kernel(symbol_filter_t filter)
{
if (dsos__load_kernel(vmlinux_name, filter, modules) <= 0)
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index 0a34a54..51c5a4a 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -80,7 +80,9 @@ int dsos__load_kernel(const char *vmlinux, symbol_filter_t filter, int modules);
struct dso *dsos__findnew(const char *name);
int dso__load(struct dso *self, struct map *map, symbol_filter_t filter);
void dsos__fprintf(FILE *fp);
+size_t dsos__fprintf_buildid(FILE *fp);
+size_t dso__fprintf_buildid(struct dso *self, FILE *fp);
size_t dso__fprintf(struct dso *self, FILE *fp);
char dso__symtab_origin(const struct dso *self);
void dso__set_build_id(struct dso *self, void *build_id);
--
1.6.2.5
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 5/5] perf buildid-list: New plumbing command
2009-11-16 18:32 ` [PATCH 4/5] perf tools: Introduce dsos__fprintf_buildid Arnaldo Carvalho de Melo
@ 2009-11-16 18:32 ` Arnaldo Carvalho de Melo
2009-11-16 18:58 ` Frederic Weisbecker
` (2 more replies)
2009-11-16 21:10 ` [tip:perf/core] perf tools: Introduce dsos__fprintf_buildid tip-bot for Arnaldo Carvalho de Melo
1 sibling, 3 replies; 20+ messages in thread
From: Arnaldo Carvalho de Melo @ 2009-11-16 18:32 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Arnaldo Carvalho de Melo, Frederic Weisbecker,
Mike Galbraith, Paul Mackerras, Peter Zijlstra
From: Arnaldo Carvalho de Melo <acme@redhat.com>
With this we can list the buildids in a perf.data file so that we can
pipe them to other, distro specific tools that from the buildids can
figure out separate packages (foo-debuginfo) where we can find the
matching symtabs so that perf report can do its job.
E.g:
[acme@doppio linux-2.6-tip]$ perf buildid-list | head -5
8e08b117e5458ad3f85da16d42d0fc5cd21c5869
520c2387a587cc5acfcf881e27dba1caaeab4b1f
ec8dd400904ddfcac8b1c343263a790f977159dc
7caedbca5a6d8ab39a7fe44bd28c07d3e14a3f3f
379bb828fd08859dbea73279f04abefabc95a6a3
[acme@doppio linux-2.6-tip]$ perf buildid-list -v | head -5
8e08b117e5458ad3f85da16d42d0fc5cd21c5869 /sbin/init
520c2387a587cc5acfcf881e27dba1caaeab4b1f /lib64/ld-2.10.1.so
ec8dd400904ddfcac8b1c343263a790f977159dc /lib64/libc-2.10.1.so
7caedbca5a6d8ab39a7fe44bd28c07d3e14a3f3f /sbin/udevd
379bb828fd08859dbea73279f04abefabc95a6a3 /lib64/libdl-2.10.1.so
[acme@doppio linux-2.6-tip]$
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/Documentation/perf-buildid-list.txt | 34 +++++++
tools/perf/Makefile | 1 +
tools/perf/builtin-buildid-list.c | 116 ++++++++++++++++++++++++
tools/perf/builtin.h | 1 +
tools/perf/command-list.txt | 1 +
tools/perf/perf.c | 1 +
6 files changed, 154 insertions(+), 0 deletions(-)
create mode 100644 tools/perf/Documentation/perf-buildid-list.txt
create mode 100644 tools/perf/builtin-buildid-list.c
diff --git a/tools/perf/Documentation/perf-buildid-list.txt b/tools/perf/Documentation/perf-buildid-list.txt
new file mode 100644
index 0000000..abab34e
--- /dev/null
+++ b/tools/perf/Documentation/perf-buildid-list.txt
@@ -0,0 +1,34 @@
+perf-buildid-list(1)
+====================
+
+NAME
+----
+perf-buildid-list - List the buildids in a perf.data file
+
+SYNOPSIS
+--------
+[verse]
+'perf buildid-list <options>'
+
+DESCRIPTION
+-----------
+This command displays the buildids found in a perf.data file, so that other
+tools can be used to fetch packages with matching symbol tables for use by
+perf report.
+
+OPTIONS
+-------
+-i::
+--input=::
+ Input file name. (default: perf.data)
+-f::
+--force::
+ Don't do ownership validation.
+-v::
+--verbose::
+ Be more verbose, showing the name of the DSOs after the buildids.
+
+SEE ALSO
+--------
+linkperf:perf-record[1], linkperf:perf-top[1],
+linkperf:perf-report[1]
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index cd42c97..3dbb5c5 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -431,6 +431,7 @@ BUILTIN_OBJS += bench/sched-pipe.o
BUILTIN_OBJS += builtin-help.o
BUILTIN_OBJS += builtin-sched.o
+BUILTIN_OBJS += builtin-buildid-list.o
BUILTIN_OBJS += builtin-list.o
BUILTIN_OBJS += builtin-record.o
BUILTIN_OBJS += builtin-report.o
diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid-list.c
new file mode 100644
index 0000000..2e377e1
--- /dev/null
+++ b/tools/perf/builtin-buildid-list.c
@@ -0,0 +1,116 @@
+/*
+ * builtin-buildid-list.c
+ *
+ * Builtin buildid-list command: list buildids in perf.data
+ *
+ * Copyright (C) 2009, Red Hat Inc.
+ * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com>
+ */
+#include "builtin.h"
+#include "perf.h"
+#include "util/cache.h"
+#include "util/data_map.h"
+#include "util/debug.h"
+#include "util/header.h"
+#include "util/parse-options.h"
+#include "util/symbol.h"
+
+static char const *input_name = "perf.data";
+static int force;
+
+static const char *const buildid_list_usage[] = {
+ "perf report [<options>]",
+ NULL
+};
+
+static const struct option options[] = {
+ OPT_STRING('i', "input", &input_name, "file",
+ "input file name"),
+ OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
+ OPT_BOOLEAN('v', "verbose", &verbose,
+ "be more verbose (show counter open errors, etc)"),
+ OPT_END()
+};
+
+static int perf_file_section__process_buildids(struct perf_file_section *self,
+ int feat, int fd)
+{
+ if (feat != HEADER_BUILD_ID)
+ return 0;
+
+ if (lseek(fd, self->offset, SEEK_SET) < 0) {
+ pr_warning("Failed to lseek to %Ld offset for buildids!\n",
+ self->offset);
+ return -1;
+ }
+
+ if (perf_header__read_build_ids(fd, self->offset, self->size)) {
+ pr_warning("Failed to read buildids!\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int __cmd_buildid_list(void)
+{
+ int err = -1;
+ struct perf_header *header;
+ struct perf_file_header f_header;
+ struct stat input_stat;
+ int input = open(input_name, O_RDONLY);
+
+ if (input < 0) {
+ pr_err("failed to open file: %s", input_name);
+ if (!strcmp(input_name, "perf.data"))
+ pr_err(" (try 'perf record' first)");
+ pr_err("\n");
+ goto out;
+ }
+
+ err = fstat(input, &input_stat);
+ if (err < 0) {
+ perror("failed to stat file");
+ goto out_close;
+ }
+
+ if (!force && input_stat.st_uid && (input_stat.st_uid != geteuid())) {
+ pr_err("file %s not owned by current user or root\n",
+ input_name);
+ goto out_close;
+ }
+
+ if (!input_stat.st_size) {
+ pr_info("zero-sized file, nothing to do!\n");
+ goto out_close;
+ }
+
+ err = -1;
+ header = perf_header__new();
+ if (header == NULL)
+ goto out_close;
+
+ if (perf_file_header__read(&f_header, header, input) < 0) {
+ pr_warning("incompatible file format");
+ goto out_close;
+ }
+
+ err = perf_header__process_sections(header, input,
+ perf_file_section__process_buildids);
+
+ if (err < 0)
+ goto out_close;
+
+ dsos__fprintf_buildid(stdout);
+out_close:
+ close(input);
+out:
+ return err;
+}
+
+int cmd_buildid_list(int argc, const char **argv, const char *prefix __used)
+{
+ argc = parse_options(argc, argv, options, buildid_list_usage, 0);
+ setup_pager();
+ return __cmd_buildid_list();
+}
diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
index d4fe12d..9b02d85 100644
--- a/tools/perf/builtin.h
+++ b/tools/perf/builtin.h
@@ -16,6 +16,7 @@ extern int check_pager_config(const char *cmd);
extern int cmd_annotate(int argc, const char **argv, const char *prefix);
extern int cmd_bench(int argc, const char **argv, const char *prefix);
+extern int cmd_buildid_list(int argc, const char **argv, const char *prefix);
extern int cmd_help(int argc, const char **argv, const char *prefix);
extern int cmd_sched(int argc, const char **argv, const char *prefix);
extern int cmd_list(int argc, const char **argv, const char *prefix);
diff --git a/tools/perf/command-list.txt b/tools/perf/command-list.txt
index 1642a88..983ae29 100644
--- a/tools/perf/command-list.txt
+++ b/tools/perf/command-list.txt
@@ -4,6 +4,7 @@
#
perf-annotate mainporcelain common
perf-bench mainporcelain common
+perf-build-list mainporcelain common
perf-list mainporcelain common
perf-sched mainporcelain common
perf-record mainporcelain common
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index 9cd55b9..89b82ac 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -287,6 +287,7 @@ static void handle_internal_command(int argc, const char **argv)
static struct cmd_struct commands[] = {
{ "help", cmd_help, 0 },
{ "list", cmd_list, 0 },
+ { "buildid-list", cmd_buildid_list, 0 },
{ "record", cmd_record, 0 },
{ "report", cmd_report, 0 },
{ "bench", cmd_bench, 0 },
--
1.6.2.5
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH 5/5] perf buildid-list: New plumbing command
2009-11-16 18:32 ` [PATCH 5/5] perf buildid-list: New plumbing command Arnaldo Carvalho de Melo
@ 2009-11-16 18:58 ` Frederic Weisbecker
2009-11-16 19:41 ` Arnaldo Carvalho de Melo
2009-11-16 21:02 ` Ingo Molnar
2009-11-16 21:10 ` [tip:perf/core] " tip-bot for Arnaldo Carvalho de Melo
2 siblings, 1 reply; 20+ messages in thread
From: Frederic Weisbecker @ 2009-11-16 18:58 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, linux-kernel, Arnaldo Carvalho de Melo,
Mike Galbraith, Paul Mackerras, Peter Zijlstra
On Mon, Nov 16, 2009 at 04:32:45PM -0200, Arnaldo Carvalho de Melo wrote:
> From: Arnaldo Carvalho de Melo <acme@redhat.com>
>
> With this we can list the buildids in a perf.data file so that we can
> pipe them to other, distro specific tools that from the buildids can
> figure out separate packages (foo-debuginfo) where we can find the
> matching symtabs so that perf report can do its job.
>
> E.g:
>
> [acme@doppio linux-2.6-tip]$ perf buildid-list | head -5
> 8e08b117e5458ad3f85da16d42d0fc5cd21c5869
> 520c2387a587cc5acfcf881e27dba1caaeab4b1f
> ec8dd400904ddfcac8b1c343263a790f977159dc
> 7caedbca5a6d8ab39a7fe44bd28c07d3e14a3f3f
> 379bb828fd08859dbea73279f04abefabc95a6a3
> [acme@doppio linux-2.6-tip]$ perf buildid-list -v | head -5
> 8e08b117e5458ad3f85da16d42d0fc5cd21c5869 /sbin/init
> 520c2387a587cc5acfcf881e27dba1caaeab4b1f /lib64/ld-2.10.1.so
> ec8dd400904ddfcac8b1c343263a790f977159dc /lib64/libc-2.10.1.so
> 7caedbca5a6d8ab39a7fe44bd28c07d3e14a3f3f /sbin/udevd
> 379bb828fd08859dbea73279f04abefabc95a6a3 /lib64/libdl-2.10.1.so
I would rather see the effect of this -v option as the default.
It's very useful to see the dso resolved but hashes alone
don't pay much.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 3/5] perf tools: Generalize perf_header__adds_read
2009-11-16 18:32 ` [PATCH 3/5] perf tools: Generalize perf_header__adds_read Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 4/5] perf tools: Introduce dsos__fprintf_buildid Arnaldo Carvalho de Melo
@ 2009-11-16 19:02 ` Frederic Weisbecker
2009-11-16 21:10 ` [tip:perf/core] perf tools: Generalize perf_header__adds_read() tip-bot for Arnaldo Carvalho de Melo
2 siblings, 0 replies; 20+ messages in thread
From: Frederic Weisbecker @ 2009-11-16 19:02 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, linux-kernel, Arnaldo Carvalho de Melo,
Mike Galbraith, Paul Mackerras, Peter Zijlstra
On Mon, Nov 16, 2009 at 04:32:43PM -0200, Arnaldo Carvalho de Melo wrote:
> From: Arnaldo Carvalho de Melo <acme@redhat.com>
>
> Renaming it to perf_header__process_sections and passing a callback to
> handle each feature.
>
> The next changesets will introduce 'perf buildid-list' that will handle
> just the HEADER_BUILD_ID table, ignoring all the other features.
>
> Cc: Frederic Weisbecker <fweisbec@gmail.com>
> Cc: Mike Galbraith <efault@gmx.de>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Looks much proper this way, indeed :)
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/5] perf buildid-list: New plumbing command
2009-11-16 18:58 ` Frederic Weisbecker
@ 2009-11-16 19:41 ` Arnaldo Carvalho de Melo
2009-11-16 20:58 ` Ingo Molnar
2009-11-16 21:05 ` Peter Zijlstra
0 siblings, 2 replies; 20+ messages in thread
From: Arnaldo Carvalho de Melo @ 2009-11-16 19:41 UTC (permalink / raw)
To: Frederic Weisbecker
Cc: Ingo Molnar, linux-kernel, Mike Galbraith, Paul Mackerras,
Peter Zijlstra
Em Mon, Nov 16, 2009 at 07:58:52PM +0100, Frederic Weisbecker escreveu:
> On Mon, Nov 16, 2009 at 04:32:45PM -0200, Arnaldo Carvalho de Melo wrote:
> > With this we can list the buildids in a perf.data file so that we can
> > pipe them to other, distro specific tools that from the buildids can
> > figure out separate packages (foo-debuginfo) where we can find the
> > matching symtabs so that perf report can do its job.
> > E.g:
> > [acme@doppio linux-2.6-tip]$ perf buildid-list | head -2
> > 8e08b117e5458ad3f85da16d42d0fc5cd21c5869
> > 520c2387a587cc5acfcf881e27dba1caaeab4b1f
> > [acme@doppio linux-2.6-tip]$ perf buildid-list -v | head -2
> > 8e08b117e5458ad3f85da16d42d0fc5cd21c5869 /sbin/init
> > 520c2387a587cc5acfcf881e27dba1caaeab4b1f /lib64/ld-2.10.1.so
>
> I would rather see the effect of this -v option as the default.
> It's very useful to see the dso resolved but hashes alone
> don't pay much.
I disagree, the main purpose of this command is equivalent to 'git
rev-list':
[acme@doppio linux-2.6-tip]$ git rev-list HEAD^^..
089242a8c826aac1c827bb797475b9852fe0db49
18e3a75dc47d8397bbf0936ec8e3ebdecada7ba1
[acme@doppio linux-2.6-tip]$
I.e. provide content keys that then will be used by distro specific
porcelain to get the matching -debuginfo packages with the symtabs.
- Arnaldo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/5] perf buildid-list: New plumbing command
2009-11-16 19:41 ` Arnaldo Carvalho de Melo
@ 2009-11-16 20:58 ` Ingo Molnar
2009-11-16 21:04 ` Arnaldo Carvalho de Melo
2009-11-16 21:05 ` Peter Zijlstra
1 sibling, 1 reply; 20+ messages in thread
From: Ingo Molnar @ 2009-11-16 20:58 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Frederic Weisbecker, linux-kernel, Mike Galbraith, Paul Mackerras,
Peter Zijlstra
* Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote:
> Em Mon, Nov 16, 2009 at 07:58:52PM +0100, Frederic Weisbecker escreveu:
> > On Mon, Nov 16, 2009 at 04:32:45PM -0200, Arnaldo Carvalho de Melo wrote:
> > > With this we can list the buildids in a perf.data file so that we can
> > > pipe them to other, distro specific tools that from the buildids can
> > > figure out separate packages (foo-debuginfo) where we can find the
> > > matching symtabs so that perf report can do its job.
> > > E.g:
> > > [acme@doppio linux-2.6-tip]$ perf buildid-list | head -2
> > > 8e08b117e5458ad3f85da16d42d0fc5cd21c5869
> > > 520c2387a587cc5acfcf881e27dba1caaeab4b1f
> > > [acme@doppio linux-2.6-tip]$ perf buildid-list -v | head -2
> > > 8e08b117e5458ad3f85da16d42d0fc5cd21c5869 /sbin/init
> > > 520c2387a587cc5acfcf881e27dba1caaeab4b1f /lib64/ld-2.10.1.so
> >
> > I would rather see the effect of this -v option as the default.
> > It's very useful to see the dso resolved but hashes alone
> > don't pay much.
>
> I disagree, the main purpose of this command is equivalent to 'git
> rev-list':
>
> [acme@doppio linux-2.6-tip]$ git rev-list HEAD^^..
> 089242a8c826aac1c827bb797475b9852fe0db49
> 18e3a75dc47d8397bbf0936ec8e3ebdecada7ba1
> [acme@doppio linux-2.6-tip]$
>
> I.e. provide content keys that then will be used by distro specific
> porcelain to get the matching -debuginfo packages with the symtabs.
Hm, i'd say that's a (small) bug in Git.
Porcelain can add flags just fine to get 'raw' behavior - so in general
we want to default the most human friendly parameters to the most
human-readable output format.
Ingo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/5] perf buildid-list: New plumbing command
2009-11-16 18:32 ` [PATCH 5/5] perf buildid-list: New plumbing command Arnaldo Carvalho de Melo
2009-11-16 18:58 ` Frederic Weisbecker
@ 2009-11-16 21:02 ` Ingo Molnar
2009-11-16 21:05 ` Arnaldo Carvalho de Melo
2009-11-16 21:10 ` [tip:perf/core] " tip-bot for Arnaldo Carvalho de Melo
2 siblings, 1 reply; 20+ messages in thread
From: Ingo Molnar @ 2009-11-16 21:02 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Arnaldo Carvalho de Melo, Frederic Weisbecker,
Mike Galbraith, Paul Mackerras, Peter Zijlstra
* Arnaldo Carvalho de Melo <acme@infradead.org> wrote:
> +++ b/tools/perf/command-list.txt
> @@ -4,6 +4,7 @@
> #
> perf-annotate mainporcelain common
> perf-bench mainporcelain common
> +perf-build-list mainporcelain common
s/build-list/buildid-list
Ingo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/5] perf buildid-list: New plumbing command
2009-11-16 20:58 ` Ingo Molnar
@ 2009-11-16 21:04 ` Arnaldo Carvalho de Melo
2009-11-16 21:07 ` Ingo Molnar
0 siblings, 1 reply; 20+ messages in thread
From: Arnaldo Carvalho de Melo @ 2009-11-16 21:04 UTC (permalink / raw)
To: Ingo Molnar
Cc: Frederic Weisbecker, linux-kernel, Mike Galbraith, Paul Mackerras,
Peter Zijlstra
Em Mon, Nov 16, 2009 at 09:58:20PM +0100, Ingo Molnar escreveu:
>
> * Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote:
>
> > Em Mon, Nov 16, 2009 at 07:58:52PM +0100, Frederic Weisbecker escreveu:
> > > On Mon, Nov 16, 2009 at 04:32:45PM -0200, Arnaldo Carvalho de Melo wrote:
> > > > With this we can list the buildids in a perf.data file so that we can
> > > > pipe them to other, distro specific tools that from the buildids can
> > > > figure out separate packages (foo-debuginfo) where we can find the
> > > > matching symtabs so that perf report can do its job.
> > > > E.g:
> > > > [acme@doppio linux-2.6-tip]$ perf buildid-list | head -2
> > > > 8e08b117e5458ad3f85da16d42d0fc5cd21c5869
> > > > 520c2387a587cc5acfcf881e27dba1caaeab4b1f
> > > > [acme@doppio linux-2.6-tip]$ perf buildid-list -v | head -2
> > > > 8e08b117e5458ad3f85da16d42d0fc5cd21c5869 /sbin/init
> > > > 520c2387a587cc5acfcf881e27dba1caaeab4b1f /lib64/ld-2.10.1.so
> > >
> > > I would rather see the effect of this -v option as the default.
> > > It's very useful to see the dso resolved but hashes alone
> > > don't pay much.
> >
> > I disagree, the main purpose of this command is equivalent to 'git
> > rev-list':
> >
> > [acme@doppio linux-2.6-tip]$ git rev-list HEAD^^..
> > 089242a8c826aac1c827bb797475b9852fe0db49
> > 18e3a75dc47d8397bbf0936ec8e3ebdecada7ba1
> > [acme@doppio linux-2.6-tip]$
> >
> > I.e. provide content keys that then will be used by distro specific
> > porcelain to get the matching -debuginfo packages with the symtabs.
>
> Hm, i'd say that's a (small) bug in Git.
>
> Porcelain can add flags just fine to get 'raw' behavior - so in general
> we want to default the most human friendly parameters to the most
> human-readable output format.
Well, no strong feelings here, make it the other way around and the most
usual case will just ignore those extra characters :-)
- Arnaldo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/5] perf buildid-list: New plumbing command
2009-11-16 21:02 ` Ingo Molnar
@ 2009-11-16 21:05 ` Arnaldo Carvalho de Melo
2009-11-16 21:06 ` Ingo Molnar
0 siblings, 1 reply; 20+ messages in thread
From: Arnaldo Carvalho de Melo @ 2009-11-16 21:05 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Frederic Weisbecker, Mike Galbraith, Paul Mackerras,
Peter Zijlstra
Em Mon, Nov 16, 2009 at 10:02:42PM +0100, Ingo Molnar escreveu:
>
> * Arnaldo Carvalho de Melo <acme@infradead.org> wrote:
>
> > +++ b/tools/perf/command-list.txt
> > @@ -4,6 +4,7 @@
> > #
> > perf-annotate mainporcelain common
> > perf-bench mainporcelain common
> > +perf-build-list mainporcelain common
>
> s/build-list/buildid-list
Ooops, do you want me to resent the whole series or can you please fix
this up while merging? :)
- Arnaldo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/5] perf buildid-list: New plumbing command
2009-11-16 19:41 ` Arnaldo Carvalho de Melo
2009-11-16 20:58 ` Ingo Molnar
@ 2009-11-16 21:05 ` Peter Zijlstra
1 sibling, 0 replies; 20+ messages in thread
From: Peter Zijlstra @ 2009-11-16 21:05 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Frederic Weisbecker, Ingo Molnar, linux-kernel, Mike Galbraith,
Paul Mackerras
On Mon, 2009-11-16 at 17:41 -0200, Arnaldo Carvalho de Melo wrote:
> Em Mon, Nov 16, 2009 at 07:58:52PM +0100, Frederic Weisbecker escreveu:
> > On Mon, Nov 16, 2009 at 04:32:45PM -0200, Arnaldo Carvalho de Melo wrote:
> > > With this we can list the buildids in a perf.data file so that we can
> > > pipe them to other, distro specific tools that from the buildids can
> > > figure out separate packages (foo-debuginfo) where we can find the
> > > matching symtabs so that perf report can do its job.
> > > E.g:
> > > [acme@doppio linux-2.6-tip]$ perf buildid-list | head -2
> > > 8e08b117e5458ad3f85da16d42d0fc5cd21c5869
> > > 520c2387a587cc5acfcf881e27dba1caaeab4b1f
> > > [acme@doppio linux-2.6-tip]$ perf buildid-list -v | head -2
> > > 8e08b117e5458ad3f85da16d42d0fc5cd21c5869 /sbin/init
> > > 520c2387a587cc5acfcf881e27dba1caaeab4b1f /lib64/ld-2.10.1.so
> >
> > I would rather see the effect of this -v option as the default.
> > It's very useful to see the dso resolved but hashes alone
> > don't pay much.
>
> I disagree, the main purpose of this command is equivalent to 'git
> rev-list':
>
> [acme@doppio linux-2.6-tip]$ git rev-list HEAD^^..
> 089242a8c826aac1c827bb797475b9852fe0db49
> 18e3a75dc47d8397bbf0936ec8e3ebdecada7ba1
> [acme@doppio linux-2.6-tip]$
>
> I.e. provide content keys that then will be used by distro specific
> porcelain to get the matching -debuginfo packages with the symtabs.
I'm pretty sure such distro specific muck can trivially ignore the
second column.
And the output is much _much_ more useful when it has the dso listed.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/5] perf buildid-list: New plumbing command
2009-11-16 21:05 ` Arnaldo Carvalho de Melo
@ 2009-11-16 21:06 ` Ingo Molnar
0 siblings, 0 replies; 20+ messages in thread
From: Ingo Molnar @ 2009-11-16 21:06 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Frederic Weisbecker, Mike Galbraith, Paul Mackerras,
Peter Zijlstra
* Arnaldo Carvalho de Melo <acme@infradead.org> wrote:
> Em Mon, Nov 16, 2009 at 10:02:42PM +0100, Ingo Molnar escreveu:
> >
> > * Arnaldo Carvalho de Melo <acme@infradead.org> wrote:
> >
> > > +++ b/tools/perf/command-list.txt
> > > @@ -4,6 +4,7 @@
> > > #
> > > perf-annotate mainporcelain common
> > > perf-bench mainporcelain common
> > > +perf-build-list mainporcelain common
> >
> > s/build-list/buildid-list
>
> Ooops, do you want me to resent the whole series or can you please fix
> this up while merging? :)
already fixed :)
Ingo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/5] perf buildid-list: New plumbing command
2009-11-16 21:04 ` Arnaldo Carvalho de Melo
@ 2009-11-16 21:07 ` Ingo Molnar
0 siblings, 0 replies; 20+ messages in thread
From: Ingo Molnar @ 2009-11-16 21:07 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Frederic Weisbecker, linux-kernel, Mike Galbraith, Paul Mackerras,
Peter Zijlstra
* Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote:
> Em Mon, Nov 16, 2009 at 09:58:20PM +0100, Ingo Molnar escreveu:
> >
> > * Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote:
> >
> > > Em Mon, Nov 16, 2009 at 07:58:52PM +0100, Frederic Weisbecker escreveu:
> > > > On Mon, Nov 16, 2009 at 04:32:45PM -0200, Arnaldo Carvalho de Melo wrote:
> > > > > With this we can list the buildids in a perf.data file so that we can
> > > > > pipe them to other, distro specific tools that from the buildids can
> > > > > figure out separate packages (foo-debuginfo) where we can find the
> > > > > matching symtabs so that perf report can do its job.
> > > > > E.g:
> > > > > [acme@doppio linux-2.6-tip]$ perf buildid-list | head -2
> > > > > 8e08b117e5458ad3f85da16d42d0fc5cd21c5869
> > > > > 520c2387a587cc5acfcf881e27dba1caaeab4b1f
> > > > > [acme@doppio linux-2.6-tip]$ perf buildid-list -v | head -2
> > > > > 8e08b117e5458ad3f85da16d42d0fc5cd21c5869 /sbin/init
> > > > > 520c2387a587cc5acfcf881e27dba1caaeab4b1f /lib64/ld-2.10.1.so
> > > >
> > > > I would rather see the effect of this -v option as the default.
> > > > It's very useful to see the dso resolved but hashes alone
> > > > don't pay much.
> > >
> > > I disagree, the main purpose of this command is equivalent to 'git
> > > rev-list':
> > >
> > > [acme@doppio linux-2.6-tip]$ git rev-list HEAD^^..
> > > 089242a8c826aac1c827bb797475b9852fe0db49
> > > 18e3a75dc47d8397bbf0936ec8e3ebdecada7ba1
> > > [acme@doppio linux-2.6-tip]$
> > >
> > > I.e. provide content keys that then will be used by distro specific
> > > porcelain to get the matching -debuginfo packages with the symtabs.
> >
> > Hm, i'd say that's a (small) bug in Git.
> >
> > Porcelain can add flags just fine to get 'raw' behavior - so in general
> > we want to default the most human friendly parameters to the most
> > human-readable output format.
>
> Well, no strong feelings here, make it the other way around and the
> most usual case will just ignore those extra characters :-)
i looked briefly but it didnt seem obvious to invert 'verbose' (which is
library shared), and i have the excuse of it being late here - so i'll
leave it up to you in a followup patch :-)
Ingo
^ permalink raw reply [flat|nested] 20+ messages in thread
* [tip:perf/core] perf symbols: Pass the offset to perf_header__read_build_ids()
2009-11-16 18:32 [PATCH 1/5] perf symbols: pass the offset to perf_header__read_build_ids Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 2/5] perf tools: debug.h needs to include event.h for event_t Arnaldo Carvalho de Melo
@ 2009-11-16 21:09 ` tip-bot for Arnaldo Carvalho de Melo
1 sibling, 0 replies; 20+ messages in thread
From: tip-bot for Arnaldo Carvalho de Melo @ 2009-11-16 21:09 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, paulus, acme, hpa, mingo, peterz, efault, fweisbec,
tglx, mingo
Commit-ID: 84fe8488ade7922afa9f3aa77c22d2d92beb9660
Gitweb: http://git.kernel.org/tip/84fe8488ade7922afa9f3aa77c22d2d92beb9660
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
AuthorDate: Mon, 16 Nov 2009 16:32:41 -0200
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Mon, 16 Nov 2009 22:05:49 +0100
perf symbols: Pass the offset to perf_header__read_build_ids()
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <1258396365-29217-1-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
tools/perf/util/data_map.c | 3 +--
tools/perf/util/data_map.h | 2 +-
| 2 +-
3 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/tools/perf/util/data_map.c b/tools/perf/util/data_map.c
index aacb814..14cb846 100644
--- a/tools/perf/util/data_map.c
+++ b/tools/perf/util/data_map.c
@@ -70,11 +70,10 @@ process_event(event_t *event, unsigned long offset, unsigned long head)
}
}
-int perf_header__read_build_ids(int input, off_t size)
+int perf_header__read_build_ids(int input, off_t offset, off_t size)
{
struct build_id_event bev;
char filename[PATH_MAX];
- off_t offset = lseek(input, 0, SEEK_CUR);
off_t limit = offset + size;
int err = -1;
diff --git a/tools/perf/util/data_map.h b/tools/perf/util/data_map.h
index 20b4037..ae036ec 100644
--- a/tools/perf/util/data_map.h
+++ b/tools/perf/util/data_map.h
@@ -27,6 +27,6 @@ int mmap_dispatch_perf_file(struct perf_header **pheader,
int full_paths,
int *cwdlen,
char **cwd);
-int perf_header__read_build_ids(int input, off_t file_size);
+int perf_header__read_build_ids(int input, off_t offset, off_t file_size);
#endif
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index ebed4f4..ca0d657 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -359,7 +359,7 @@ static void perf_header__adds_read(struct perf_header *self, int fd)
buildid_sec = &feat_sec[idx++];
lseek(fd, buildid_sec->offset, SEEK_SET);
- if (perf_header__read_build_ids(fd, buildid_sec->size))
+ if (perf_header__read_build_ids(fd, buildid_sec->offset, buildid_sec->size))
pr_debug("failed to read buildids, continuing...\n");
}
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [tip:perf/core] perf tools: Debug.h needs to include event.h for event_t
2009-11-16 18:32 ` [PATCH 2/5] perf tools: debug.h needs to include event.h for event_t Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 3/5] perf tools: Generalize perf_header__adds_read Arnaldo Carvalho de Melo
@ 2009-11-16 21:10 ` tip-bot for Arnaldo Carvalho de Melo
1 sibling, 0 replies; 20+ messages in thread
From: tip-bot for Arnaldo Carvalho de Melo @ 2009-11-16 21:10 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, paulus, acme, hpa, mingo, peterz, efault, fweisbec,
tglx, mingo
Commit-ID: 8f41146aedf803856fb6477056e3960cb9ba8f9c
Gitweb: http://git.kernel.org/tip/8f41146aedf803856fb6477056e3960cb9ba8f9c
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
AuthorDate: Mon, 16 Nov 2009 16:32:42 -0200
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Mon, 16 Nov 2009 22:05:50 +0100
perf tools: Debug.h needs to include event.h for event_t
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <1258396365-29217-2-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
tools/perf/util/debug.h | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/tools/perf/util/debug.h b/tools/perf/util/debug.h
index e8b18a1..c6c24c5 100644
--- a/tools/perf/util/debug.h
+++ b/tools/perf/util/debug.h
@@ -2,6 +2,8 @@
#ifndef __PERF_DEBUG_H
#define __PERF_DEBUG_H
+#include "event.h"
+
extern int verbose;
extern int dump_trace;
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [tip:perf/core] perf tools: Generalize perf_header__adds_read()
2009-11-16 18:32 ` [PATCH 3/5] perf tools: Generalize perf_header__adds_read Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 4/5] perf tools: Introduce dsos__fprintf_buildid Arnaldo Carvalho de Melo
2009-11-16 19:02 ` [PATCH 3/5] perf tools: Generalize perf_header__adds_read Frederic Weisbecker
@ 2009-11-16 21:10 ` tip-bot for Arnaldo Carvalho de Melo
2 siblings, 0 replies; 20+ messages in thread
From: tip-bot for Arnaldo Carvalho de Melo @ 2009-11-16 21:10 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, paulus, acme, hpa, mingo, peterz, efault, fweisbec,
tglx, mingo
Commit-ID: 37562eac3767c7f07bb1a1329708ff6453e47570
Gitweb: http://git.kernel.org/tip/37562eac3767c7f07bb1a1329708ff6453e47570
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
AuthorDate: Mon, 16 Nov 2009 16:32:43 -0200
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Mon, 16 Nov 2009 22:05:50 +0100
perf tools: Generalize perf_header__adds_read()
Renaming it to perf_header__process_sections() and passing a
callback to handle each feature.
The next changesets will introduce 'perf buildid-list' that will
handle just the HEADER_BUILD_ID table, ignoring all the other
features.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <1258396365-29217-3-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
| 123 ++++++++++++++++++++++++++--------------------
| 31 +++++++++++-
2 files changed, 98 insertions(+), 56 deletions(-)
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index ca0d657..d8416f0 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -128,26 +128,11 @@ static const char *__perf_magic = "PERFFILE";
#define PERF_MAGIC (*(u64 *)__perf_magic)
-struct perf_file_section {
- u64 offset;
- u64 size;
-};
-
struct perf_file_attr {
struct perf_event_attr attr;
struct perf_file_section ids;
};
-struct perf_file_header {
- u64 magic;
- u64 size;
- u64 attr_size;
- struct perf_file_section attrs;
- struct perf_file_section data;
- struct perf_file_section event_types;
- DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
-};
-
void perf_header__set_feat(struct perf_header *self, int feat)
{
set_bit(feat, self->adds_features);
@@ -324,21 +309,23 @@ static void do_read(int fd, void *buf, size_t size)
}
}
-static void perf_header__adds_read(struct perf_header *self, int fd)
+int perf_header__process_sections(struct perf_header *self, int fd,
+ int (*process)(struct perf_file_section *self,
+ int feat, int fd))
{
struct perf_file_section *feat_sec;
int nr_sections;
int sec_size;
int idx = 0;
-
+ int err = 0, feat = 1;
nr_sections = bitmap_weight(self->adds_features, HEADER_FEAT_BITS);
if (!nr_sections)
- return;
+ return 0;
feat_sec = calloc(sizeof(*feat_sec), nr_sections);
if (!feat_sec)
- die("No memory");
+ return -1;
sec_size = sizeof(*feat_sec) * nr_sections;
@@ -346,25 +333,73 @@ static void perf_header__adds_read(struct perf_header *self, int fd)
do_read(fd, feat_sec, sec_size);
- if (perf_header__has_feat(self, HEADER_TRACE_INFO)) {
- struct perf_file_section *trace_sec;
+ while (idx < nr_sections && feat < HEADER_LAST_FEATURE) {
+ if (perf_header__has_feat(self, feat)) {
+ struct perf_file_section *sec = &feat_sec[idx++];
- trace_sec = &feat_sec[idx++];
- lseek(fd, trace_sec->offset, SEEK_SET);
- trace_report(fd);
+ err = process(sec, feat, fd);
+ if (err < 0)
+ break;
+ }
+ ++feat;
}
- if (perf_header__has_feat(self, HEADER_BUILD_ID)) {
- struct perf_file_section *buildid_sec;
+ free(feat_sec);
+ return err;
+};
- buildid_sec = &feat_sec[idx++];
- lseek(fd, buildid_sec->offset, SEEK_SET);
- if (perf_header__read_build_ids(fd, buildid_sec->offset, buildid_sec->size))
- pr_debug("failed to read buildids, continuing...\n");
+int perf_file_header__read(struct perf_file_header *self,
+ struct perf_header *ph, int fd)
+{
+ lseek(fd, 0, SEEK_SET);
+ do_read(fd, self, sizeof(*self));
+
+ if (self->magic != PERF_MAGIC ||
+ self->attr_size != sizeof(struct perf_file_attr))
+ return -1;
+
+ if (self->size != sizeof(*self)) {
+ /* Support the previous format */
+ if (self->size == offsetof(typeof(*self), adds_features))
+ bitmap_zero(self->adds_features, HEADER_FEAT_BITS);
+ else
+ return -1;
}
- free(feat_sec);
-};
+ memcpy(&ph->adds_features, &self->adds_features,
+ sizeof(self->adds_features));
+
+ ph->event_offset = self->event_types.offset;
+ ph->event_size = self->event_types.size;
+ ph->data_offset = self->data.offset;
+ ph->data_size = self->data.size;
+ return 0;
+}
+
+static int perf_file_section__process(struct perf_file_section *self,
+ int feat, int fd)
+{
+ if (lseek(fd, self->offset, SEEK_SET) < 0) {
+ pr_debug("Failed to lseek to %Ld offset for feature %d, "
+ "continuing...\n", self->offset, feat);
+ return 0;
+ }
+
+ switch (feat) {
+ case HEADER_TRACE_INFO:
+ trace_report(fd);
+ break;
+
+ case HEADER_BUILD_ID:
+ if (perf_header__read_build_ids(fd, self->offset, self->size))
+ pr_debug("Failed to read buildids, continuing...\n");
+ break;
+ default:
+ pr_debug("unknown feature %d, continuing...\n", feat);
+ }
+
+ return 0;
+}
struct perf_header *perf_header__read(int fd)
{
@@ -372,23 +407,11 @@ struct perf_header *perf_header__read(int fd)
struct perf_file_header f_header;
struct perf_file_attr f_attr;
u64 f_id;
-
int nr_attrs, nr_ids, i, j;
- lseek(fd, 0, SEEK_SET);
- do_read(fd, &f_header, sizeof(f_header));
-
- if (f_header.magic != PERF_MAGIC ||
- f_header.attr_size != sizeof(f_attr))
+ if (perf_file_header__read(&f_header, self, fd) < 0)
die("incompatible file format");
- if (f_header.size != sizeof(f_header)) {
- /* Support the previous format */
- if (f_header.size == offsetof(typeof(f_header), adds_features))
- bitmap_zero(f_header.adds_features, HEADER_FEAT_BITS);
- else
- die("incompatible file format");
- }
nr_attrs = f_header.attrs.size / sizeof(f_attr);
lseek(fd, f_header.attrs.offset, SEEK_SET);
@@ -422,15 +445,7 @@ struct perf_header *perf_header__read(int fd)
event_count = f_header.event_types.size / sizeof(struct perf_trace_event_type);
}
- memcpy(&self->adds_features, &f_header.adds_features, sizeof(f_header.adds_features));
-
- self->event_offset = f_header.event_types.offset;
- self->event_size = f_header.event_types.size;
-
- self->data_offset = f_header.data.offset;
- self->data_size = f_header.data.size;
-
- perf_header__adds_read(self, fd);
+ perf_header__process_sections(self, fd, perf_file_section__process);
lseek(fd, self->data_offset, SEEK_SET);
--git a/tools/perf/util/header.h b/tools/perf/util/header.h
index a22d70b..f1b3bf7 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -15,11 +15,34 @@ struct perf_header_attr {
off_t id_offset;
};
-#define HEADER_TRACE_INFO 1
-#define HEADER_BUILD_ID 2
+enum {
+ HEADER_TRACE_INFO = 1,
+ HEADER_BUILD_ID,
+ HEADER_LAST_FEATURE,
+};
#define HEADER_FEAT_BITS 256
+struct perf_file_section {
+ u64 offset;
+ u64 size;
+};
+
+struct perf_file_header {
+ u64 magic;
+ u64 size;
+ u64 attr_size;
+ struct perf_file_section attrs;
+ struct perf_file_section data;
+ struct perf_file_section event_types;
+ DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
+};
+
+struct perf_header;
+
+int perf_file_header__read(struct perf_file_header *self,
+ struct perf_header *ph, int fd);
+
struct perf_header {
int frozen;
int attrs, size;
@@ -54,4 +77,8 @@ bool perf_header__has_feat(const struct perf_header *self, int feat);
struct perf_header *perf_header__new(void);
+int perf_header__process_sections(struct perf_header *self, int fd,
+ int (*process)(struct perf_file_section *self,
+ int feat, int fd));
+
#endif /* __PERF_HEADER_H */
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [tip:perf/core] perf tools: Introduce dsos__fprintf_buildid
2009-11-16 18:32 ` [PATCH 4/5] perf tools: Introduce dsos__fprintf_buildid Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 5/5] perf buildid-list: New plumbing command Arnaldo Carvalho de Melo
@ 2009-11-16 21:10 ` tip-bot for Arnaldo Carvalho de Melo
1 sibling, 0 replies; 20+ messages in thread
From: tip-bot for Arnaldo Carvalho de Melo @ 2009-11-16 21:10 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, paulus, acme, hpa, mingo, peterz, efault, fweisbec,
tglx, mingo
Commit-ID: 9e03eb2d512e7f3a1e562d4b922aa8b1891750b6
Gitweb: http://git.kernel.org/tip/9e03eb2d512e7f3a1e562d4b922aa8b1891750b6
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
AuthorDate: Mon, 16 Nov 2009 16:32:44 -0200
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Mon, 16 Nov 2009 22:05:51 +0100
perf tools: Introduce dsos__fprintf_buildid
To print the buildids in the list of dsos. Will be used by 'perf
buildid-list'
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <1258396365-29217-4-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
tools/perf/util/symbol.c | 30 ++++++++++++++++++++++++++----
tools/perf/util/symbol.h | 2 ++
2 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 93e4b52..53de9c4 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -212,14 +212,21 @@ int build_id__sprintf(u8 *self, int len, char *bf)
return raw - self;
}
-size_t dso__fprintf(struct dso *self, FILE *fp)
+size_t dso__fprintf_buildid(struct dso *self, FILE *fp)
{
char sbuild_id[BUILD_ID_SIZE * 2 + 1];
- struct rb_node *nd;
- size_t ret;
build_id__sprintf(self->build_id, sizeof(self->build_id), sbuild_id);
- ret = fprintf(fp, "dso: %s (%s)\n", self->short_name, sbuild_id);
+ return fprintf(fp, "%s", sbuild_id);
+}
+
+size_t dso__fprintf(struct dso *self, FILE *fp)
+{
+ struct rb_node *nd;
+ size_t ret = fprintf(fp, "dso: %s (", self->short_name);
+
+ ret += dso__fprintf_buildid(self, fp);
+ ret += fprintf(fp, ")\n");
for (nd = rb_first(&self->syms); nd; nd = rb_next(nd)) {
struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
@@ -1428,6 +1435,21 @@ void dsos__fprintf(FILE *fp)
dso__fprintf(pos, fp);
}
+size_t dsos__fprintf_buildid(FILE *fp)
+{
+ struct dso *pos;
+ size_t ret = 0;
+
+ list_for_each_entry(pos, &dsos, node) {
+ ret += dso__fprintf_buildid(pos, fp);
+ if (verbose)
+ ret += fprintf(fp, " %s\n", pos->long_name);
+ else
+ ret += fprintf(fp, "\n");
+ }
+ return ret;
+}
+
int load_kernel(symbol_filter_t filter)
{
if (dsos__load_kernel(vmlinux_name, filter, modules) <= 0)
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index 0a34a54..51c5a4a 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -80,7 +80,9 @@ int dsos__load_kernel(const char *vmlinux, symbol_filter_t filter, int modules);
struct dso *dsos__findnew(const char *name);
int dso__load(struct dso *self, struct map *map, symbol_filter_t filter);
void dsos__fprintf(FILE *fp);
+size_t dsos__fprintf_buildid(FILE *fp);
+size_t dso__fprintf_buildid(struct dso *self, FILE *fp);
size_t dso__fprintf(struct dso *self, FILE *fp);
char dso__symtab_origin(const struct dso *self);
void dso__set_build_id(struct dso *self, void *build_id);
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [tip:perf/core] perf buildid-list: New plumbing command
2009-11-16 18:32 ` [PATCH 5/5] perf buildid-list: New plumbing command Arnaldo Carvalho de Melo
2009-11-16 18:58 ` Frederic Weisbecker
2009-11-16 21:02 ` Ingo Molnar
@ 2009-11-16 21:10 ` tip-bot for Arnaldo Carvalho de Melo
2 siblings, 0 replies; 20+ messages in thread
From: tip-bot for Arnaldo Carvalho de Melo @ 2009-11-16 21:10 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, paulus, acme, hpa, mingo, peterz, efault, fweisbec,
tglx, mingo
Commit-ID: c34984b2bbc77596c97c333539bffc90d2033178
Gitweb: http://git.kernel.org/tip/c34984b2bbc77596c97c333539bffc90d2033178
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
AuthorDate: Mon, 16 Nov 2009 16:32:45 -0200
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Mon, 16 Nov 2009 22:05:51 +0100
perf buildid-list: New plumbing command
With this we can list the buildids in a perf.data file so that
we can pipe them to other, distro specific tools that from the
buildids can figure out separate packages (foo-debuginfo) where
we can find the matching symtabs so that perf report can do its
job.
E.g:
[acme@doppio linux-2.6-tip]$ perf buildid-list | head -5
8e08b117e5458ad3f85da16d42d0fc5cd21c5869
520c2387a587cc5acfcf881e27dba1caaeab4b1f
ec8dd400904ddfcac8b1c343263a790f977159dc
7caedbca5a6d8ab39a7fe44bd28c07d3e14a3f3f
379bb828fd08859dbea73279f04abefabc95a6a3
[acme@doppio linux-2.6-tip]$ perf buildid-list -v | head -5
8e08b117e5458ad3f85da16d42d0fc5cd21c5869 /sbin/init
520c2387a587cc5acfcf881e27dba1caaeab4b1f /lib64/ld-2.10.1.so
ec8dd400904ddfcac8b1c343263a790f977159dc /lib64/libc-2.10.1.so
7caedbca5a6d8ab39a7fe44bd28c07d3e14a3f3f /sbin/udevd
379bb828fd08859dbea73279f04abefabc95a6a3 /lib64/libdl-2.10.1.so
[acme@doppio linux-2.6-tip]$
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <1258396365-29217-5-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
tools/perf/Documentation/perf-buildid-list.txt | 34 +++++++
tools/perf/Makefile | 1 +
tools/perf/builtin-buildid-list.c | 116 ++++++++++++++++++++++++
tools/perf/builtin.h | 1 +
tools/perf/command-list.txt | 1 +
tools/perf/perf.c | 1 +
6 files changed, 154 insertions(+), 0 deletions(-)
diff --git a/tools/perf/Documentation/perf-buildid-list.txt b/tools/perf/Documentation/perf-buildid-list.txt
new file mode 100644
index 0000000..abab34e
--- /dev/null
+++ b/tools/perf/Documentation/perf-buildid-list.txt
@@ -0,0 +1,34 @@
+perf-buildid-list(1)
+====================
+
+NAME
+----
+perf-buildid-list - List the buildids in a perf.data file
+
+SYNOPSIS
+--------
+[verse]
+'perf buildid-list <options>'
+
+DESCRIPTION
+-----------
+This command displays the buildids found in a perf.data file, so that other
+tools can be used to fetch packages with matching symbol tables for use by
+perf report.
+
+OPTIONS
+-------
+-i::
+--input=::
+ Input file name. (default: perf.data)
+-f::
+--force::
+ Don't do ownership validation.
+-v::
+--verbose::
+ Be more verbose, showing the name of the DSOs after the buildids.
+
+SEE ALSO
+--------
+linkperf:perf-record[1], linkperf:perf-top[1],
+linkperf:perf-report[1]
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index f7cd896..46a58a8 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -430,6 +430,7 @@ BUILTIN_OBJS += bench/sched-pipe.o
BUILTIN_OBJS += builtin-help.o
BUILTIN_OBJS += builtin-sched.o
+BUILTIN_OBJS += builtin-buildid-list.o
BUILTIN_OBJS += builtin-list.o
BUILTIN_OBJS += builtin-record.o
BUILTIN_OBJS += builtin-report.o
diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid-list.c
new file mode 100644
index 0000000..2e377e1
--- /dev/null
+++ b/tools/perf/builtin-buildid-list.c
@@ -0,0 +1,116 @@
+/*
+ * builtin-buildid-list.c
+ *
+ * Builtin buildid-list command: list buildids in perf.data
+ *
+ * Copyright (C) 2009, Red Hat Inc.
+ * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com>
+ */
+#include "builtin.h"
+#include "perf.h"
+#include "util/cache.h"
+#include "util/data_map.h"
+#include "util/debug.h"
+#include "util/header.h"
+#include "util/parse-options.h"
+#include "util/symbol.h"
+
+static char const *input_name = "perf.data";
+static int force;
+
+static const char *const buildid_list_usage[] = {
+ "perf report [<options>]",
+ NULL
+};
+
+static const struct option options[] = {
+ OPT_STRING('i', "input", &input_name, "file",
+ "input file name"),
+ OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
+ OPT_BOOLEAN('v', "verbose", &verbose,
+ "be more verbose (show counter open errors, etc)"),
+ OPT_END()
+};
+
+static int perf_file_section__process_buildids(struct perf_file_section *self,
+ int feat, int fd)
+{
+ if (feat != HEADER_BUILD_ID)
+ return 0;
+
+ if (lseek(fd, self->offset, SEEK_SET) < 0) {
+ pr_warning("Failed to lseek to %Ld offset for buildids!\n",
+ self->offset);
+ return -1;
+ }
+
+ if (perf_header__read_build_ids(fd, self->offset, self->size)) {
+ pr_warning("Failed to read buildids!\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int __cmd_buildid_list(void)
+{
+ int err = -1;
+ struct perf_header *header;
+ struct perf_file_header f_header;
+ struct stat input_stat;
+ int input = open(input_name, O_RDONLY);
+
+ if (input < 0) {
+ pr_err("failed to open file: %s", input_name);
+ if (!strcmp(input_name, "perf.data"))
+ pr_err(" (try 'perf record' first)");
+ pr_err("\n");
+ goto out;
+ }
+
+ err = fstat(input, &input_stat);
+ if (err < 0) {
+ perror("failed to stat file");
+ goto out_close;
+ }
+
+ if (!force && input_stat.st_uid && (input_stat.st_uid != geteuid())) {
+ pr_err("file %s not owned by current user or root\n",
+ input_name);
+ goto out_close;
+ }
+
+ if (!input_stat.st_size) {
+ pr_info("zero-sized file, nothing to do!\n");
+ goto out_close;
+ }
+
+ err = -1;
+ header = perf_header__new();
+ if (header == NULL)
+ goto out_close;
+
+ if (perf_file_header__read(&f_header, header, input) < 0) {
+ pr_warning("incompatible file format");
+ goto out_close;
+ }
+
+ err = perf_header__process_sections(header, input,
+ perf_file_section__process_buildids);
+
+ if (err < 0)
+ goto out_close;
+
+ dsos__fprintf_buildid(stdout);
+out_close:
+ close(input);
+out:
+ return err;
+}
+
+int cmd_buildid_list(int argc, const char **argv, const char *prefix __used)
+{
+ argc = parse_options(argc, argv, options, buildid_list_usage, 0);
+ setup_pager();
+ return __cmd_buildid_list();
+}
diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
index f0cd5b1..e97954a 100644
--- a/tools/perf/builtin.h
+++ b/tools/perf/builtin.h
@@ -16,6 +16,7 @@ extern int check_pager_config(const char *cmd);
extern int cmd_annotate(int argc, const char **argv, const char *prefix);
extern int cmd_bench(int argc, const char **argv, const char *prefix);
+extern int cmd_buildid_list(int argc, const char **argv, const char *prefix);
extern int cmd_help(int argc, const char **argv, const char *prefix);
extern int cmd_sched(int argc, const char **argv, const char *prefix);
extern int cmd_list(int argc, const char **argv, const char *prefix);
diff --git a/tools/perf/command-list.txt b/tools/perf/command-list.txt
index 981c40b..d37b16c 100644
--- a/tools/perf/command-list.txt
+++ b/tools/perf/command-list.txt
@@ -4,6 +4,7 @@
#
perf-annotate mainporcelain common
perf-bench mainporcelain common
+perf-buildid-list mainporcelain common
perf-list mainporcelain common
perf-sched mainporcelain common
perf-record mainporcelain common
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index 8936786..53359eb 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -287,6 +287,7 @@ static void handle_internal_command(int argc, const char **argv)
static struct cmd_struct commands[] = {
{ "help", cmd_help, 0 },
{ "list", cmd_list, 0 },
+ { "buildid-list", cmd_buildid_list, 0 },
{ "record", cmd_record, 0 },
{ "report", cmd_report, 0 },
{ "bench", cmd_bench, 0 },
^ permalink raw reply related [flat|nested] 20+ messages in thread
end of thread, other threads:[~2009-11-16 21:12 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-11-16 18:32 [PATCH 1/5] perf symbols: pass the offset to perf_header__read_build_ids Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 2/5] perf tools: debug.h needs to include event.h for event_t Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 3/5] perf tools: Generalize perf_header__adds_read Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 4/5] perf tools: Introduce dsos__fprintf_buildid Arnaldo Carvalho de Melo
2009-11-16 18:32 ` [PATCH 5/5] perf buildid-list: New plumbing command Arnaldo Carvalho de Melo
2009-11-16 18:58 ` Frederic Weisbecker
2009-11-16 19:41 ` Arnaldo Carvalho de Melo
2009-11-16 20:58 ` Ingo Molnar
2009-11-16 21:04 ` Arnaldo Carvalho de Melo
2009-11-16 21:07 ` Ingo Molnar
2009-11-16 21:05 ` Peter Zijlstra
2009-11-16 21:02 ` Ingo Molnar
2009-11-16 21:05 ` Arnaldo Carvalho de Melo
2009-11-16 21:06 ` Ingo Molnar
2009-11-16 21:10 ` [tip:perf/core] " tip-bot for Arnaldo Carvalho de Melo
2009-11-16 21:10 ` [tip:perf/core] perf tools: Introduce dsos__fprintf_buildid tip-bot for Arnaldo Carvalho de Melo
2009-11-16 19:02 ` [PATCH 3/5] perf tools: Generalize perf_header__adds_read Frederic Weisbecker
2009-11-16 21:10 ` [tip:perf/core] perf tools: Generalize perf_header__adds_read() tip-bot for Arnaldo Carvalho de Melo
2009-11-16 21:10 ` [tip:perf/core] perf tools: Debug.h needs to include event.h for event_t tip-bot for Arnaldo Carvalho de Melo
2009-11-16 21:09 ` [tip:perf/core] perf symbols: Pass the offset to perf_header__read_build_ids() tip-bot for Arnaldo Carvalho de Melo
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.