* [PATCH 1/3] perf tools: Factorize high level dso helpers
2009-08-12 9:25 [GIT PULL] perf tools: Factorize common code Frederic Weisbecker
@ 2009-08-12 9:26 ` Frederic Weisbecker
2009-08-12 9:59 ` Frederic Weisbecker
2009-08-12 9:26 ` [PATCH 2/3] perf tools: Factorize the event structure definitions in a single file Frederic Weisbecker
` (4 subsequent siblings)
5 siblings, 1 reply; 17+ messages in thread
From: Frederic Weisbecker @ 2009-08-12 9:26 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Frederic Weisbecker, Arnaldo Carvalho de Melo,
Peter Zijlstra, Mike Galbraith, Brice Goglin
Factorize multiple definitions of high level dso helpers into the
symbol source file.
The side effect is a general export of the verbose and eprintf
debugging helpers into a new file dedicated to debugging purposes.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Brice Goglin <Brice.Goglin@inria.fr>
---
tools/perf/Makefile | 1 +
tools/perf/builtin-annotate.c | 96 ----------------------------------------
tools/perf/builtin-record.c | 1 -
tools/perf/builtin-report.c | 97 -----------------------------------------
tools/perf/builtin-stat.c | 1 -
tools/perf/builtin-top.c | 4 --
tools/perf/builtin.h | 1 +
tools/perf/perf.h | 1 +
tools/perf/util/symbol.c | 97 +++++++++++++++++++++++++++++++++++++++++
tools/perf/util/symbol.h | 11 +++++
10 files changed, 111 insertions(+), 199 deletions(-)
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index de7beac..2aee21b 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -339,6 +339,7 @@ LIB_OBJS += util/pager.o
LIB_OBJS += util/header.o
LIB_OBJS += util/callchain.o
LIB_OBJS += util/values.o
+LIB_OBJS += util/debug.o
BUILTIN_OBJS += builtin-annotate.o
BUILTIN_OBJS += builtin-help.o
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 1dba568..1a79299 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -26,7 +26,6 @@
#define SHOW_HV 4
static char const *input_name = "perf.data";
-static char *vmlinux = "vmlinux";
static char default_sort_order[] = "comm,symbol";
static char *sort_order = default_sort_order;
@@ -37,9 +36,6 @@ static int show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV;
static int dump_trace = 0;
#define dprintf(x...) do { if (dump_trace) printf(x); } while (0)
-static int verbose;
-
-static int modules;
static int full_paths;
@@ -89,98 +85,6 @@ struct sym_ext {
char *path;
};
-static LIST_HEAD(dsos);
-static struct dso *kernel_dso;
-static struct dso *vdso;
-
-
-static void dsos__add(struct dso *dso)
-{
- list_add_tail(&dso->node, &dsos);
-}
-
-static struct dso *dsos__find(const char *name)
-{
- struct dso *pos;
-
- list_for_each_entry(pos, &dsos, node)
- if (strcmp(pos->name, name) == 0)
- return pos;
- return NULL;
-}
-
-static struct dso *dsos__findnew(const char *name)
-{
- struct dso *dso = dsos__find(name);
- int nr;
-
- if (dso)
- return dso;
-
- dso = dso__new(name, 0);
- if (!dso)
- goto out_delete_dso;
-
- nr = dso__load(dso, NULL, verbose);
- if (nr < 0) {
- if (verbose)
- fprintf(stderr, "Failed to open: %s\n", name);
- goto out_delete_dso;
- }
- if (!nr && verbose) {
- fprintf(stderr,
- "No symbols found in: %s, maybe install a debug package?\n",
- name);
- }
-
- dsos__add(dso);
-
- return dso;
-
-out_delete_dso:
- dso__delete(dso);
- return NULL;
-}
-
-static void dsos__fprintf(FILE *fp)
-{
- struct dso *pos;
-
- list_for_each_entry(pos, &dsos, node)
- dso__fprintf(pos, fp);
-}
-
-static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
-{
- return dso__find_symbol(dso, ip);
-}
-
-static int load_kernel(void)
-{
- int err;
-
- kernel_dso = dso__new("[kernel]", 0);
- if (!kernel_dso)
- return -1;
-
- err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
- if (err <= 0) {
- dso__delete(kernel_dso);
- kernel_dso = NULL;
- } else
- dsos__add(kernel_dso);
-
- vdso = dso__new("[vdso]", 0);
- if (!vdso)
- return -1;
-
- vdso->find_symbol = vdso__find_symbol;
-
- dsos__add(vdso);
-
- return err;
-}
-
struct map {
struct list_head node;
u64 start;
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 0345aad..afae387 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -40,7 +40,6 @@ static int inherit = 1;
static int force = 0;
static int append_file = 0;
static int call_graph = 0;
-static int verbose = 0;
static int inherit_stat = 0;
static int no_samples = 0;
static int sample_address = 0;
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 2357c66..827eab2 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -30,7 +30,6 @@
#define SHOW_HV 4
static char const *input_name = "perf.data";
-static char *vmlinux = NULL;
static char default_sort_order[] = "comm,dso,symbol";
static char *sort_order = default_sort_order;
@@ -46,11 +45,6 @@ static int dump_trace = 0;
#define dprintf(x...) do { if (dump_trace) printf(x); } while (0)
#define cdprintf(x...) do { if (dump_trace) color_fprintf(stdout, color, x); } while (0)
-static int verbose;
-#define eprintf(x...) do { if (verbose) fprintf(stderr, x); } while (0)
-
-static int modules;
-
static int full_paths;
static int show_nr_samples;
@@ -161,98 +155,7 @@ static int repsep_fprintf(FILE *fp, const char *fmt, ...)
return n;
}
-static LIST_HEAD(dsos);
-static struct dso *kernel_dso;
-static struct dso *vdso;
-static struct dso *hypervisor_dso;
-
-static void dsos__add(struct dso *dso)
-{
- list_add_tail(&dso->node, &dsos);
-}
-
-static struct dso *dsos__find(const char *name)
-{
- struct dso *pos;
-
- list_for_each_entry(pos, &dsos, node)
- if (strcmp(pos->name, name) == 0)
- return pos;
- return NULL;
-}
-
-static struct dso *dsos__findnew(const char *name)
-{
- struct dso *dso = dsos__find(name);
- int nr;
-
- if (dso)
- return dso;
-
- dso = dso__new(name, 0);
- if (!dso)
- goto out_delete_dso;
-
- nr = dso__load(dso, NULL, verbose);
- if (nr < 0) {
- eprintf("Failed to open: %s\n", name);
- goto out_delete_dso;
- }
- if (!nr)
- eprintf("No symbols found in: %s, maybe install a debug package?\n", name);
-
- dsos__add(dso);
-
- return dso;
-
-out_delete_dso:
- dso__delete(dso);
- return NULL;
-}
-
-static void dsos__fprintf(FILE *fp)
-{
- struct dso *pos;
-
- list_for_each_entry(pos, &dsos, node)
- dso__fprintf(pos, fp);
-}
-
-static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
-{
- return dso__find_symbol(dso, ip);
-}
-
-static int load_kernel(void)
-{
- int err;
-
- kernel_dso = dso__new("[kernel]", 0);
- if (!kernel_dso)
- return -1;
-
- err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
- if (err <= 0) {
- dso__delete(kernel_dso);
- kernel_dso = NULL;
- } else
- dsos__add(kernel_dso);
-
- vdso = dso__new("[vdso]", 0);
- if (!vdso)
- return -1;
- vdso->find_symbol = vdso__find_symbol;
-
- dsos__add(vdso);
-
- hypervisor_dso = dso__new("[hypervisor]", 0);
- if (!hypervisor_dso)
- return -1;
- dsos__add(hypervisor_dso);
-
- return err;
-}
static char __cwd[PATH_MAX];
static char *cwd = __cwd;
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index b4b06c7..4b9dd4a 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -63,7 +63,6 @@ static struct perf_counter_attr default_attrs[] = {
#define MAX_RUN 100
static int system_wide = 0;
-static int verbose = 0;
static unsigned int nr_cpus = 0;
static int run_idx = 0;
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 7de28ce..0aa5673 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -68,8 +68,6 @@ static int group = 0;
static unsigned int page_size;
static unsigned int mmap_pages = 16;
static int freq = 0;
-static int verbose = 0;
-static char *vmlinux = NULL;
static int delay_secs = 2;
static int zero;
@@ -338,8 +336,6 @@ static void show_details(struct sym_entry *syme)
printf("%d lines not displayed, maybe increase display entries [e]\n", more);
}
-struct dso *kernel_dso;
-
/*
* Symbols will be added here in record_ip and will get out
* after decayed.
diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
index 51d1682..3a63e41 100644
--- a/tools/perf/builtin.h
+++ b/tools/perf/builtin.h
@@ -22,5 +22,6 @@ extern int cmd_stat(int argc, const char **argv, const char *prefix);
extern int cmd_top(int argc, const char **argv, const char *prefix);
extern int cmd_version(int argc, const char **argv, const char *prefix);
extern int cmd_list(int argc, const char **argv, const char *prefix);
+extern int cmd_trace(int argc, const char **argv, const char *prefix);
#endif
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index e5148e2..f550921 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -48,6 +48,7 @@
#include "../../include/linux/perf_counter.h"
#include "util/types.h"
+#include "util/debug.h"
/*
* prctl(PR_TASK_PERF_COUNTERS_DISABLE) will (cheaply) disable all
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index f1dcede..e9b13b4 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -937,6 +937,103 @@ int dso__load_kernel(struct dso *self, const char *vmlinux,
return err;
}
+LIST_HEAD(dsos);
+struct dso *kernel_dso;
+struct dso *vdso;
+struct dso *hypervisor_dso;
+
+char *vmlinux = "vmlinux";
+int modules;
+
+static void dsos__add(struct dso *dso)
+{
+ list_add_tail(&dso->node, &dsos);
+}
+
+static struct dso *dsos__find(const char *name)
+{
+ struct dso *pos;
+
+ list_for_each_entry(pos, &dsos, node)
+ if (strcmp(pos->name, name) == 0)
+ return pos;
+ return NULL;
+}
+
+struct dso *dsos__findnew(const char *name)
+{
+ struct dso *dso = dsos__find(name);
+ int nr;
+
+ if (dso)
+ return dso;
+
+ dso = dso__new(name, 0);
+ if (!dso)
+ goto out_delete_dso;
+
+ nr = dso__load(dso, NULL, verbose);
+ if (nr < 0) {
+ eprintf("Failed to open: %s\n", name);
+ goto out_delete_dso;
+ }
+ if (!nr)
+ eprintf("No symbols found in: %s, maybe install a debug package?\n", name);
+
+ dsos__add(dso);
+
+ return dso;
+
+out_delete_dso:
+ dso__delete(dso);
+ return NULL;
+}
+
+void dsos__fprintf(FILE *fp)
+{
+ struct dso *pos;
+
+ list_for_each_entry(pos, &dsos, node)
+ dso__fprintf(pos, fp);
+}
+
+static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
+{
+ return dso__find_symbol(dso, ip);
+}
+
+int load_kernel(void)
+{
+ int err;
+
+ kernel_dso = dso__new("[kernel]", 0);
+ if (!kernel_dso)
+ return -1;
+
+ err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
+ if (err <= 0) {
+ dso__delete(kernel_dso);
+ kernel_dso = NULL;
+ } else
+ dsos__add(kernel_dso);
+
+ vdso = dso__new("[vdso]", 0);
+ if (!vdso)
+ return -1;
+
+ vdso->find_symbol = vdso__find_symbol;
+
+ dsos__add(vdso);
+
+ hypervisor_dso = dso__new("[hypervisor]", 0);
+ if (!hypervisor_dso)
+ return -1;
+ dsos__add(hypervisor_dso);
+
+ return err;
+}
+
+
void symbol__init(void)
{
elf_version(EV_CURRENT);
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index 1e003ec..f3490fc 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -48,9 +48,20 @@ int dso__load_kernel(struct dso *self, const char *vmlinux,
symbol_filter_t filter, int verbose, int modules);
int dso__load_modules(struct dso *self, symbol_filter_t filter, int verbose);
int dso__load(struct dso *self, symbol_filter_t filter, int verbose);
+struct dso *dsos__findnew(const char *name);
+void dsos__fprintf(FILE *fp);
size_t dso__fprintf(struct dso *self, FILE *fp);
char dso__symtab_origin(const struct dso *self);
+int load_kernel(void);
+
void symbol__init(void);
+
+extern struct list_head dsos;
+extern struct dso *kernel_dso;
+extern struct dso *vdso;
+extern struct dso *hypervisor_dso;
+extern char *vmlinux;
+extern int modules;
#endif /* _PERF_SYMBOL_ */
--
1.6.2.3
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PATCH 1/3] perf tools: Factorize high level dso helpers
2009-08-12 9:26 ` [PATCH 1/3] perf tools: Factorize high level dso helpers Frederic Weisbecker
@ 2009-08-12 9:59 ` Frederic Weisbecker
2009-08-12 10:08 ` Ingo Molnar
0 siblings, 1 reply; 17+ messages in thread
From: Frederic Weisbecker @ 2009-08-12 9:59 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Arnaldo Carvalho de Melo, Peter Zijlstra, Mike Galbraith,
Brice Goglin
On Wed, Aug 12, 2009 at 11:26:00AM +0200, Frederic Weisbecker wrote:
> Factorize multiple definitions of high level dso helpers into the
> symbol source file.
>
> The side effect is a general export of the verbose and eprintf
> debugging helpers into a new file dedicated to debugging purposes.
>
> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Mike Galbraith <efault@gmx.de>
> Cc: Brice Goglin <Brice.Goglin@inria.fr>
> ---
> tools/perf/Makefile | 1 +
> tools/perf/builtin-annotate.c | 96 ----------------------------------------
> tools/perf/builtin-record.c | 1 -
> tools/perf/builtin-report.c | 97 -----------------------------------------
> tools/perf/builtin-stat.c | 1 -
> tools/perf/builtin-top.c | 4 --
> tools/perf/builtin.h | 1 +
> tools/perf/perf.h | 1 +
> tools/perf/util/symbol.c | 97 +++++++++++++++++++++++++++++++++++++++++
> tools/perf/util/symbol.h | 11 +++++
> 10 files changed, 111 insertions(+), 199 deletions(-)
>
> diff --git a/tools/perf/Makefile b/tools/perf/Makefile
> index de7beac..2aee21b 100644
> --- a/tools/perf/Makefile
> +++ b/tools/perf/Makefile
> @@ -339,6 +339,7 @@ LIB_OBJS += util/pager.o
> LIB_OBJS += util/header.o
> LIB_OBJS += util/callchain.o
> LIB_OBJS += util/values.o
> +LIB_OBJS += util/debug.o
Damn, did I forgot to git-add util/debug.c ?
How could I fix this? Another pull request?
Frederic.
>
> BUILTIN_OBJS += builtin-annotate.o
> BUILTIN_OBJS += builtin-help.o
> diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> index 1dba568..1a79299 100644
> --- a/tools/perf/builtin-annotate.c
> +++ b/tools/perf/builtin-annotate.c
> @@ -26,7 +26,6 @@
> #define SHOW_HV 4
>
> static char const *input_name = "perf.data";
> -static char *vmlinux = "vmlinux";
>
> static char default_sort_order[] = "comm,symbol";
> static char *sort_order = default_sort_order;
> @@ -37,9 +36,6 @@ static int show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV;
> static int dump_trace = 0;
> #define dprintf(x...) do { if (dump_trace) printf(x); } while (0)
>
> -static int verbose;
> -
> -static int modules;
>
> static int full_paths;
>
> @@ -89,98 +85,6 @@ struct sym_ext {
> char *path;
> };
>
> -static LIST_HEAD(dsos);
> -static struct dso *kernel_dso;
> -static struct dso *vdso;
> -
> -
> -static void dsos__add(struct dso *dso)
> -{
> - list_add_tail(&dso->node, &dsos);
> -}
> -
> -static struct dso *dsos__find(const char *name)
> -{
> - struct dso *pos;
> -
> - list_for_each_entry(pos, &dsos, node)
> - if (strcmp(pos->name, name) == 0)
> - return pos;
> - return NULL;
> -}
> -
> -static struct dso *dsos__findnew(const char *name)
> -{
> - struct dso *dso = dsos__find(name);
> - int nr;
> -
> - if (dso)
> - return dso;
> -
> - dso = dso__new(name, 0);
> - if (!dso)
> - goto out_delete_dso;
> -
> - nr = dso__load(dso, NULL, verbose);
> - if (nr < 0) {
> - if (verbose)
> - fprintf(stderr, "Failed to open: %s\n", name);
> - goto out_delete_dso;
> - }
> - if (!nr && verbose) {
> - fprintf(stderr,
> - "No symbols found in: %s, maybe install a debug package?\n",
> - name);
> - }
> -
> - dsos__add(dso);
> -
> - return dso;
> -
> -out_delete_dso:
> - dso__delete(dso);
> - return NULL;
> -}
> -
> -static void dsos__fprintf(FILE *fp)
> -{
> - struct dso *pos;
> -
> - list_for_each_entry(pos, &dsos, node)
> - dso__fprintf(pos, fp);
> -}
> -
> -static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
> -{
> - return dso__find_symbol(dso, ip);
> -}
> -
> -static int load_kernel(void)
> -{
> - int err;
> -
> - kernel_dso = dso__new("[kernel]", 0);
> - if (!kernel_dso)
> - return -1;
> -
> - err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
> - if (err <= 0) {
> - dso__delete(kernel_dso);
> - kernel_dso = NULL;
> - } else
> - dsos__add(kernel_dso);
> -
> - vdso = dso__new("[vdso]", 0);
> - if (!vdso)
> - return -1;
> -
> - vdso->find_symbol = vdso__find_symbol;
> -
> - dsos__add(vdso);
> -
> - return err;
> -}
> -
> struct map {
> struct list_head node;
> u64 start;
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index 0345aad..afae387 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -40,7 +40,6 @@ static int inherit = 1;
> static int force = 0;
> static int append_file = 0;
> static int call_graph = 0;
> -static int verbose = 0;
> static int inherit_stat = 0;
> static int no_samples = 0;
> static int sample_address = 0;
> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> index 2357c66..827eab2 100644
> --- a/tools/perf/builtin-report.c
> +++ b/tools/perf/builtin-report.c
> @@ -30,7 +30,6 @@
> #define SHOW_HV 4
>
> static char const *input_name = "perf.data";
> -static char *vmlinux = NULL;
>
> static char default_sort_order[] = "comm,dso,symbol";
> static char *sort_order = default_sort_order;
> @@ -46,11 +45,6 @@ static int dump_trace = 0;
> #define dprintf(x...) do { if (dump_trace) printf(x); } while (0)
> #define cdprintf(x...) do { if (dump_trace) color_fprintf(stdout, color, x); } while (0)
>
> -static int verbose;
> -#define eprintf(x...) do { if (verbose) fprintf(stderr, x); } while (0)
> -
> -static int modules;
> -
> static int full_paths;
> static int show_nr_samples;
>
> @@ -161,98 +155,7 @@ static int repsep_fprintf(FILE *fp, const char *fmt, ...)
> return n;
> }
>
> -static LIST_HEAD(dsos);
> -static struct dso *kernel_dso;
> -static struct dso *vdso;
> -static struct dso *hypervisor_dso;
> -
> -static void dsos__add(struct dso *dso)
> -{
> - list_add_tail(&dso->node, &dsos);
> -}
> -
> -static struct dso *dsos__find(const char *name)
> -{
> - struct dso *pos;
> -
> - list_for_each_entry(pos, &dsos, node)
> - if (strcmp(pos->name, name) == 0)
> - return pos;
> - return NULL;
> -}
> -
> -static struct dso *dsos__findnew(const char *name)
> -{
> - struct dso *dso = dsos__find(name);
> - int nr;
> -
> - if (dso)
> - return dso;
> -
> - dso = dso__new(name, 0);
> - if (!dso)
> - goto out_delete_dso;
> -
> - nr = dso__load(dso, NULL, verbose);
> - if (nr < 0) {
> - eprintf("Failed to open: %s\n", name);
> - goto out_delete_dso;
> - }
> - if (!nr)
> - eprintf("No symbols found in: %s, maybe install a debug package?\n", name);
> -
> - dsos__add(dso);
> -
> - return dso;
> -
> -out_delete_dso:
> - dso__delete(dso);
> - return NULL;
> -}
> -
> -static void dsos__fprintf(FILE *fp)
> -{
> - struct dso *pos;
> -
> - list_for_each_entry(pos, &dsos, node)
> - dso__fprintf(pos, fp);
> -}
> -
> -static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
> -{
> - return dso__find_symbol(dso, ip);
> -}
> -
> -static int load_kernel(void)
> -{
> - int err;
> -
> - kernel_dso = dso__new("[kernel]", 0);
> - if (!kernel_dso)
> - return -1;
> -
> - err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
> - if (err <= 0) {
> - dso__delete(kernel_dso);
> - kernel_dso = NULL;
> - } else
> - dsos__add(kernel_dso);
> -
> - vdso = dso__new("[vdso]", 0);
> - if (!vdso)
> - return -1;
>
> - vdso->find_symbol = vdso__find_symbol;
> -
> - dsos__add(vdso);
> -
> - hypervisor_dso = dso__new("[hypervisor]", 0);
> - if (!hypervisor_dso)
> - return -1;
> - dsos__add(hypervisor_dso);
> -
> - return err;
> -}
>
> static char __cwd[PATH_MAX];
> static char *cwd = __cwd;
> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> index b4b06c7..4b9dd4a 100644
> --- a/tools/perf/builtin-stat.c
> +++ b/tools/perf/builtin-stat.c
> @@ -63,7 +63,6 @@ static struct perf_counter_attr default_attrs[] = {
> #define MAX_RUN 100
>
> static int system_wide = 0;
> -static int verbose = 0;
> static unsigned int nr_cpus = 0;
> static int run_idx = 0;
>
> diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
> index 7de28ce..0aa5673 100644
> --- a/tools/perf/builtin-top.c
> +++ b/tools/perf/builtin-top.c
> @@ -68,8 +68,6 @@ static int group = 0;
> static unsigned int page_size;
> static unsigned int mmap_pages = 16;
> static int freq = 0;
> -static int verbose = 0;
> -static char *vmlinux = NULL;
>
> static int delay_secs = 2;
> static int zero;
> @@ -338,8 +336,6 @@ static void show_details(struct sym_entry *syme)
> printf("%d lines not displayed, maybe increase display entries [e]\n", more);
> }
>
> -struct dso *kernel_dso;
> -
> /*
> * Symbols will be added here in record_ip and will get out
> * after decayed.
> diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
> index 51d1682..3a63e41 100644
> --- a/tools/perf/builtin.h
> +++ b/tools/perf/builtin.h
> @@ -22,5 +22,6 @@ extern int cmd_stat(int argc, const char **argv, const char *prefix);
> extern int cmd_top(int argc, const char **argv, const char *prefix);
> extern int cmd_version(int argc, const char **argv, const char *prefix);
> extern int cmd_list(int argc, const char **argv, const char *prefix);
> +extern int cmd_trace(int argc, const char **argv, const char *prefix);
>
> #endif
> diff --git a/tools/perf/perf.h b/tools/perf/perf.h
> index e5148e2..f550921 100644
> --- a/tools/perf/perf.h
> +++ b/tools/perf/perf.h
> @@ -48,6 +48,7 @@
>
> #include "../../include/linux/perf_counter.h"
> #include "util/types.h"
> +#include "util/debug.h"
>
> /*
> * prctl(PR_TASK_PERF_COUNTERS_DISABLE) will (cheaply) disable all
> diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> index f1dcede..e9b13b4 100644
> --- a/tools/perf/util/symbol.c
> +++ b/tools/perf/util/symbol.c
> @@ -937,6 +937,103 @@ int dso__load_kernel(struct dso *self, const char *vmlinux,
> return err;
> }
>
> +LIST_HEAD(dsos);
> +struct dso *kernel_dso;
> +struct dso *vdso;
> +struct dso *hypervisor_dso;
> +
> +char *vmlinux = "vmlinux";
> +int modules;
> +
> +static void dsos__add(struct dso *dso)
> +{
> + list_add_tail(&dso->node, &dsos);
> +}
> +
> +static struct dso *dsos__find(const char *name)
> +{
> + struct dso *pos;
> +
> + list_for_each_entry(pos, &dsos, node)
> + if (strcmp(pos->name, name) == 0)
> + return pos;
> + return NULL;
> +}
> +
> +struct dso *dsos__findnew(const char *name)
> +{
> + struct dso *dso = dsos__find(name);
> + int nr;
> +
> + if (dso)
> + return dso;
> +
> + dso = dso__new(name, 0);
> + if (!dso)
> + goto out_delete_dso;
> +
> + nr = dso__load(dso, NULL, verbose);
> + if (nr < 0) {
> + eprintf("Failed to open: %s\n", name);
> + goto out_delete_dso;
> + }
> + if (!nr)
> + eprintf("No symbols found in: %s, maybe install a debug package?\n", name);
> +
> + dsos__add(dso);
> +
> + return dso;
> +
> +out_delete_dso:
> + dso__delete(dso);
> + return NULL;
> +}
> +
> +void dsos__fprintf(FILE *fp)
> +{
> + struct dso *pos;
> +
> + list_for_each_entry(pos, &dsos, node)
> + dso__fprintf(pos, fp);
> +}
> +
> +static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
> +{
> + return dso__find_symbol(dso, ip);
> +}
> +
> +int load_kernel(void)
> +{
> + int err;
> +
> + kernel_dso = dso__new("[kernel]", 0);
> + if (!kernel_dso)
> + return -1;
> +
> + err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
> + if (err <= 0) {
> + dso__delete(kernel_dso);
> + kernel_dso = NULL;
> + } else
> + dsos__add(kernel_dso);
> +
> + vdso = dso__new("[vdso]", 0);
> + if (!vdso)
> + return -1;
> +
> + vdso->find_symbol = vdso__find_symbol;
> +
> + dsos__add(vdso);
> +
> + hypervisor_dso = dso__new("[hypervisor]", 0);
> + if (!hypervisor_dso)
> + return -1;
> + dsos__add(hypervisor_dso);
> +
> + return err;
> +}
> +
> +
> void symbol__init(void)
> {
> elf_version(EV_CURRENT);
> diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
> index 1e003ec..f3490fc 100644
> --- a/tools/perf/util/symbol.h
> +++ b/tools/perf/util/symbol.h
> @@ -48,9 +48,20 @@ int dso__load_kernel(struct dso *self, const char *vmlinux,
> symbol_filter_t filter, int verbose, int modules);
> int dso__load_modules(struct dso *self, symbol_filter_t filter, int verbose);
> int dso__load(struct dso *self, symbol_filter_t filter, int verbose);
> +struct dso *dsos__findnew(const char *name);
> +void dsos__fprintf(FILE *fp);
>
> size_t dso__fprintf(struct dso *self, FILE *fp);
> char dso__symtab_origin(const struct dso *self);
>
> +int load_kernel(void);
> +
> void symbol__init(void);
> +
> +extern struct list_head dsos;
> +extern struct dso *kernel_dso;
> +extern struct dso *vdso;
> +extern struct dso *hypervisor_dso;
> +extern char *vmlinux;
> +extern int modules;
> #endif /* _PERF_SYMBOL_ */
> --
> 1.6.2.3
>
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PATCH 1/3] perf tools: Factorize high level dso helpers
2009-08-12 9:59 ` Frederic Weisbecker
@ 2009-08-12 10:08 ` Ingo Molnar
2009-08-12 10:48 ` [GIT PULL v2] perf tools: Factorize common code Frederic Weisbecker
` (3 more replies)
0 siblings, 4 replies; 17+ messages in thread
From: Ingo Molnar @ 2009-08-12 10:08 UTC (permalink / raw)
To: Frederic Weisbecker
Cc: LKML, Arnaldo Carvalho de Melo, Peter Zijlstra, Mike Galbraith,
Brice Goglin
* Frederic Weisbecker <fweisbec@gmail.com> wrote:
> On Wed, Aug 12, 2009 at 11:26:00AM +0200, Frederic Weisbecker wrote:
> > Factorize multiple definitions of high level dso helpers into the
> > symbol source file.
> >
> > The side effect is a general export of the verbose and eprintf
> > debugging helpers into a new file dedicated to debugging purposes.
> >
> > Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
> > Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> > Cc: Peter Zijlstra <peterz@infradead.org>
> > Cc: Mike Galbraith <efault@gmx.de>
> > Cc: Brice Goglin <Brice.Goglin@inria.fr>
> > ---
> > tools/perf/Makefile | 1 +
> > tools/perf/builtin-annotate.c | 96 ----------------------------------------
> > tools/perf/builtin-record.c | 1 -
> > tools/perf/builtin-report.c | 97 -----------------------------------------
> > tools/perf/builtin-stat.c | 1 -
> > tools/perf/builtin-top.c | 4 --
> > tools/perf/builtin.h | 1 +
> > tools/perf/perf.h | 1 +
> > tools/perf/util/symbol.c | 97 +++++++++++++++++++++++++++++++++++++++++
> > tools/perf/util/symbol.h | 11 +++++
> > 10 files changed, 111 insertions(+), 199 deletions(-)
> >
> > diff --git a/tools/perf/Makefile b/tools/perf/Makefile
> > index de7beac..2aee21b 100644
> > --- a/tools/perf/Makefile
> > +++ b/tools/perf/Makefile
> > @@ -339,6 +339,7 @@ LIB_OBJS += util/pager.o
> > LIB_OBJS += util/header.o
> > LIB_OBJS += util/callchain.o
> > LIB_OBJS += util/values.o
> > +LIB_OBJS += util/debug.o
>
>
> Damn, did I forgot to git-add util/debug.c ?
>
> How could I fix this? Another pull request?
yeah. I've zapped those commits from perfcounters/core.
Ingo
^ permalink raw reply [flat|nested] 17+ messages in thread* [GIT PULL v2] perf tools: Factorize common code
2009-08-12 10:08 ` Ingo Molnar
@ 2009-08-12 10:48 ` Frederic Weisbecker
2009-08-12 10:54 ` Ingo Molnar
2009-08-12 13:54 ` Arnaldo Carvalho de Melo
2009-08-12 10:48 ` [PATCH 1/3 v2] perf tools: Factorize high level dso helpers Frederic Weisbecker
` (2 subsequent siblings)
3 siblings, 2 replies; 17+ messages in thread
From: Frederic Weisbecker @ 2009-08-12 10:48 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Frederic Weisbecker, Arnaldo Carvalho de Melo,
Peter Zijlstra, Mike Galbraith, Brice Goglin
On Wed, Aug 12, 2009 at 12:08:51PM +0200, Ingo Molnar wrote:
> yeah. I've zapped those commits from perfcounters/core.
>
> Ingo
Ok, sorry about that.
I've rebuilt a clean tree. It should be fine now.
Thanks.
The following changes since commit 9f8666971185b86615a074bcac67c90fdf8af8bc:
Brice Goglin (1):
perf report: Add raw displaying of per-thread counters
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing.git \
perfcounters/core
Frederic Weisbecker (3):
perf tools: Factorize high level dso helpers
perf tools: Factorize the event structure definitions in a single file
perf tools: Factorize the map helpers
tools/perf/Makefile | 2 +
tools/perf/builtin-annotate.c | 209 +-------------------------------
tools/perf/builtin-record.c | 20 +---
tools/perf/builtin-report.c | 274 +----------------------------------------
tools/perf/builtin-stat.c | 1 -
tools/perf/builtin-top.c | 24 ----
tools/perf/builtin.h | 1 +
tools/perf/perf.h | 1 +
tools/perf/util/callchain.h | 1 +
tools/perf/util/debug.c | 22 ++++
tools/perf/util/debug.h | 5 +
tools/perf/util/event.h | 84 +++++++++++++
tools/perf/util/map.c | 97 +++++++++++++++
tools/perf/util/symbol.c | 97 +++++++++++++++
tools/perf/util/symbol.h | 12 ++
tools/perf/util/util.h | 1 +
16 files changed, 330 insertions(+), 521 deletions(-)
create mode 100644 tools/perf/util/debug.c
create mode 100644 tools/perf/util/debug.h
create mode 100644 tools/perf/util/event.h
create mode 100644 tools/perf/util/map.c
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [GIT PULL v2] perf tools: Factorize common code
2009-08-12 10:48 ` [GIT PULL v2] perf tools: Factorize common code Frederic Weisbecker
@ 2009-08-12 10:54 ` Ingo Molnar
2009-08-12 11:00 ` Frederic Weisbecker
2009-08-12 13:54 ` Arnaldo Carvalho de Melo
1 sibling, 1 reply; 17+ messages in thread
From: Ingo Molnar @ 2009-08-12 10:54 UTC (permalink / raw)
To: Frederic Weisbecker
Cc: LKML, Arnaldo Carvalho de Melo, Peter Zijlstra, Mike Galbraith,
Brice Goglin
* Frederic Weisbecker <fweisbec@gmail.com> wrote:
> On Wed, Aug 12, 2009 at 12:08:51PM +0200, Ingo Molnar wrote:
> > yeah. I've zapped those commits from perfcounters/core.
> >
> > Ingo
>
> Ok, sorry about that.
> I've rebuilt a clean tree. It should be fine now.
btw., you can always check whether there's any missing
git-add, via:
git ls-files --others
And the safest way to commit is to use 'git commit -a' -
that will auto-include new files. (but the tree has to be
clean for that)
>
> Thanks.
>
> The following changes since commit 9f8666971185b86615a074bcac67c90fdf8af8bc:
> Brice Goglin (1):
> perf report: Add raw displaying of per-thread counters
>
> are available in the git repository at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing.git \
> perfcounters/core
>
> Frederic Weisbecker (3):
> perf tools: Factorize high level dso helpers
> perf tools: Factorize the event structure definitions in a single file
> perf tools: Factorize the map helpers
>
> tools/perf/Makefile | 2 +
> tools/perf/builtin-annotate.c | 209 +-------------------------------
> tools/perf/builtin-record.c | 20 +---
> tools/perf/builtin-report.c | 274 +----------------------------------------
> tools/perf/builtin-stat.c | 1 -
> tools/perf/builtin-top.c | 24 ----
> tools/perf/builtin.h | 1 +
> tools/perf/perf.h | 1 +
> tools/perf/util/callchain.h | 1 +
> tools/perf/util/debug.c | 22 ++++
> tools/perf/util/debug.h | 5 +
> tools/perf/util/event.h | 84 +++++++++++++
> tools/perf/util/map.c | 97 +++++++++++++++
> tools/perf/util/symbol.c | 97 +++++++++++++++
> tools/perf/util/symbol.h | 12 ++
> tools/perf/util/util.h | 1 +
> 16 files changed, 330 insertions(+), 521 deletions(-)
> create mode 100644 tools/perf/util/debug.c
> create mode 100644 tools/perf/util/debug.h
> create mode 100644 tools/perf/util/event.h
> create mode 100644 tools/perf/util/map.c
Re-pulled it - it works fine here too - thanks!
Ingo
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [GIT PULL v2] perf tools: Factorize common code
2009-08-12 10:54 ` Ingo Molnar
@ 2009-08-12 11:00 ` Frederic Weisbecker
0 siblings, 0 replies; 17+ messages in thread
From: Frederic Weisbecker @ 2009-08-12 11:00 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Arnaldo Carvalho de Melo, Peter Zijlstra, Mike Galbraith,
Brice Goglin
On Wed, Aug 12, 2009 at 12:54:33PM +0200, Ingo Molnar wrote:
>
> * Frederic Weisbecker <fweisbec@gmail.com> wrote:
>
> > On Wed, Aug 12, 2009 at 12:08:51PM +0200, Ingo Molnar wrote:
> > > yeah. I've zapped those commits from perfcounters/core.
> > >
> > > Ingo
> >
> > Ok, sorry about that.
> > I've rebuilt a clean tree. It should be fine now.
>
> btw., you can always check whether there's any missing
> git-add, via:
>
> git ls-files --others
Ah nice tip.
> And the safest way to commit is to use 'git commit -a' -
> that will auto-include new files. (but the tree has to be
> clean for that)
Well, I always have junks in my directories. .rej/.orig files,
or more especially scripts and tests in the case of the tools/perf
directory. So it's hard to check everything this way.
Note that most of the time I use git-commit -a, but it doesn't include
untracked files AFAICS.
> >
> > Thanks.
> >
> > The following changes since commit 9f8666971185b86615a074bcac67c90fdf8af8bc:
> > Brice Goglin (1):
> > perf report: Add raw displaying of per-thread counters
> >
> > are available in the git repository at:
> >
> > git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing.git \
> > perfcounters/core
> >
> > Frederic Weisbecker (3):
> > perf tools: Factorize high level dso helpers
> > perf tools: Factorize the event structure definitions in a single file
> > perf tools: Factorize the map helpers
> >
> > tools/perf/Makefile | 2 +
> > tools/perf/builtin-annotate.c | 209 +-------------------------------
> > tools/perf/builtin-record.c | 20 +---
> > tools/perf/builtin-report.c | 274 +----------------------------------------
> > tools/perf/builtin-stat.c | 1 -
> > tools/perf/builtin-top.c | 24 ----
> > tools/perf/builtin.h | 1 +
> > tools/perf/perf.h | 1 +
> > tools/perf/util/callchain.h | 1 +
> > tools/perf/util/debug.c | 22 ++++
> > tools/perf/util/debug.h | 5 +
> > tools/perf/util/event.h | 84 +++++++++++++
> > tools/perf/util/map.c | 97 +++++++++++++++
> > tools/perf/util/symbol.c | 97 +++++++++++++++
> > tools/perf/util/symbol.h | 12 ++
> > tools/perf/util/util.h | 1 +
> > 16 files changed, 330 insertions(+), 521 deletions(-)
> > create mode 100644 tools/perf/util/debug.c
> > create mode 100644 tools/perf/util/debug.h
> > create mode 100644 tools/perf/util/event.h
> > create mode 100644 tools/perf/util/map.c
>
> Re-pulled it - it works fine here too - thanks!
>
> Ingo
Cool, thanks.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [GIT PULL v2] perf tools: Factorize common code
2009-08-12 10:48 ` [GIT PULL v2] perf tools: Factorize common code Frederic Weisbecker
2009-08-12 10:54 ` Ingo Molnar
@ 2009-08-12 13:54 ` Arnaldo Carvalho de Melo
2009-08-12 14:31 ` Ingo Molnar
1 sibling, 1 reply; 17+ messages in thread
From: Arnaldo Carvalho de Melo @ 2009-08-12 13:54 UTC (permalink / raw)
To: Frederic Weisbecker
Cc: Ingo Molnar, LKML, Peter Zijlstra, Mike Galbraith, Brice Goglin
Em Wed, Aug 12, 2009 at 12:48:29PM +0200, Frederic Weisbecker escreveu:
> On Wed, Aug 12, 2009 at 12:08:51PM +0200, Ingo Molnar wrote:
> > yeah. I've zapped those commits from perfcounters/core.
> >
> > Ingo
>
> Ok, sorry about that.
> I've rebuilt a clean tree. It should be fine now.
>
> Thanks.
Thanks a lot for doing this work, I intended to do that but got
sidetracked with symbol resolving neverending corner cases 8)
- Arnaldo
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [GIT PULL v2] perf tools: Factorize common code
2009-08-12 13:54 ` Arnaldo Carvalho de Melo
@ 2009-08-12 14:31 ` Ingo Molnar
0 siblings, 0 replies; 17+ messages in thread
From: Ingo Molnar @ 2009-08-12 14:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Frederic Weisbecker, LKML, Peter Zijlstra, Mike Galbraith,
Brice Goglin
* Arnaldo Carvalho de Melo <acme@redhat.com> wrote:
> Em Wed, Aug 12, 2009 at 12:48:29PM +0200, Frederic Weisbecker escreveu:
> > On Wed, Aug 12, 2009 at 12:08:51PM +0200, Ingo Molnar wrote:
> > > yeah. I've zapped those commits from perfcounters/core.
> > >
> > > Ingo
> >
> > Ok, sorry about that.
> > I've rebuilt a clean tree. It should be fine now.
> >
> > Thanks.
>
> Thanks a lot for doing this work, I intended to do that but got
> sidetracked with symbol resolving neverending corner cases 8)
:)
Also, there's still quite a bit of code left to be factorized out of
builtin-annotate.c and builtin-report.c.
Ingo
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 1/3 v2] perf tools: Factorize high level dso helpers
2009-08-12 10:08 ` Ingo Molnar
2009-08-12 10:48 ` [GIT PULL v2] perf tools: Factorize common code Frederic Weisbecker
@ 2009-08-12 10:48 ` Frederic Weisbecker
2009-08-12 10:48 ` [PATCH 2/3 v2] perf tools: Factorize the event structure definitions in a single file Frederic Weisbecker
2009-08-12 10:48 ` [PATCH 3/3 v2] perf tools: Factorize the map helpers Frederic Weisbecker
3 siblings, 0 replies; 17+ messages in thread
From: Frederic Weisbecker @ 2009-08-12 10:48 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Frederic Weisbecker, Arnaldo Carvalho de Melo,
Peter Zijlstra, Mike Galbraith, Brice Goglin
Factorize multiple definitions of high level dso helpers into the
symbol source file.
The side effect is a general export of the verbose and eprintf
debugging helpers into a new file dedicated to debugging purposes.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Brice Goglin <Brice.Goglin@inria.fr>
---
tools/perf/Makefile | 1 +
tools/perf/builtin-annotate.c | 96 ----------------------------------------
tools/perf/builtin-record.c | 1 -
tools/perf/builtin-report.c | 97 -----------------------------------------
tools/perf/builtin-stat.c | 1 -
tools/perf/builtin-top.c | 4 --
tools/perf/builtin.h | 1 +
tools/perf/perf.h | 1 +
tools/perf/util/debug.c | 22 +++++++++
tools/perf/util/debug.h | 5 ++
tools/perf/util/symbol.c | 97 +++++++++++++++++++++++++++++++++++++++++
tools/perf/util/symbol.h | 11 +++++
12 files changed, 138 insertions(+), 199 deletions(-)
create mode 100644 tools/perf/util/debug.c
create mode 100644 tools/perf/util/debug.h
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index de7beac..2aee21b 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -339,6 +339,7 @@ LIB_OBJS += util/pager.o
LIB_OBJS += util/header.o
LIB_OBJS += util/callchain.o
LIB_OBJS += util/values.o
+LIB_OBJS += util/debug.o
BUILTIN_OBJS += builtin-annotate.o
BUILTIN_OBJS += builtin-help.o
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 1dba568..1a79299 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -26,7 +26,6 @@
#define SHOW_HV 4
static char const *input_name = "perf.data";
-static char *vmlinux = "vmlinux";
static char default_sort_order[] = "comm,symbol";
static char *sort_order = default_sort_order;
@@ -37,9 +36,6 @@ static int show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV;
static int dump_trace = 0;
#define dprintf(x...) do { if (dump_trace) printf(x); } while (0)
-static int verbose;
-
-static int modules;
static int full_paths;
@@ -89,98 +85,6 @@ struct sym_ext {
char *path;
};
-static LIST_HEAD(dsos);
-static struct dso *kernel_dso;
-static struct dso *vdso;
-
-
-static void dsos__add(struct dso *dso)
-{
- list_add_tail(&dso->node, &dsos);
-}
-
-static struct dso *dsos__find(const char *name)
-{
- struct dso *pos;
-
- list_for_each_entry(pos, &dsos, node)
- if (strcmp(pos->name, name) == 0)
- return pos;
- return NULL;
-}
-
-static struct dso *dsos__findnew(const char *name)
-{
- struct dso *dso = dsos__find(name);
- int nr;
-
- if (dso)
- return dso;
-
- dso = dso__new(name, 0);
- if (!dso)
- goto out_delete_dso;
-
- nr = dso__load(dso, NULL, verbose);
- if (nr < 0) {
- if (verbose)
- fprintf(stderr, "Failed to open: %s\n", name);
- goto out_delete_dso;
- }
- if (!nr && verbose) {
- fprintf(stderr,
- "No symbols found in: %s, maybe install a debug package?\n",
- name);
- }
-
- dsos__add(dso);
-
- return dso;
-
-out_delete_dso:
- dso__delete(dso);
- return NULL;
-}
-
-static void dsos__fprintf(FILE *fp)
-{
- struct dso *pos;
-
- list_for_each_entry(pos, &dsos, node)
- dso__fprintf(pos, fp);
-}
-
-static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
-{
- return dso__find_symbol(dso, ip);
-}
-
-static int load_kernel(void)
-{
- int err;
-
- kernel_dso = dso__new("[kernel]", 0);
- if (!kernel_dso)
- return -1;
-
- err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
- if (err <= 0) {
- dso__delete(kernel_dso);
- kernel_dso = NULL;
- } else
- dsos__add(kernel_dso);
-
- vdso = dso__new("[vdso]", 0);
- if (!vdso)
- return -1;
-
- vdso->find_symbol = vdso__find_symbol;
-
- dsos__add(vdso);
-
- return err;
-}
-
struct map {
struct list_head node;
u64 start;
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 0345aad..afae387 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -40,7 +40,6 @@ static int inherit = 1;
static int force = 0;
static int append_file = 0;
static int call_graph = 0;
-static int verbose = 0;
static int inherit_stat = 0;
static int no_samples = 0;
static int sample_address = 0;
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 2357c66..827eab2 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -30,7 +30,6 @@
#define SHOW_HV 4
static char const *input_name = "perf.data";
-static char *vmlinux = NULL;
static char default_sort_order[] = "comm,dso,symbol";
static char *sort_order = default_sort_order;
@@ -46,11 +45,6 @@ static int dump_trace = 0;
#define dprintf(x...) do { if (dump_trace) printf(x); } while (0)
#define cdprintf(x...) do { if (dump_trace) color_fprintf(stdout, color, x); } while (0)
-static int verbose;
-#define eprintf(x...) do { if (verbose) fprintf(stderr, x); } while (0)
-
-static int modules;
-
static int full_paths;
static int show_nr_samples;
@@ -161,98 +155,7 @@ static int repsep_fprintf(FILE *fp, const char *fmt, ...)
return n;
}
-static LIST_HEAD(dsos);
-static struct dso *kernel_dso;
-static struct dso *vdso;
-static struct dso *hypervisor_dso;
-
-static void dsos__add(struct dso *dso)
-{
- list_add_tail(&dso->node, &dsos);
-}
-
-static struct dso *dsos__find(const char *name)
-{
- struct dso *pos;
-
- list_for_each_entry(pos, &dsos, node)
- if (strcmp(pos->name, name) == 0)
- return pos;
- return NULL;
-}
-
-static struct dso *dsos__findnew(const char *name)
-{
- struct dso *dso = dsos__find(name);
- int nr;
-
- if (dso)
- return dso;
-
- dso = dso__new(name, 0);
- if (!dso)
- goto out_delete_dso;
-
- nr = dso__load(dso, NULL, verbose);
- if (nr < 0) {
- eprintf("Failed to open: %s\n", name);
- goto out_delete_dso;
- }
- if (!nr)
- eprintf("No symbols found in: %s, maybe install a debug package?\n", name);
-
- dsos__add(dso);
-
- return dso;
-
-out_delete_dso:
- dso__delete(dso);
- return NULL;
-}
-
-static void dsos__fprintf(FILE *fp)
-{
- struct dso *pos;
-
- list_for_each_entry(pos, &dsos, node)
- dso__fprintf(pos, fp);
-}
-
-static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
-{
- return dso__find_symbol(dso, ip);
-}
-
-static int load_kernel(void)
-{
- int err;
-
- kernel_dso = dso__new("[kernel]", 0);
- if (!kernel_dso)
- return -1;
-
- err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
- if (err <= 0) {
- dso__delete(kernel_dso);
- kernel_dso = NULL;
- } else
- dsos__add(kernel_dso);
-
- vdso = dso__new("[vdso]", 0);
- if (!vdso)
- return -1;
- vdso->find_symbol = vdso__find_symbol;
-
- dsos__add(vdso);
-
- hypervisor_dso = dso__new("[hypervisor]", 0);
- if (!hypervisor_dso)
- return -1;
- dsos__add(hypervisor_dso);
-
- return err;
-}
static char __cwd[PATH_MAX];
static char *cwd = __cwd;
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index b4b06c7..4b9dd4a 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -63,7 +63,6 @@ static struct perf_counter_attr default_attrs[] = {
#define MAX_RUN 100
static int system_wide = 0;
-static int verbose = 0;
static unsigned int nr_cpus = 0;
static int run_idx = 0;
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 7de28ce..0aa5673 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -68,8 +68,6 @@ static int group = 0;
static unsigned int page_size;
static unsigned int mmap_pages = 16;
static int freq = 0;
-static int verbose = 0;
-static char *vmlinux = NULL;
static int delay_secs = 2;
static int zero;
@@ -338,8 +336,6 @@ static void show_details(struct sym_entry *syme)
printf("%d lines not displayed, maybe increase display entries [e]\n", more);
}
-struct dso *kernel_dso;
-
/*
* Symbols will be added here in record_ip and will get out
* after decayed.
diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
index 51d1682..3a63e41 100644
--- a/tools/perf/builtin.h
+++ b/tools/perf/builtin.h
@@ -22,5 +22,6 @@ extern int cmd_stat(int argc, const char **argv, const char *prefix);
extern int cmd_top(int argc, const char **argv, const char *prefix);
extern int cmd_version(int argc, const char **argv, const char *prefix);
extern int cmd_list(int argc, const char **argv, const char *prefix);
+extern int cmd_trace(int argc, const char **argv, const char *prefix);
#endif
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index e5148e2..f550921 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -48,6 +48,7 @@
#include "../../include/linux/perf_counter.h"
#include "util/types.h"
+#include "util/debug.h"
/*
* prctl(PR_TASK_PERF_COUNTERS_DISABLE) will (cheaply) disable all
diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c
new file mode 100644
index 0000000..7cb8464
--- /dev/null
+++ b/tools/perf/util/debug.c
@@ -0,0 +1,22 @@
+/* For general debugging purposes */
+
+#include "../perf.h"
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+int verbose = 0;
+
+int eprintf(const char *fmt, ...)
+{
+ va_list args;
+ int ret = 0;
+
+ if (verbose) {
+ va_start(args, fmt);
+ ret = vfprintf(stderr, fmt, args);
+ va_end(args);
+ }
+
+ return ret;
+}
diff --git a/tools/perf/util/debug.h b/tools/perf/util/debug.h
new file mode 100644
index 0000000..2ae9090
--- /dev/null
+++ b/tools/perf/util/debug.h
@@ -0,0 +1,5 @@
+/* For debugging general purposes */
+
+extern int verbose;
+
+int eprintf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index f1dcede..e9b13b4 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -937,6 +937,103 @@ int dso__load_kernel(struct dso *self, const char *vmlinux,
return err;
}
+LIST_HEAD(dsos);
+struct dso *kernel_dso;
+struct dso *vdso;
+struct dso *hypervisor_dso;
+
+char *vmlinux = "vmlinux";
+int modules;
+
+static void dsos__add(struct dso *dso)
+{
+ list_add_tail(&dso->node, &dsos);
+}
+
+static struct dso *dsos__find(const char *name)
+{
+ struct dso *pos;
+
+ list_for_each_entry(pos, &dsos, node)
+ if (strcmp(pos->name, name) == 0)
+ return pos;
+ return NULL;
+}
+
+struct dso *dsos__findnew(const char *name)
+{
+ struct dso *dso = dsos__find(name);
+ int nr;
+
+ if (dso)
+ return dso;
+
+ dso = dso__new(name, 0);
+ if (!dso)
+ goto out_delete_dso;
+
+ nr = dso__load(dso, NULL, verbose);
+ if (nr < 0) {
+ eprintf("Failed to open: %s\n", name);
+ goto out_delete_dso;
+ }
+ if (!nr)
+ eprintf("No symbols found in: %s, maybe install a debug package?\n", name);
+
+ dsos__add(dso);
+
+ return dso;
+
+out_delete_dso:
+ dso__delete(dso);
+ return NULL;
+}
+
+void dsos__fprintf(FILE *fp)
+{
+ struct dso *pos;
+
+ list_for_each_entry(pos, &dsos, node)
+ dso__fprintf(pos, fp);
+}
+
+static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
+{
+ return dso__find_symbol(dso, ip);
+}
+
+int load_kernel(void)
+{
+ int err;
+
+ kernel_dso = dso__new("[kernel]", 0);
+ if (!kernel_dso)
+ return -1;
+
+ err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
+ if (err <= 0) {
+ dso__delete(kernel_dso);
+ kernel_dso = NULL;
+ } else
+ dsos__add(kernel_dso);
+
+ vdso = dso__new("[vdso]", 0);
+ if (!vdso)
+ return -1;
+
+ vdso->find_symbol = vdso__find_symbol;
+
+ dsos__add(vdso);
+
+ hypervisor_dso = dso__new("[hypervisor]", 0);
+ if (!hypervisor_dso)
+ return -1;
+ dsos__add(hypervisor_dso);
+
+ return err;
+}
+
+
void symbol__init(void)
{
elf_version(EV_CURRENT);
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index 1e003ec..f3490fc 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -48,9 +48,20 @@ int dso__load_kernel(struct dso *self, const char *vmlinux,
symbol_filter_t filter, int verbose, int modules);
int dso__load_modules(struct dso *self, symbol_filter_t filter, int verbose);
int dso__load(struct dso *self, symbol_filter_t filter, int verbose);
+struct dso *dsos__findnew(const char *name);
+void dsos__fprintf(FILE *fp);
size_t dso__fprintf(struct dso *self, FILE *fp);
char dso__symtab_origin(const struct dso *self);
+int load_kernel(void);
+
void symbol__init(void);
+
+extern struct list_head dsos;
+extern struct dso *kernel_dso;
+extern struct dso *vdso;
+extern struct dso *hypervisor_dso;
+extern char *vmlinux;
+extern int modules;
#endif /* _PERF_SYMBOL_ */
--
1.6.2.3
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH 2/3 v2] perf tools: Factorize the event structure definitions in a single file
2009-08-12 10:08 ` Ingo Molnar
2009-08-12 10:48 ` [GIT PULL v2] perf tools: Factorize common code Frederic Weisbecker
2009-08-12 10:48 ` [PATCH 1/3 v2] perf tools: Factorize high level dso helpers Frederic Weisbecker
@ 2009-08-12 10:48 ` Frederic Weisbecker
2009-08-12 10:48 ` [PATCH 3/3 v2] perf tools: Factorize the map helpers Frederic Weisbecker
3 siblings, 0 replies; 17+ messages in thread
From: Frederic Weisbecker @ 2009-08-12 10:48 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Frederic Weisbecker, Arnaldo Carvalho de Melo,
Peter Zijlstra, Mike Galbraith, Brice Goglin
Factorize the multiple definition of the events structures into a
single util/event.h file.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Brice Goglin <Brice.Goglin@inria.fr>
---
tools/perf/builtin-annotate.c | 34 -------------------------
tools/perf/builtin-record.c | 18 -------------
tools/perf/builtin-report.c | 53 ----------------------------------------
tools/perf/builtin-top.c | 20 ---------------
tools/perf/util/event.h | 54 +++++++++++++++++++++++++++++++++++++++++
tools/perf/util/util.h | 2 +
6 files changed, 56 insertions(+), 125 deletions(-)
create mode 100644 tools/perf/util/event.h
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 1a79299..fee663a 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -44,40 +44,6 @@ static int print_line;
static unsigned long page_size;
static unsigned long mmap_window = 32;
-struct ip_event {
- struct perf_event_header header;
- u64 ip;
- u32 pid, tid;
-};
-
-struct mmap_event {
- struct perf_event_header header;
- u32 pid, tid;
- u64 start;
- u64 len;
- u64 pgoff;
- char filename[PATH_MAX];
-};
-
-struct comm_event {
- struct perf_event_header header;
- u32 pid, tid;
- char comm[16];
-};
-
-struct fork_event {
- struct perf_event_header header;
- u32 pid, ppid;
-};
-
-typedef union event_union {
- struct perf_event_header header;
- struct ip_event ip;
- struct mmap_event mmap;
- struct comm_event comm;
- struct fork_event fork;
-} event_t;
-
struct sym_ext {
struct rb_node node;
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index afae387..718b8f7 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -59,24 +59,6 @@ static int file_new = 1;
struct perf_header *header;
-struct mmap_event {
- struct perf_event_header header;
- u32 pid;
- u32 tid;
- u64 start;
- u64 len;
- u64 pgoff;
- char filename[PATH_MAX];
-};
-
-struct comm_event {
- struct perf_event_header header;
- u32 pid;
- u32 tid;
- char comm[16];
-};
-
-
struct mmap_data {
int counter;
void *base;
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 827eab2..1efefcc 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -75,59 +75,6 @@ struct callchain_param callchain_param = {
static u64 sample_type;
-struct ip_event {
- struct perf_event_header header;
- u64 ip;
- u32 pid, tid;
- unsigned char __more_data[];
-};
-
-struct mmap_event {
- struct perf_event_header header;
- u32 pid, tid;
- u64 start;
- u64 len;
- u64 pgoff;
- char filename[PATH_MAX];
-};
-
-struct comm_event {
- struct perf_event_header header;
- u32 pid, tid;
- char comm[16];
-};
-
-struct fork_event {
- struct perf_event_header header;
- u32 pid, ppid;
- u32 tid, ptid;
-};
-
-struct lost_event {
- struct perf_event_header header;
- u64 id;
- u64 lost;
-};
-
-struct read_event {
- struct perf_event_header header;
- u32 pid,tid;
- u64 value;
- u64 time_enabled;
- u64 time_running;
- u64 id;
-};
-
-typedef union event_union {
- struct perf_event_header header;
- struct ip_event ip;
- struct mmap_event mmap;
- struct comm_event comm;
- struct fork_event fork;
- struct lost_event lost;
- struct read_event read;
-} event_t;
-
static int repsep_fprintf(FILE *fp, const char *fmt, ...)
{
int n;
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 0aa5673..9a6dbbf 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -933,26 +933,6 @@ static void mmap_read_counter(struct mmap_data *md)
last_read = this_read;
for (; old != head;) {
- struct ip_event {
- struct perf_event_header header;
- u64 ip;
- u32 pid, target_pid;
- };
- struct mmap_event {
- struct perf_event_header header;
- u32 pid, target_pid;
- u64 start;
- u64 len;
- u64 pgoff;
- char filename[PATH_MAX];
- };
-
- typedef union event_union {
- struct perf_event_header header;
- struct ip_event ip;
- struct mmap_event mmap;
- } event_t;
-
event_t *event = (event_t *)&data[old & md->mask];
event_t event_copy;
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
new file mode 100644
index 0000000..91e2fe5
--- /dev/null
+++ b/tools/perf/util/event.h
@@ -0,0 +1,54 @@
+#include "../perf.h"
+
+struct ip_event {
+ struct perf_event_header header;
+ u64 ip;
+ u32 pid, tid;
+ unsigned char __more_data[];
+};
+
+struct mmap_event {
+ struct perf_event_header header;
+ u32 pid, tid;
+ u64 start;
+ u64 len;
+ u64 pgoff;
+ char filename[PATH_MAX];
+};
+
+struct comm_event {
+ struct perf_event_header header;
+ u32 pid, tid;
+ char comm[16];
+};
+
+struct fork_event {
+ struct perf_event_header header;
+ u32 pid, ppid;
+ u32 tid, ptid;
+};
+
+struct lost_event {
+ struct perf_event_header header;
+ u64 id;
+ u64 lost;
+};
+
+struct read_event {
+ struct perf_event_header header;
+ u32 pid,tid;
+ u64 value;
+ u64 time_enabled;
+ u64 time_running;
+ u64 id;
+};
+
+typedef union event_union {
+ struct perf_event_header header;
+ struct ip_event ip;
+ struct mmap_event mmap;
+ struct comm_event comm;
+ struct fork_event fork;
+ struct lost_event lost;
+ struct read_event read;
+} event_t;
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index 68fe157..be4b52c 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -83,6 +83,8 @@
#include <inttypes.h>
#include "../../../include/linux/magic.h"
+#include "event.h"
+
#ifndef NO_ICONV
#include <iconv.h>
#endif
--
1.6.2.3
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH 3/3 v2] perf tools: Factorize the map helpers
2009-08-12 10:08 ` Ingo Molnar
` (2 preceding siblings ...)
2009-08-12 10:48 ` [PATCH 2/3 v2] perf tools: Factorize the event structure definitions in a single file Frederic Weisbecker
@ 2009-08-12 10:48 ` Frederic Weisbecker
3 siblings, 0 replies; 17+ messages in thread
From: Frederic Weisbecker @ 2009-08-12 10:48 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Frederic Weisbecker, Arnaldo Carvalho de Melo,
Peter Zijlstra, Mike Galbraith, Brice Goglin
Factorize the dso mapping helpers into a single purpose common file
"util/map.c"
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Brice Goglin <Brice.Goglin@inria.fr>
---
tools/perf/Makefile | 1 +
tools/perf/builtin-annotate.c | 79 +--------------------------
tools/perf/builtin-record.c | 1 +
tools/perf/builtin-report.c | 124 ++---------------------------------------
tools/perf/util/callchain.h | 1 +
tools/perf/util/event.h | 30 ++++++++++
tools/perf/util/map.c | 97 ++++++++++++++++++++++++++++++++
tools/perf/util/symbol.h | 1 +
tools/perf/util/util.h | 1 -
9 files changed, 137 insertions(+), 198 deletions(-)
create mode 100644 tools/perf/util/map.c
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index 2aee21b..cb9033d 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -340,6 +340,7 @@ LIB_OBJS += util/header.o
LIB_OBJS += util/callchain.o
LIB_OBJS += util/values.o
LIB_OBJS += util/debug.o
+LIB_OBJS += util/map.o
BUILTIN_OBJS += builtin-annotate.o
BUILTIN_OBJS += builtin-help.o
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index fee663a..543c452 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -51,83 +51,6 @@ struct sym_ext {
char *path;
};
-struct map {
- struct list_head node;
- u64 start;
- u64 end;
- u64 pgoff;
- u64 (*map_ip)(struct map *, u64);
- struct dso *dso;
-};
-
-static u64 map__map_ip(struct map *map, u64 ip)
-{
- return ip - map->start + map->pgoff;
-}
-
-static u64 vdso__map_ip(struct map *map __used, u64 ip)
-{
- return ip;
-}
-
-static struct map *map__new(struct mmap_event *event)
-{
- struct map *self = malloc(sizeof(*self));
-
- if (self != NULL) {
- const char *filename = event->filename;
-
- self->start = event->start;
- self->end = event->start + event->len;
- self->pgoff = event->pgoff;
-
- self->dso = dsos__findnew(filename);
- if (self->dso == NULL)
- goto out_delete;
-
- if (self->dso == vdso)
- self->map_ip = vdso__map_ip;
- else
- self->map_ip = map__map_ip;
- }
- return self;
-out_delete:
- free(self);
- return NULL;
-}
-
-static struct map *map__clone(struct map *self)
-{
- struct map *map = malloc(sizeof(*self));
-
- if (!map)
- return NULL;
-
- memcpy(map, self, sizeof(*self));
-
- return map;
-}
-
-static int map__overlap(struct map *l, struct map *r)
-{
- if (l->start > r->start) {
- struct map *t = l;
- l = r;
- r = t;
- }
-
- if (l->end > r->start)
- return 1;
-
- return 0;
-}
-
-static size_t map__fprintf(struct map *self, FILE *fp)
-{
- return fprintf(fp, " %Lx-%Lx %Lx %s\n",
- self->start, self->end, self->pgoff, self->dso->name);
-}
-
struct thread {
struct rb_node rb_node;
@@ -797,7 +720,7 @@ static int
process_mmap_event(event_t *event, unsigned long offset, unsigned long head)
{
struct thread *thread = threads__findnew(event->mmap.pid);
- struct map *map = map__new(&event->mmap);
+ struct map *map = map__new(&event->mmap, NULL, 0);
dprintf("%p [%p]: PERF_EVENT_MMAP %d: [%p(%p) @ %p]: %s\n",
(void *)(offset + head),
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 718b8f7..106c6ab 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -15,6 +15,7 @@
#include "util/string.h"
#include "util/header.h"
+#include "util/event.h"
#include <unistd.h>
#include <sched.h>
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 1efefcc..93945ec 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -67,6 +67,10 @@ static char callchain_default_opt[] = "fractal,0.5";
static int callchain;
+static char __cwd[PATH_MAX];
+static char *cwd = __cwd;
+static int cwdlen;
+
static
struct callchain_param callchain_param = {
.mode = CHAIN_GRAPH_REL,
@@ -102,124 +106,6 @@ static int repsep_fprintf(FILE *fp, const char *fmt, ...)
return n;
}
-
-
-static char __cwd[PATH_MAX];
-static char *cwd = __cwd;
-static int cwdlen;
-
-static int strcommon(const char *pathname)
-{
- int n = 0;
-
- while (n < cwdlen && pathname[n] == cwd[n])
- ++n;
-
- return n;
-}
-
-struct map {
- struct list_head node;
- u64 start;
- u64 end;
- u64 pgoff;
- u64 (*map_ip)(struct map *, u64);
- struct dso *dso;
-};
-
-static u64 map__map_ip(struct map *map, u64 ip)
-{
- return ip - map->start + map->pgoff;
-}
-
-static u64 vdso__map_ip(struct map *map __used, u64 ip)
-{
- return ip;
-}
-
-static inline int is_anon_memory(const char *filename)
-{
- return strcmp(filename, "//anon") == 0;
-}
-
-static struct map *map__new(struct mmap_event *event)
-{
- struct map *self = malloc(sizeof(*self));
-
- if (self != NULL) {
- const char *filename = event->filename;
- char newfilename[PATH_MAX];
- int anon;
-
- if (cwd) {
- int n = strcommon(filename);
-
- if (n == cwdlen) {
- snprintf(newfilename, sizeof(newfilename),
- ".%s", filename + n);
- filename = newfilename;
- }
- }
-
- anon = is_anon_memory(filename);
-
- if (anon) {
- snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", event->pid);
- filename = newfilename;
- }
-
- self->start = event->start;
- self->end = event->start + event->len;
- self->pgoff = event->pgoff;
-
- self->dso = dsos__findnew(filename);
- if (self->dso == NULL)
- goto out_delete;
-
- if (self->dso == vdso || anon)
- self->map_ip = vdso__map_ip;
- else
- self->map_ip = map__map_ip;
- }
- return self;
-out_delete:
- free(self);
- return NULL;
-}
-
-static struct map *map__clone(struct map *self)
-{
- struct map *map = malloc(sizeof(*self));
-
- if (!map)
- return NULL;
-
- memcpy(map, self, sizeof(*self));
-
- return map;
-}
-
-static int map__overlap(struct map *l, struct map *r)
-{
- if (l->start > r->start) {
- struct map *t = l;
- l = r;
- r = t;
- }
-
- if (l->end > r->start)
- return 1;
-
- return 0;
-}
-
-static size_t map__fprintf(struct map *self, FILE *fp)
-{
- return fprintf(fp, " %Lx-%Lx %Lx %s\n",
- self->start, self->end, self->pgoff, self->dso->name);
-}
-
-
struct thread {
struct rb_node rb_node;
struct list_head maps;
@@ -1474,7 +1360,7 @@ static int
process_mmap_event(event_t *event, unsigned long offset, unsigned long head)
{
struct thread *thread = threads__findnew(event->mmap.pid);
- struct map *map = map__new(&event->mmap);
+ struct map *map = map__new(&event->mmap, cwd, cwdlen);
dprintf("%p [%p]: PERF_EVENT_MMAP %d: [%p(%p) @ %p]: %s\n",
(void *)(offset + head),
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index a926ae4..43cf3ea 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -4,6 +4,7 @@
#include "../perf.h"
#include <linux/list.h>
#include <linux/rbtree.h>
+#include "util.h"
#include "symbol.h"
enum chain_mode {
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 91e2fe5..d26dc88 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -1,4 +1,8 @@
+#ifndef __PERF_EVENT_H
+#define __PERF_EVENT_H
#include "../perf.h"
+#include "util.h"
+#include <linux/list.h>
struct ip_event {
struct perf_event_header header;
@@ -52,3 +56,29 @@ typedef union event_union {
struct lost_event lost;
struct read_event read;
} event_t;
+
+struct map {
+ struct list_head node;
+ u64 start;
+ u64 end;
+ u64 pgoff;
+ u64 (*map_ip)(struct map *, u64);
+ struct dso *dso;
+};
+
+static inline u64 map__map_ip(struct map *map, u64 ip)
+{
+ return ip - map->start + map->pgoff;
+}
+
+static inline u64 vdso__map_ip(struct map *map __used, u64 ip)
+{
+ return ip;
+}
+
+struct map *map__new(struct mmap_event *event, char *cwd, int cwdlen);
+struct map *map__clone(struct map *self);
+int map__overlap(struct map *l, struct map *r);
+size_t map__fprintf(struct map *self, FILE *fp);
+
+#endif
diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
new file mode 100644
index 0000000..804e023
--- /dev/null
+++ b/tools/perf/util/map.c
@@ -0,0 +1,97 @@
+#include "event.h"
+#include "symbol.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+static inline int is_anon_memory(const char *filename)
+{
+ return strcmp(filename, "//anon") == 0;
+}
+
+static int strcommon(const char *pathname, char *cwd, int cwdlen)
+{
+ int n = 0;
+
+ while (n < cwdlen && pathname[n] == cwd[n])
+ ++n;
+
+ return n;
+}
+
+ struct map *map__new(struct mmap_event *event, char *cwd, int cwdlen)
+{
+ struct map *self = malloc(sizeof(*self));
+
+ if (self != NULL) {
+ const char *filename = event->filename;
+ char newfilename[PATH_MAX];
+ int anon;
+
+ if (cwd) {
+ int n = strcommon(filename, cwd, cwdlen);
+
+ if (n == cwdlen) {
+ snprintf(newfilename, sizeof(newfilename),
+ ".%s", filename + n);
+ filename = newfilename;
+ }
+ }
+
+ anon = is_anon_memory(filename);
+
+ if (anon) {
+ snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", event->pid);
+ filename = newfilename;
+ }
+
+ self->start = event->start;
+ self->end = event->start + event->len;
+ self->pgoff = event->pgoff;
+
+ self->dso = dsos__findnew(filename);
+ if (self->dso == NULL)
+ goto out_delete;
+
+ if (self->dso == vdso || anon)
+ self->map_ip = vdso__map_ip;
+ else
+ self->map_ip = map__map_ip;
+ }
+ return self;
+out_delete:
+ free(self);
+ return NULL;
+}
+
+struct map *map__clone(struct map *self)
+{
+ struct map *map = malloc(sizeof(*self));
+
+ if (!map)
+ return NULL;
+
+ memcpy(map, self, sizeof(*self));
+
+ return map;
+}
+
+int map__overlap(struct map *l, struct map *r)
+{
+ if (l->start > r->start) {
+ struct map *t = l;
+ l = r;
+ r = t;
+ }
+
+ if (l->end > r->start)
+ return 1;
+
+ return 0;
+}
+
+size_t map__fprintf(struct map *self, FILE *fp)
+{
+ return fprintf(fp, " %Lx-%Lx %Lx %s\n",
+ self->start, self->end, self->pgoff, self->dso->name);
+}
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index f3490fc..50f7235 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -6,6 +6,7 @@
#include <linux/list.h>
#include <linux/rbtree.h>
#include "module.h"
+#include "event.h"
struct symbol {
struct rb_node rb_node;
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index be4b52c..d61a6f0 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -83,7 +83,6 @@
#include <inttypes.h>
#include "../../../include/linux/magic.h"
-#include "event.h"
#ifndef NO_ICONV
#include <iconv.h>
--
1.6.2.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 2/3] perf tools: Factorize the event structure definitions in a single file
2009-08-12 9:25 [GIT PULL] perf tools: Factorize common code Frederic Weisbecker
2009-08-12 9:26 ` [PATCH 1/3] perf tools: Factorize high level dso helpers Frederic Weisbecker
@ 2009-08-12 9:26 ` Frederic Weisbecker
2009-08-12 9:26 ` [PATCH 3/3] perf tools: Factorize the map helpers Frederic Weisbecker
` (3 subsequent siblings)
5 siblings, 0 replies; 17+ messages in thread
From: Frederic Weisbecker @ 2009-08-12 9:26 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Frederic Weisbecker, Arnaldo Carvalho de Melo,
Peter Zijlstra, Mike Galbraith, Brice Goglin
Factorize the multiple definition of the events structures into a
single util/event.h file.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Brice Goglin <Brice.Goglin@inria.fr>
---
tools/perf/builtin-annotate.c | 34 -------------------------
tools/perf/builtin-record.c | 18 -------------
tools/perf/builtin-report.c | 53 ----------------------------------------
tools/perf/builtin-top.c | 20 ---------------
tools/perf/util/event.h | 54 +++++++++++++++++++++++++++++++++++++++++
tools/perf/util/util.h | 2 +
6 files changed, 56 insertions(+), 125 deletions(-)
create mode 100644 tools/perf/util/event.h
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 1a79299..fee663a 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -44,40 +44,6 @@ static int print_line;
static unsigned long page_size;
static unsigned long mmap_window = 32;
-struct ip_event {
- struct perf_event_header header;
- u64 ip;
- u32 pid, tid;
-};
-
-struct mmap_event {
- struct perf_event_header header;
- u32 pid, tid;
- u64 start;
- u64 len;
- u64 pgoff;
- char filename[PATH_MAX];
-};
-
-struct comm_event {
- struct perf_event_header header;
- u32 pid, tid;
- char comm[16];
-};
-
-struct fork_event {
- struct perf_event_header header;
- u32 pid, ppid;
-};
-
-typedef union event_union {
- struct perf_event_header header;
- struct ip_event ip;
- struct mmap_event mmap;
- struct comm_event comm;
- struct fork_event fork;
-} event_t;
-
struct sym_ext {
struct rb_node node;
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index afae387..718b8f7 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -59,24 +59,6 @@ static int file_new = 1;
struct perf_header *header;
-struct mmap_event {
- struct perf_event_header header;
- u32 pid;
- u32 tid;
- u64 start;
- u64 len;
- u64 pgoff;
- char filename[PATH_MAX];
-};
-
-struct comm_event {
- struct perf_event_header header;
- u32 pid;
- u32 tid;
- char comm[16];
-};
-
-
struct mmap_data {
int counter;
void *base;
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 827eab2..1efefcc 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -75,59 +75,6 @@ struct callchain_param callchain_param = {
static u64 sample_type;
-struct ip_event {
- struct perf_event_header header;
- u64 ip;
- u32 pid, tid;
- unsigned char __more_data[];
-};
-
-struct mmap_event {
- struct perf_event_header header;
- u32 pid, tid;
- u64 start;
- u64 len;
- u64 pgoff;
- char filename[PATH_MAX];
-};
-
-struct comm_event {
- struct perf_event_header header;
- u32 pid, tid;
- char comm[16];
-};
-
-struct fork_event {
- struct perf_event_header header;
- u32 pid, ppid;
- u32 tid, ptid;
-};
-
-struct lost_event {
- struct perf_event_header header;
- u64 id;
- u64 lost;
-};
-
-struct read_event {
- struct perf_event_header header;
- u32 pid,tid;
- u64 value;
- u64 time_enabled;
- u64 time_running;
- u64 id;
-};
-
-typedef union event_union {
- struct perf_event_header header;
- struct ip_event ip;
- struct mmap_event mmap;
- struct comm_event comm;
- struct fork_event fork;
- struct lost_event lost;
- struct read_event read;
-} event_t;
-
static int repsep_fprintf(FILE *fp, const char *fmt, ...)
{
int n;
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 0aa5673..9a6dbbf 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -933,26 +933,6 @@ static void mmap_read_counter(struct mmap_data *md)
last_read = this_read;
for (; old != head;) {
- struct ip_event {
- struct perf_event_header header;
- u64 ip;
- u32 pid, target_pid;
- };
- struct mmap_event {
- struct perf_event_header header;
- u32 pid, target_pid;
- u64 start;
- u64 len;
- u64 pgoff;
- char filename[PATH_MAX];
- };
-
- typedef union event_union {
- struct perf_event_header header;
- struct ip_event ip;
- struct mmap_event mmap;
- } event_t;
-
event_t *event = (event_t *)&data[old & md->mask];
event_t event_copy;
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
new file mode 100644
index 0000000..91e2fe5
--- /dev/null
+++ b/tools/perf/util/event.h
@@ -0,0 +1,54 @@
+#include "../perf.h"
+
+struct ip_event {
+ struct perf_event_header header;
+ u64 ip;
+ u32 pid, tid;
+ unsigned char __more_data[];
+};
+
+struct mmap_event {
+ struct perf_event_header header;
+ u32 pid, tid;
+ u64 start;
+ u64 len;
+ u64 pgoff;
+ char filename[PATH_MAX];
+};
+
+struct comm_event {
+ struct perf_event_header header;
+ u32 pid, tid;
+ char comm[16];
+};
+
+struct fork_event {
+ struct perf_event_header header;
+ u32 pid, ppid;
+ u32 tid, ptid;
+};
+
+struct lost_event {
+ struct perf_event_header header;
+ u64 id;
+ u64 lost;
+};
+
+struct read_event {
+ struct perf_event_header header;
+ u32 pid,tid;
+ u64 value;
+ u64 time_enabled;
+ u64 time_running;
+ u64 id;
+};
+
+typedef union event_union {
+ struct perf_event_header header;
+ struct ip_event ip;
+ struct mmap_event mmap;
+ struct comm_event comm;
+ struct fork_event fork;
+ struct lost_event lost;
+ struct read_event read;
+} event_t;
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index 68fe157..be4b52c 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -83,6 +83,8 @@
#include <inttypes.h>
#include "../../../include/linux/magic.h"
+#include "event.h"
+
#ifndef NO_ICONV
#include <iconv.h>
#endif
--
1.6.2.3
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH 3/3] perf tools: Factorize the map helpers
2009-08-12 9:25 [GIT PULL] perf tools: Factorize common code Frederic Weisbecker
2009-08-12 9:26 ` [PATCH 1/3] perf tools: Factorize high level dso helpers Frederic Weisbecker
2009-08-12 9:26 ` [PATCH 2/3] perf tools: Factorize the event structure definitions in a single file Frederic Weisbecker
@ 2009-08-12 9:26 ` Frederic Weisbecker
2009-08-12 9:27 ` [GIT PULL] perf tools: Factorize common code Frederic Weisbecker
` (2 subsequent siblings)
5 siblings, 0 replies; 17+ messages in thread
From: Frederic Weisbecker @ 2009-08-12 9:26 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Frederic Weisbecker, Arnaldo Carvalho de Melo,
Peter Zijlstra, Mike Galbraith, Brice Goglin
Factorize the dso mapping helpers into a single purpose common file
"util/map.c"
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Brice Goglin <Brice.Goglin@inria.fr>
---
tools/perf/Makefile | 1 +
tools/perf/builtin-annotate.c | 79 +--------------------------
tools/perf/builtin-record.c | 1 +
tools/perf/builtin-report.c | 124 ++---------------------------------------
tools/perf/util/callchain.h | 1 +
tools/perf/util/event.h | 30 ++++++++++
tools/perf/util/map.c | 97 ++++++++++++++++++++++++++++++++
tools/perf/util/symbol.h | 1 +
tools/perf/util/util.h | 1 -
9 files changed, 137 insertions(+), 198 deletions(-)
create mode 100644 tools/perf/util/map.c
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index 2aee21b..f4d868c 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -340,6 +340,7 @@ LIB_OBJS += util/header.o
LIB_OBJS += util/callchain.o
LIB_OBJS += util/values.o
LIB_OBJS += util/debug.o
+LIB_OBJS += util/event.o
BUILTIN_OBJS += builtin-annotate.o
BUILTIN_OBJS += builtin-help.o
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index fee663a..543c452 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -51,83 +51,6 @@ struct sym_ext {
char *path;
};
-struct map {
- struct list_head node;
- u64 start;
- u64 end;
- u64 pgoff;
- u64 (*map_ip)(struct map *, u64);
- struct dso *dso;
-};
-
-static u64 map__map_ip(struct map *map, u64 ip)
-{
- return ip - map->start + map->pgoff;
-}
-
-static u64 vdso__map_ip(struct map *map __used, u64 ip)
-{
- return ip;
-}
-
-static struct map *map__new(struct mmap_event *event)
-{
- struct map *self = malloc(sizeof(*self));
-
- if (self != NULL) {
- const char *filename = event->filename;
-
- self->start = event->start;
- self->end = event->start + event->len;
- self->pgoff = event->pgoff;
-
- self->dso = dsos__findnew(filename);
- if (self->dso == NULL)
- goto out_delete;
-
- if (self->dso == vdso)
- self->map_ip = vdso__map_ip;
- else
- self->map_ip = map__map_ip;
- }
- return self;
-out_delete:
- free(self);
- return NULL;
-}
-
-static struct map *map__clone(struct map *self)
-{
- struct map *map = malloc(sizeof(*self));
-
- if (!map)
- return NULL;
-
- memcpy(map, self, sizeof(*self));
-
- return map;
-}
-
-static int map__overlap(struct map *l, struct map *r)
-{
- if (l->start > r->start) {
- struct map *t = l;
- l = r;
- r = t;
- }
-
- if (l->end > r->start)
- return 1;
-
- return 0;
-}
-
-static size_t map__fprintf(struct map *self, FILE *fp)
-{
- return fprintf(fp, " %Lx-%Lx %Lx %s\n",
- self->start, self->end, self->pgoff, self->dso->name);
-}
-
struct thread {
struct rb_node rb_node;
@@ -797,7 +720,7 @@ static int
process_mmap_event(event_t *event, unsigned long offset, unsigned long head)
{
struct thread *thread = threads__findnew(event->mmap.pid);
- struct map *map = map__new(&event->mmap);
+ struct map *map = map__new(&event->mmap, NULL, 0);
dprintf("%p [%p]: PERF_EVENT_MMAP %d: [%p(%p) @ %p]: %s\n",
(void *)(offset + head),
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 718b8f7..106c6ab 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -15,6 +15,7 @@
#include "util/string.h"
#include "util/header.h"
+#include "util/event.h"
#include <unistd.h>
#include <sched.h>
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 1efefcc..93945ec 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -67,6 +67,10 @@ static char callchain_default_opt[] = "fractal,0.5";
static int callchain;
+static char __cwd[PATH_MAX];
+static char *cwd = __cwd;
+static int cwdlen;
+
static
struct callchain_param callchain_param = {
.mode = CHAIN_GRAPH_REL,
@@ -102,124 +106,6 @@ static int repsep_fprintf(FILE *fp, const char *fmt, ...)
return n;
}
-
-
-static char __cwd[PATH_MAX];
-static char *cwd = __cwd;
-static int cwdlen;
-
-static int strcommon(const char *pathname)
-{
- int n = 0;
-
- while (n < cwdlen && pathname[n] == cwd[n])
- ++n;
-
- return n;
-}
-
-struct map {
- struct list_head node;
- u64 start;
- u64 end;
- u64 pgoff;
- u64 (*map_ip)(struct map *, u64);
- struct dso *dso;
-};
-
-static u64 map__map_ip(struct map *map, u64 ip)
-{
- return ip - map->start + map->pgoff;
-}
-
-static u64 vdso__map_ip(struct map *map __used, u64 ip)
-{
- return ip;
-}
-
-static inline int is_anon_memory(const char *filename)
-{
- return strcmp(filename, "//anon") == 0;
-}
-
-static struct map *map__new(struct mmap_event *event)
-{
- struct map *self = malloc(sizeof(*self));
-
- if (self != NULL) {
- const char *filename = event->filename;
- char newfilename[PATH_MAX];
- int anon;
-
- if (cwd) {
- int n = strcommon(filename);
-
- if (n == cwdlen) {
- snprintf(newfilename, sizeof(newfilename),
- ".%s", filename + n);
- filename = newfilename;
- }
- }
-
- anon = is_anon_memory(filename);
-
- if (anon) {
- snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", event->pid);
- filename = newfilename;
- }
-
- self->start = event->start;
- self->end = event->start + event->len;
- self->pgoff = event->pgoff;
-
- self->dso = dsos__findnew(filename);
- if (self->dso == NULL)
- goto out_delete;
-
- if (self->dso == vdso || anon)
- self->map_ip = vdso__map_ip;
- else
- self->map_ip = map__map_ip;
- }
- return self;
-out_delete:
- free(self);
- return NULL;
-}
-
-static struct map *map__clone(struct map *self)
-{
- struct map *map = malloc(sizeof(*self));
-
- if (!map)
- return NULL;
-
- memcpy(map, self, sizeof(*self));
-
- return map;
-}
-
-static int map__overlap(struct map *l, struct map *r)
-{
- if (l->start > r->start) {
- struct map *t = l;
- l = r;
- r = t;
- }
-
- if (l->end > r->start)
- return 1;
-
- return 0;
-}
-
-static size_t map__fprintf(struct map *self, FILE *fp)
-{
- return fprintf(fp, " %Lx-%Lx %Lx %s\n",
- self->start, self->end, self->pgoff, self->dso->name);
-}
-
-
struct thread {
struct rb_node rb_node;
struct list_head maps;
@@ -1474,7 +1360,7 @@ static int
process_mmap_event(event_t *event, unsigned long offset, unsigned long head)
{
struct thread *thread = threads__findnew(event->mmap.pid);
- struct map *map = map__new(&event->mmap);
+ struct map *map = map__new(&event->mmap, cwd, cwdlen);
dprintf("%p [%p]: PERF_EVENT_MMAP %d: [%p(%p) @ %p]: %s\n",
(void *)(offset + head),
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index a926ae4..43cf3ea 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -4,6 +4,7 @@
#include "../perf.h"
#include <linux/list.h>
#include <linux/rbtree.h>
+#include "util.h"
#include "symbol.h"
enum chain_mode {
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 91e2fe5..d26dc88 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -1,4 +1,8 @@
+#ifndef __PERF_EVENT_H
+#define __PERF_EVENT_H
#include "../perf.h"
+#include "util.h"
+#include <linux/list.h>
struct ip_event {
struct perf_event_header header;
@@ -52,3 +56,29 @@ typedef union event_union {
struct lost_event lost;
struct read_event read;
} event_t;
+
+struct map {
+ struct list_head node;
+ u64 start;
+ u64 end;
+ u64 pgoff;
+ u64 (*map_ip)(struct map *, u64);
+ struct dso *dso;
+};
+
+static inline u64 map__map_ip(struct map *map, u64 ip)
+{
+ return ip - map->start + map->pgoff;
+}
+
+static inline u64 vdso__map_ip(struct map *map __used, u64 ip)
+{
+ return ip;
+}
+
+struct map *map__new(struct mmap_event *event, char *cwd, int cwdlen);
+struct map *map__clone(struct map *self);
+int map__overlap(struct map *l, struct map *r);
+size_t map__fprintf(struct map *self, FILE *fp);
+
+#endif
diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
new file mode 100644
index 0000000..804e023
--- /dev/null
+++ b/tools/perf/util/map.c
@@ -0,0 +1,97 @@
+#include "event.h"
+#include "symbol.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+static inline int is_anon_memory(const char *filename)
+{
+ return strcmp(filename, "//anon") == 0;
+}
+
+static int strcommon(const char *pathname, char *cwd, int cwdlen)
+{
+ int n = 0;
+
+ while (n < cwdlen && pathname[n] == cwd[n])
+ ++n;
+
+ return n;
+}
+
+ struct map *map__new(struct mmap_event *event, char *cwd, int cwdlen)
+{
+ struct map *self = malloc(sizeof(*self));
+
+ if (self != NULL) {
+ const char *filename = event->filename;
+ char newfilename[PATH_MAX];
+ int anon;
+
+ if (cwd) {
+ int n = strcommon(filename, cwd, cwdlen);
+
+ if (n == cwdlen) {
+ snprintf(newfilename, sizeof(newfilename),
+ ".%s", filename + n);
+ filename = newfilename;
+ }
+ }
+
+ anon = is_anon_memory(filename);
+
+ if (anon) {
+ snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", event->pid);
+ filename = newfilename;
+ }
+
+ self->start = event->start;
+ self->end = event->start + event->len;
+ self->pgoff = event->pgoff;
+
+ self->dso = dsos__findnew(filename);
+ if (self->dso == NULL)
+ goto out_delete;
+
+ if (self->dso == vdso || anon)
+ self->map_ip = vdso__map_ip;
+ else
+ self->map_ip = map__map_ip;
+ }
+ return self;
+out_delete:
+ free(self);
+ return NULL;
+}
+
+struct map *map__clone(struct map *self)
+{
+ struct map *map = malloc(sizeof(*self));
+
+ if (!map)
+ return NULL;
+
+ memcpy(map, self, sizeof(*self));
+
+ return map;
+}
+
+int map__overlap(struct map *l, struct map *r)
+{
+ if (l->start > r->start) {
+ struct map *t = l;
+ l = r;
+ r = t;
+ }
+
+ if (l->end > r->start)
+ return 1;
+
+ return 0;
+}
+
+size_t map__fprintf(struct map *self, FILE *fp)
+{
+ return fprintf(fp, " %Lx-%Lx %Lx %s\n",
+ self->start, self->end, self->pgoff, self->dso->name);
+}
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index f3490fc..50f7235 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -6,6 +6,7 @@
#include <linux/list.h>
#include <linux/rbtree.h>
#include "module.h"
+#include "event.h"
struct symbol {
struct rb_node rb_node;
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index be4b52c..d61a6f0 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -83,7 +83,6 @@
#include <inttypes.h>
#include "../../../include/linux/magic.h"
-#include "event.h"
#ifndef NO_ICONV
#include <iconv.h>
--
1.6.2.3
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [GIT PULL] perf tools: Factorize common code
2009-08-12 9:25 [GIT PULL] perf tools: Factorize common code Frederic Weisbecker
` (2 preceding siblings ...)
2009-08-12 9:26 ` [PATCH 3/3] perf tools: Factorize the map helpers Frederic Weisbecker
@ 2009-08-12 9:27 ` Frederic Weisbecker
2009-08-12 9:32 ` Ingo Molnar
2009-08-12 9:52 ` Peter Zijlstra
5 siblings, 0 replies; 17+ messages in thread
From: Frederic Weisbecker @ 2009-08-12 9:27 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Arnaldo Carvalho de Melo, Peter Zijlstra, Mike Galbraith,
Brice Goglin
On Wed, Aug 12, 2009 at 11:25:59AM +0200, Frederic Weisbecker wrote:
> Ingo,
>
> This set factorizes the common definition of structs, functions,
> variables inside perf tools to make it easier for perf trace to
> be created.
>
> I guess this patchset only factorizes 10 % of what could be done,
> the largest part is the intersection between perf report and perf
> annotate. It's a lot of work.
>
> I guess I will do the rest in separate patchsets while writing
> perf trace.
>
> Thanks,
> Frederic.
>
>
> The following changes since commit 9f8666971185b86615a074bcac67c90fdf8af8bc:
> Brice Goglin (1):
> perf report: Add raw displaying of per-thread counters
>
> are available in the git repository at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing.git ..BRANCH.NOT.VERIFIED..
s/BRANCH.NOT.VERIFIED/"perfcounters/core"
>
> Frederic Weisbecker (3):
> perf tools: Factorize high level dso helpers
> perf tools: Factorize the event structure definitions in a single file
> perf tools: Factorize the map helpers
>
> tools/perf/Makefile | 2 +
> tools/perf/builtin-annotate.c | 209 +-------------------------------
> tools/perf/builtin-record.c | 20 +---
> tools/perf/builtin-report.c | 274 +----------------------------------------
> tools/perf/builtin-stat.c | 1 -
> tools/perf/builtin-top.c | 24 ----
> tools/perf/builtin.h | 1 +
> tools/perf/perf.h | 1 +
> tools/perf/util/callchain.h | 1 +
> tools/perf/util/event.h | 84 +++++++++++++
> tools/perf/util/map.c | 97 +++++++++++++++
> tools/perf/util/symbol.c | 97 +++++++++++++++
> tools/perf/util/symbol.h | 12 ++
> tools/perf/util/util.h | 1 +
> 14 files changed, 303 insertions(+), 521 deletions(-)
> create mode 100644 tools/perf/util/event.h
> create mode 100644 tools/perf/util/map.c
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [GIT PULL] perf tools: Factorize common code
2009-08-12 9:25 [GIT PULL] perf tools: Factorize common code Frederic Weisbecker
` (3 preceding siblings ...)
2009-08-12 9:27 ` [GIT PULL] perf tools: Factorize common code Frederic Weisbecker
@ 2009-08-12 9:32 ` Ingo Molnar
2009-08-12 9:52 ` Peter Zijlstra
5 siblings, 0 replies; 17+ messages in thread
From: Ingo Molnar @ 2009-08-12 9:32 UTC (permalink / raw)
To: Frederic Weisbecker
Cc: LKML, Arnaldo Carvalho de Melo, Peter Zijlstra, Mike Galbraith,
Brice Goglin
* Frederic Weisbecker <fweisbec@gmail.com> wrote:
> Ingo,
>
> This set factorizes the common definition of structs, functions,
> variables inside perf tools to make it easier for perf trace to be
> created.
>
> I guess this patchset only factorizes 10 % of what could be done,
> the largest part is the intersection between perf report and perf
> annotate. It's a lot of work.
>
> I guess I will do the rest in separate patchsets while writing
> perf trace.
Pulled, thanks Frederic!
Ingo
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [GIT PULL] perf tools: Factorize common code
2009-08-12 9:25 [GIT PULL] perf tools: Factorize common code Frederic Weisbecker
` (4 preceding siblings ...)
2009-08-12 9:32 ` Ingo Molnar
@ 2009-08-12 9:52 ` Peter Zijlstra
5 siblings, 0 replies; 17+ messages in thread
From: Peter Zijlstra @ 2009-08-12 9:52 UTC (permalink / raw)
To: Frederic Weisbecker
Cc: Ingo Molnar, LKML, Arnaldo Carvalho de Melo, Mike Galbraith,
Brice Goglin
On Wed, 2009-08-12 at 11:25 +0200, Frederic Weisbecker wrote:
> Ingo,
>
> This set factorizes the common definition of structs, functions,
> variables inside perf tools to make it easier for perf trace to
> be created.
>
> I guess this patchset only factorizes 10 % of what could be done,
> the largest part is the intersection between perf report and perf
> annotate. It's a lot of work.
>
> I guess I will do the rest in separate patchsets while writing
> perf trace.
Awesome, much needed cleanups.
Thanks
^ permalink raw reply [flat|nested] 17+ messages in thread