linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] perf tools: unify event type description
@ 2009-12-29  8:37 Liming Wang
  2009-12-29  8:37 ` [PATCH 2/3] perf tools: remove pid option from stat Liming Wang
  2009-12-30 12:22 ` [tip:perf/core] perf tools: Unify event type description tip-bot for Liming Wang
  0 siblings, 2 replies; 11+ messages in thread
From: Liming Wang @ 2009-12-29  8:37 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Frederic Weisbecker, Masami Hiramatsu, Paul Mackerras,
	Thomas Gleixner, Peter Zijlstra, linux-kernel, Liming Wang

make event type description to a unified array and
the array index consistent to perf_type_id.

Signed-off-by: Liming Wang <liming.wang@windriver.com>
---
 tools/perf/util/parse-events.c |   19 ++++++++++---------
 1 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index e5bc0fb..dc585a8 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -835,11 +835,12 @@ int parse_filter(const struct option *opt __used, const char *str,
 }
 
 static const char * const event_type_descriptors[] = {
-	"",
 	"Hardware event",
 	"Software event",
 	"Tracepoint event",
 	"Hardware cache event",
+	"Raw hardware event descriptor",
+	"Hardware breakpoint",
 };
 
 /*
@@ -872,7 +873,7 @@ static void print_tracepoint_events(void)
 			snprintf(evt_path, MAXPATHLEN, "%s:%s",
 				 sys_dirent.d_name, evt_dirent.d_name);
 			printf("  %-42s [%s]\n", evt_path,
-				event_type_descriptors[PERF_TYPE_TRACEPOINT+1]);
+				event_type_descriptors[PERF_TYPE_TRACEPOINT]);
 		}
 		closedir(evt_dir);
 	}
@@ -892,9 +893,7 @@ void print_events(void)
 	printf("List of pre-defined events (to be used in -e):\n");
 
 	for (i = 0; i < ARRAY_SIZE(event_symbols); i++, syms++) {
-		type = syms->type + 1;
-		if (type >= ARRAY_SIZE(event_type_descriptors))
-			type = 0;
+		type = syms->type;
 
 		if (type != prev_type)
 			printf("\n");
@@ -919,17 +918,19 @@ void print_events(void)
 			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
 				printf("  %-42s [%s]\n",
 					event_cache_name(type, op, i),
-					event_type_descriptors[4]);
+					event_type_descriptors[PERF_TYPE_HW_CACHE]);
 			}
 		}
 	}
 
 	printf("\n");
-	printf("  %-42s [raw hardware event descriptor]\n",
-		"rNNN");
+	printf("  %-42s [%s]\n",
+		"rNNN", event_type_descriptors[PERF_TYPE_RAW]);
 	printf("\n");
 
-	printf("  %-42s [hardware breakpoint]\n", "mem:<addr>[:access]");
+	printf("  %-42s [%s]\n",
+			"mem:<addr>[:access]",
+			event_type_descriptors[PERF_TYPE_BREAKPOINT]);
 	printf("\n");
 
 	print_tracepoint_events();
-- 
1.6.0.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/3] perf tools: remove pid option from stat
  2009-12-29  8:37 [PATCH 1/3] perf tools: unify event type description Liming Wang
@ 2009-12-29  8:37 ` Liming Wang
  2009-12-29  8:37   ` [PATCH 3/3] perf probe: change CONFIG_KPROBE_TRACER to CONFIG_KPROBE_EVENT Liming Wang
  2009-12-29 12:04   ` [PATCH 2/3] perf tools: remove pid option from stat Peter Zijlstra
  2009-12-30 12:22 ` [tip:perf/core] perf tools: Unify event type description tip-bot for Liming Wang
  1 sibling, 2 replies; 11+ messages in thread
From: Liming Wang @ 2009-12-29  8:37 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Frederic Weisbecker, Masami Hiramatsu, Paul Mackerras,
	Thomas Gleixner, Peter Zijlstra, linux-kernel, Liming Wang

pid option is useless for stat, so remove it.

Signed-off-by: Liming Wang <liming.wang@windriver.com>
---
 tools/perf/builtin-stat.c |    3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index c70d720..e3b31a3 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -71,7 +71,6 @@ static int			run_idx				=  0;
 static int			run_count			=  1;
 static int			inherit				=  1;
 static int			scale				=  1;
-static pid_t			target_pid			= -1;
 static pid_t			child_pid			= -1;
 static int			null_run			=  0;
 
@@ -471,8 +470,6 @@ static const struct option options[] = {
 		     parse_events),
 	OPT_BOOLEAN('i', "inherit", &inherit,
 		    "child tasks inherit counters"),
-	OPT_INTEGER('p', "pid", &target_pid,
-		    "stat events on existing pid"),
 	OPT_BOOLEAN('a', "all-cpus", &system_wide,
 		    "system-wide collection from all CPUs"),
 	OPT_BOOLEAN('c', "scale", &scale,
-- 
1.6.0.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/3] perf probe: change CONFIG_KPROBE_TRACER to CONFIG_KPROBE_EVENT
  2009-12-29  8:37 ` [PATCH 2/3] perf tools: remove pid option from stat Liming Wang
@ 2009-12-29  8:37   ` Liming Wang
  2009-12-30  2:32     ` Masami Hiramatsu
  2009-12-30 12:23     ` [tip:perf/core] perf probe: Change " tip-bot for Liming Wang
  2009-12-29 12:04   ` [PATCH 2/3] perf tools: remove pid option from stat Peter Zijlstra
  1 sibling, 2 replies; 11+ messages in thread
From: Liming Wang @ 2009-12-29  8:37 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Frederic Weisbecker, Masami Hiramatsu, Paul Mackerras,
	Thomas Gleixner, Peter Zijlstra, linux-kernel, Liming Wang

make the config name consistent

Signed-off-by: Liming Wang <liming.wang@windriver.com>
---
 tools/perf/util/probe-event.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 29465d4..8e532d9 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -368,7 +368,7 @@ static int open_kprobe_events(int flags, int mode)
 	if (ret < 0) {
 		if (errno == ENOENT)
 			die("kprobe_events file does not exist -"
-			    " please rebuild with CONFIG_KPROBE_TRACER.");
+			    " please rebuild with CONFIG_KPROBE_EVENT.");
 		else
 			die("Could not open kprobe_events file: %s",
 			    strerror(errno));
-- 
1.6.0.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] perf tools: remove pid option from stat
  2009-12-29  8:37 ` [PATCH 2/3] perf tools: remove pid option from stat Liming Wang
  2009-12-29  8:37   ` [PATCH 3/3] perf probe: change CONFIG_KPROBE_TRACER to CONFIG_KPROBE_EVENT Liming Wang
@ 2009-12-29 12:04   ` Peter Zijlstra
  2009-12-30  9:23     ` Ingo Molnar
  1 sibling, 1 reply; 11+ messages in thread
From: Peter Zijlstra @ 2009-12-29 12:04 UTC (permalink / raw)
  To: Liming Wang
  Cc: Ingo Molnar, Frederic Weisbecker, Masami Hiramatsu,
	Paul Mackerras, Thomas Gleixner, linux-kernel

On Tue, 2009-12-29 at 16:37 +0800, Liming Wang wrote:
> pid option is useless for stat, so remove it.

Hmm, it shouldn't be.. and instead of removing it I would suggesting
fixing this.

> Signed-off-by: Liming Wang <liming.wang@windriver.com>
> ---
>  tools/perf/builtin-stat.c |    3 ---
>  1 files changed, 0 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> index c70d720..e3b31a3 100644
> --- a/tools/perf/builtin-stat.c
> +++ b/tools/perf/builtin-stat.c
> @@ -71,7 +71,6 @@ static int			run_idx				=  0;
>  static int			run_count			=  1;
>  static int			inherit				=  1;
>  static int			scale				=  1;
> -static pid_t			target_pid			= -1;
>  static pid_t			child_pid			= -1;
>  static int			null_run			=  0;
>  
> @@ -471,8 +470,6 @@ static const struct option options[] = {
>  		     parse_events),
>  	OPT_BOOLEAN('i', "inherit", &inherit,
>  		    "child tasks inherit counters"),
> -	OPT_INTEGER('p', "pid", &target_pid,
> -		    "stat events on existing pid"),
>  	OPT_BOOLEAN('a', "all-cpus", &system_wide,
>  		    "system-wide collection from all CPUs"),
>  	OPT_BOOLEAN('c', "scale", &scale,



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/3] perf probe: change CONFIG_KPROBE_TRACER to CONFIG_KPROBE_EVENT
  2009-12-29  8:37   ` [PATCH 3/3] perf probe: change CONFIG_KPROBE_TRACER to CONFIG_KPROBE_EVENT Liming Wang
@ 2009-12-30  2:32     ` Masami Hiramatsu
  2009-12-30 12:23     ` [tip:perf/core] perf probe: Change " tip-bot for Liming Wang
  1 sibling, 0 replies; 11+ messages in thread
From: Masami Hiramatsu @ 2009-12-30  2:32 UTC (permalink / raw)
  To: Liming Wang
  Cc: Ingo Molnar, Frederic Weisbecker, Paul Mackerras,
	Thomas Gleixner, Peter Zijlstra, linux-kernel

Liming Wang wrote:
> make the config name consistent
> 
> Signed-off-by: Liming Wang <liming.wang@windriver.com>

Ah, right. Thank you!

Acked-by: Masami Hiramatsu <mhiramat@redhat.com>

> ---
>  tools/perf/util/probe-event.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 29465d4..8e532d9 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -368,7 +368,7 @@ static int open_kprobe_events(int flags, int mode)
>  	if (ret < 0) {
>  		if (errno == ENOENT)
>  			die("kprobe_events file does not exist -"
> -			    " please rebuild with CONFIG_KPROBE_TRACER.");
> +			    " please rebuild with CONFIG_KPROBE_EVENT.");
>  		else
>  			die("Could not open kprobe_events file: %s",
>  			    strerror(errno));

-- 
Masami Hiramatsu

Software Engineer
Hitachi Computer Products (America), Inc.
Software Solutions Division

e-mail: mhiramat@redhat.com


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] perf tools: remove pid option from stat
  2009-12-29 12:04   ` [PATCH 2/3] perf tools: remove pid option from stat Peter Zijlstra
@ 2009-12-30  9:23     ` Ingo Molnar
  2009-12-30  9:29       ` Wang Liming
  2009-12-31  8:05       ` [PATCH 1/1] perf tools: fix pid option for stat Liming Wang
  0 siblings, 2 replies; 11+ messages in thread
From: Ingo Molnar @ 2009-12-30  9:23 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Liming Wang, Frederic Weisbecker, Masami Hiramatsu,
	Paul Mackerras, Thomas Gleixner, linux-kernel


* Peter Zijlstra <peterz@infradead.org> wrote:

> On Tue, 2009-12-29 at 16:37 +0800, Liming Wang wrote:
> > pid option is useless for stat, so remove it.
> 
> Hmm, it shouldn't be.. and instead of removing it I would suggesting fixing 
> this.

Yes. For exampe something like:

  perf stat --repeat 10 --pid $(pidof firefox) sleep 1

Should show firefox's resource usage sampled over 10 seconds.

If this doesnt work it should be fixed. Plus i suspect we should allow:

  perf stat --pid $(pidof firefox)

to run until Ctrl-C - like perf record allows.

	Ingo

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] perf tools: remove pid option from stat
  2009-12-30  9:23     ` Ingo Molnar
@ 2009-12-30  9:29       ` Wang Liming
  2009-12-31  8:05       ` [PATCH 1/1] perf tools: fix pid option for stat Liming Wang
  1 sibling, 0 replies; 11+ messages in thread
From: Wang Liming @ 2009-12-30  9:29 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Peter Zijlstra, Frederic Weisbecker, Masami Hiramatsu,
	Paul Mackerras, Thomas Gleixner, linux-kernel

Ingo Molnar wrote:
> * Peter Zijlstra <peterz@infradead.org> wrote:
> 
>> On Tue, 2009-12-29 at 16:37 +0800, Liming Wang wrote:
>>> pid option is useless for stat, so remove it.
>> Hmm, it shouldn't be.. and instead of removing it I would suggesting fixing 
>> this.
> 
> Yes. For exampe something like:
> 
>   perf stat --repeat 10 --pid $(pidof firefox) sleep 1
> 
> Should show firefox's resource usage sampled over 10 seconds.
> 
> If this doesnt work it should be fixed. Plus i suspect we should allow:
> 
>   perf stat --pid $(pidof firefox)
> 
> to run until Ctrl-C - like perf record allows.
Yes, perf record works well with "--pid".
I think stat can borrow come code from record.
Please discard this patch.

Liming Wang
> 
> 	Ingo
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [tip:perf/core] perf tools: Unify event type description
  2009-12-29  8:37 [PATCH 1/3] perf tools: unify event type description Liming Wang
  2009-12-29  8:37 ` [PATCH 2/3] perf tools: remove pid option from stat Liming Wang
@ 2009-12-30 12:22 ` tip-bot for Liming Wang
  1 sibling, 0 replies; 11+ messages in thread
From: tip-bot for Liming Wang @ 2009-12-30 12:22 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, paulus, hpa, mingo, peterz, fweisbec, tglx,
	liming.wang, mhiramat, mingo

Commit-ID:  41bdcb23dab22bf27361c5f2d89fe895d8904915
Gitweb:     http://git.kernel.org/tip/41bdcb23dab22bf27361c5f2d89fe895d8904915
Author:     Liming Wang <liming.wang@windriver.com>
AuthorDate: Tue, 29 Dec 2009 16:37:07 +0800
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Wed, 30 Dec 2009 11:58:53 +0100

perf tools: Unify event type description

make event type description to a unified array and
the array index consistent to perf_type_id.

Signed-off-by: Liming Wang <liming.wang@windriver.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <1262075829-16257-1-git-send-email-liming.wang@windriver.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 tools/perf/util/parse-events.c |   19 ++++++++++---------
 1 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index e5bc0fb..dc585a8 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -835,11 +835,12 @@ int parse_filter(const struct option *opt __used, const char *str,
 }
 
 static const char * const event_type_descriptors[] = {
-	"",
 	"Hardware event",
 	"Software event",
 	"Tracepoint event",
 	"Hardware cache event",
+	"Raw hardware event descriptor",
+	"Hardware breakpoint",
 };
 
 /*
@@ -872,7 +873,7 @@ static void print_tracepoint_events(void)
 			snprintf(evt_path, MAXPATHLEN, "%s:%s",
 				 sys_dirent.d_name, evt_dirent.d_name);
 			printf("  %-42s [%s]\n", evt_path,
-				event_type_descriptors[PERF_TYPE_TRACEPOINT+1]);
+				event_type_descriptors[PERF_TYPE_TRACEPOINT]);
 		}
 		closedir(evt_dir);
 	}
@@ -892,9 +893,7 @@ void print_events(void)
 	printf("List of pre-defined events (to be used in -e):\n");
 
 	for (i = 0; i < ARRAY_SIZE(event_symbols); i++, syms++) {
-		type = syms->type + 1;
-		if (type >= ARRAY_SIZE(event_type_descriptors))
-			type = 0;
+		type = syms->type;
 
 		if (type != prev_type)
 			printf("\n");
@@ -919,17 +918,19 @@ void print_events(void)
 			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
 				printf("  %-42s [%s]\n",
 					event_cache_name(type, op, i),
-					event_type_descriptors[4]);
+					event_type_descriptors[PERF_TYPE_HW_CACHE]);
 			}
 		}
 	}
 
 	printf("\n");
-	printf("  %-42s [raw hardware event descriptor]\n",
-		"rNNN");
+	printf("  %-42s [%s]\n",
+		"rNNN", event_type_descriptors[PERF_TYPE_RAW]);
 	printf("\n");
 
-	printf("  %-42s [hardware breakpoint]\n", "mem:<addr>[:access]");
+	printf("  %-42s [%s]\n",
+			"mem:<addr>[:access]",
+			event_type_descriptors[PERF_TYPE_BREAKPOINT]);
 	printf("\n");
 
 	print_tracepoint_events();

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [tip:perf/core] perf probe: Change CONFIG_KPROBE_TRACER to CONFIG_KPROBE_EVENT
  2009-12-29  8:37   ` [PATCH 3/3] perf probe: change CONFIG_KPROBE_TRACER to CONFIG_KPROBE_EVENT Liming Wang
  2009-12-30  2:32     ` Masami Hiramatsu
@ 2009-12-30 12:23     ` tip-bot for Liming Wang
  1 sibling, 0 replies; 11+ messages in thread
From: tip-bot for Liming Wang @ 2009-12-30 12:23 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, paulus, hpa, mingo, peterz, fweisbec, tglx,
	liming.wang, mhiramat, mingo

Commit-ID:  63bbd5e2d539c9290b229c832f62d42aac23db94
Gitweb:     http://git.kernel.org/tip/63bbd5e2d539c9290b229c832f62d42aac23db94
Author:     Liming Wang <liming.wang@windriver.com>
AuthorDate: Tue, 29 Dec 2009 16:37:09 +0800
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Wed, 30 Dec 2009 11:59:34 +0100

perf probe: Change CONFIG_KPROBE_TRACER to CONFIG_KPROBE_EVENT

make the config name consistent

Signed-off-by: Liming Wang <liming.wang@windriver.com>
Acked-by: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <1262075829-16257-3-git-send-email-liming.wang@windriver.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 tools/perf/util/probe-event.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 29465d4..8e532d9 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -368,7 +368,7 @@ static int open_kprobe_events(int flags, int mode)
 	if (ret < 0) {
 		if (errno == ENOENT)
 			die("kprobe_events file does not exist -"
-			    " please rebuild with CONFIG_KPROBE_TRACER.");
+			    " please rebuild with CONFIG_KPROBE_EVENT.");
 		else
 			die("Could not open kprobe_events file: %s",
 			    strerror(errno));

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 1/1] perf tools: fix pid option for stat
  2009-12-30  9:23     ` Ingo Molnar
  2009-12-30  9:29       ` Wang Liming
@ 2009-12-31  8:05       ` Liming Wang
  2010-01-13 10:31         ` [tip:perf/core] perf tools: Fix --pid " tip-bot for Liming Wang
  1 sibling, 1 reply; 11+ messages in thread
From: Liming Wang @ 2009-12-31  8:05 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Frederic Weisbecker, Paul Mackerras, Thomas Gleixner,
	Peter Zijlstra, linux-kernel, Liming Wang

current pid option doesn't work for perf stat. Change it to what
perf record --pid acts as.

Signed-off-by: Liming Wang <liming.wang@windriver.com>
---
 tools/perf/builtin-stat.c |  106 ++++++++++++++++++++++++++-------------------
 1 files changed, 61 insertions(+), 45 deletions(-)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index c70d720..e8c85d5 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -44,6 +44,7 @@
 #include "util/parse-events.h"
 #include "util/event.h"
 #include "util/debug.h"
+#include "util/header.h"
 
 #include <sys/prctl.h>
 #include <math.h>
@@ -79,6 +80,8 @@ static int			fd[MAX_NR_CPUS][MAX_COUNTERS];
 
 static int			event_scaled[MAX_COUNTERS];
 
+static volatile int done = 0;
+
 struct stats
 {
 	double n, mean, M2;
@@ -247,61 +250,64 @@ static int run_perf_stat(int argc __used, const char **argv)
 	unsigned long long t0, t1;
 	int status = 0;
 	int counter;
-	int pid;
+	int pid = target_pid;
 	int child_ready_pipe[2], go_pipe[2];
+	const bool forks = (target_pid == -1 && argc > 0);
 	char buf;
 
 	if (!system_wide)
 		nr_cpus = 1;
 
-	if (pipe(child_ready_pipe) < 0 || pipe(go_pipe) < 0) {
+	if (forks && (pipe(child_ready_pipe) < 0 || pipe(go_pipe) < 0)) {
 		perror("failed to create pipes");
 		exit(1);
 	}
 
-	if ((pid = fork()) < 0)
-		perror("failed to fork");
+	if (forks) {
+		if ((pid = fork()) < 0)
+			perror("failed to fork");
+
+		if (!pid) {
+			close(child_ready_pipe[0]);
+			close(go_pipe[1]);
+			fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);
+
+			/*
+			 * Do a dummy execvp to get the PLT entry resolved,
+			 * so we avoid the resolver overhead on the real
+			 * execvp call.
+			 */
+			execvp("", (char **)argv);
+
+			/*
+			 * Tell the parent we're ready to go
+			 */
+			close(child_ready_pipe[1]);
+
+			/*
+			 * Wait until the parent tells us to go.
+			 */
+			if (read(go_pipe[0], &buf, 1) == -1)
+				perror("unable to read pipe");
+
+			execvp(argv[0], (char **)argv);
+
+			perror(argv[0]);
+			exit(-1);
+		}
 
-	if (!pid) {
-		close(child_ready_pipe[0]);
-		close(go_pipe[1]);
-		fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);
+		child_pid = pid;
 
 		/*
-		 * Do a dummy execvp to get the PLT entry resolved,
-		 * so we avoid the resolver overhead on the real
-		 * execvp call.
-		 */
-		execvp("", (char **)argv);
-
-		/*
-		 * Tell the parent we're ready to go
+		 * Wait for the child to be ready to exec.
 		 */
 		close(child_ready_pipe[1]);
-
-		/*
-		 * Wait until the parent tells us to go.
-		 */
-		if (read(go_pipe[0], &buf, 1) == -1)
+		close(go_pipe[0]);
+		if (read(child_ready_pipe[0], &buf, 1) == -1)
 			perror("unable to read pipe");
-
-		execvp(argv[0], (char **)argv);
-
-		perror(argv[0]);
-		exit(-1);
+		close(child_ready_pipe[0]);
 	}
 
-	child_pid = pid;
-
-	/*
-	 * Wait for the child to be ready to exec.
-	 */
-	close(child_ready_pipe[1]);
-	close(go_pipe[0]);
-	if (read(child_ready_pipe[0], &buf, 1) == -1)
-		perror("unable to read pipe");
-	close(child_ready_pipe[0]);
-
 	for (counter = 0; counter < nr_counters; counter++)
 		create_perf_stat_counter(counter, pid);
 
@@ -310,8 +316,12 @@ static int run_perf_stat(int argc __used, const char **argv)
 	 */
 	t0 = rdclock();
 
-	close(go_pipe[1]);
-	wait(&status);
+	if (forks) {
+		close(go_pipe[1]);
+		wait(&status);
+	} else {
+		while(!done);
+	}
 
 	t1 = rdclock();
 
@@ -417,10 +427,13 @@ static void print_stat(int argc, const char **argv)
 	fflush(stdout);
 
 	fprintf(stderr, "\n");
-	fprintf(stderr, " Performance counter stats for \'%s", argv[0]);
-
-	for (i = 1; i < argc; i++)
-		fprintf(stderr, " %s", argv[i]);
+	fprintf(stderr, " Performance counter stats for ");
+	if(target_pid == -1) {
+		fprintf(stderr, "\'%s", argv[0]);
+		for (i = 1; i < argc; i++)
+			fprintf(stderr, " %s", argv[i]);
+	}else
+		fprintf(stderr, "task pid \'%d", target_pid);
 
 	fprintf(stderr, "\'");
 	if (run_count > 1)
@@ -445,6 +458,9 @@ static volatile int signr = -1;
 
 static void skip_signal(int signo)
 {
+	if(target_pid != -1)
+		done = 1;
+
 	signr = signo;
 }
 
@@ -461,7 +477,7 @@ static void sig_atexit(void)
 }
 
 static const char * const stat_usage[] = {
-	"perf stat [<options>] <command>",
+	"perf stat [<options>] [<command>]",
 	NULL
 };
 
@@ -492,7 +508,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)
 
 	argc = parse_options(argc, argv, options, stat_usage,
 		PARSE_OPT_STOP_AT_NON_OPTION);
-	if (!argc)
+	if (!argc && target_pid == -1)
 		usage_with_options(stat_usage, options);
 	if (run_count <= 0)
 		usage_with_options(stat_usage, options);
-- 
1.6.0.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [tip:perf/core] perf tools: Fix --pid option for stat
  2009-12-31  8:05       ` [PATCH 1/1] perf tools: fix pid option for stat Liming Wang
@ 2010-01-13 10:31         ` tip-bot for Liming Wang
  0 siblings, 0 replies; 11+ messages in thread
From: tip-bot for Liming Wang @ 2010-01-13 10:31 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, paulus, hpa, mingo, peterz, fweisbec, tglx,
	liming.wang, mingo

Commit-ID:  60666c630bdb33983a894b050b588b663f38f368
Gitweb:     http://git.kernel.org/tip/60666c630bdb33983a894b050b588b663f38f368
Author:     Liming Wang <liming.wang@windriver.com>
AuthorDate: Thu, 31 Dec 2009 16:05:50 +0800
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Wed, 13 Jan 2010 10:09:08 +0100

perf tools: Fix --pid option for stat

current pid option doesn't work for perf stat. Change it to what
perf record --pid acts as.

Signed-off-by: Liming Wang <liming.wang@windriver.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <1262246750-2191-1-git-send-email-liming.wang@windriver.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 tools/perf/builtin-stat.c |  106 ++++++++++++++++++++++++++-------------------
 1 files changed, 61 insertions(+), 45 deletions(-)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index c70d720..e8c85d5 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -44,6 +44,7 @@
 #include "util/parse-events.h"
 #include "util/event.h"
 #include "util/debug.h"
+#include "util/header.h"
 
 #include <sys/prctl.h>
 #include <math.h>
@@ -79,6 +80,8 @@ static int			fd[MAX_NR_CPUS][MAX_COUNTERS];
 
 static int			event_scaled[MAX_COUNTERS];
 
+static volatile int done = 0;
+
 struct stats
 {
 	double n, mean, M2;
@@ -247,61 +250,64 @@ static int run_perf_stat(int argc __used, const char **argv)
 	unsigned long long t0, t1;
 	int status = 0;
 	int counter;
-	int pid;
+	int pid = target_pid;
 	int child_ready_pipe[2], go_pipe[2];
+	const bool forks = (target_pid == -1 && argc > 0);
 	char buf;
 
 	if (!system_wide)
 		nr_cpus = 1;
 
-	if (pipe(child_ready_pipe) < 0 || pipe(go_pipe) < 0) {
+	if (forks && (pipe(child_ready_pipe) < 0 || pipe(go_pipe) < 0)) {
 		perror("failed to create pipes");
 		exit(1);
 	}
 
-	if ((pid = fork()) < 0)
-		perror("failed to fork");
+	if (forks) {
+		if ((pid = fork()) < 0)
+			perror("failed to fork");
+
+		if (!pid) {
+			close(child_ready_pipe[0]);
+			close(go_pipe[1]);
+			fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);
+
+			/*
+			 * Do a dummy execvp to get the PLT entry resolved,
+			 * so we avoid the resolver overhead on the real
+			 * execvp call.
+			 */
+			execvp("", (char **)argv);
+
+			/*
+			 * Tell the parent we're ready to go
+			 */
+			close(child_ready_pipe[1]);
+
+			/*
+			 * Wait until the parent tells us to go.
+			 */
+			if (read(go_pipe[0], &buf, 1) == -1)
+				perror("unable to read pipe");
+
+			execvp(argv[0], (char **)argv);
+
+			perror(argv[0]);
+			exit(-1);
+		}
 
-	if (!pid) {
-		close(child_ready_pipe[0]);
-		close(go_pipe[1]);
-		fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);
+		child_pid = pid;
 
 		/*
-		 * Do a dummy execvp to get the PLT entry resolved,
-		 * so we avoid the resolver overhead on the real
-		 * execvp call.
-		 */
-		execvp("", (char **)argv);
-
-		/*
-		 * Tell the parent we're ready to go
+		 * Wait for the child to be ready to exec.
 		 */
 		close(child_ready_pipe[1]);
-
-		/*
-		 * Wait until the parent tells us to go.
-		 */
-		if (read(go_pipe[0], &buf, 1) == -1)
+		close(go_pipe[0]);
+		if (read(child_ready_pipe[0], &buf, 1) == -1)
 			perror("unable to read pipe");
-
-		execvp(argv[0], (char **)argv);
-
-		perror(argv[0]);
-		exit(-1);
+		close(child_ready_pipe[0]);
 	}
 
-	child_pid = pid;
-
-	/*
-	 * Wait for the child to be ready to exec.
-	 */
-	close(child_ready_pipe[1]);
-	close(go_pipe[0]);
-	if (read(child_ready_pipe[0], &buf, 1) == -1)
-		perror("unable to read pipe");
-	close(child_ready_pipe[0]);
-
 	for (counter = 0; counter < nr_counters; counter++)
 		create_perf_stat_counter(counter, pid);
 
@@ -310,8 +316,12 @@ static int run_perf_stat(int argc __used, const char **argv)
 	 */
 	t0 = rdclock();
 
-	close(go_pipe[1]);
-	wait(&status);
+	if (forks) {
+		close(go_pipe[1]);
+		wait(&status);
+	} else {
+		while(!done);
+	}
 
 	t1 = rdclock();
 
@@ -417,10 +427,13 @@ static void print_stat(int argc, const char **argv)
 	fflush(stdout);
 
 	fprintf(stderr, "\n");
-	fprintf(stderr, " Performance counter stats for \'%s", argv[0]);
-
-	for (i = 1; i < argc; i++)
-		fprintf(stderr, " %s", argv[i]);
+	fprintf(stderr, " Performance counter stats for ");
+	if(target_pid == -1) {
+		fprintf(stderr, "\'%s", argv[0]);
+		for (i = 1; i < argc; i++)
+			fprintf(stderr, " %s", argv[i]);
+	}else
+		fprintf(stderr, "task pid \'%d", target_pid);
 
 	fprintf(stderr, "\'");
 	if (run_count > 1)
@@ -445,6 +458,9 @@ static volatile int signr = -1;
 
 static void skip_signal(int signo)
 {
+	if(target_pid != -1)
+		done = 1;
+
 	signr = signo;
 }
 
@@ -461,7 +477,7 @@ static void sig_atexit(void)
 }
 
 static const char * const stat_usage[] = {
-	"perf stat [<options>] <command>",
+	"perf stat [<options>] [<command>]",
 	NULL
 };
 
@@ -492,7 +508,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)
 
 	argc = parse_options(argc, argv, options, stat_usage,
 		PARSE_OPT_STOP_AT_NON_OPTION);
-	if (!argc)
+	if (!argc && target_pid == -1)
 		usage_with_options(stat_usage, options);
 	if (run_count <= 0)
 		usage_with_options(stat_usage, options);

^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2010-01-13 10:32 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-12-29  8:37 [PATCH 1/3] perf tools: unify event type description Liming Wang
2009-12-29  8:37 ` [PATCH 2/3] perf tools: remove pid option from stat Liming Wang
2009-12-29  8:37   ` [PATCH 3/3] perf probe: change CONFIG_KPROBE_TRACER to CONFIG_KPROBE_EVENT Liming Wang
2009-12-30  2:32     ` Masami Hiramatsu
2009-12-30 12:23     ` [tip:perf/core] perf probe: Change " tip-bot for Liming Wang
2009-12-29 12:04   ` [PATCH 2/3] perf tools: remove pid option from stat Peter Zijlstra
2009-12-30  9:23     ` Ingo Molnar
2009-12-30  9:29       ` Wang Liming
2009-12-31  8:05       ` [PATCH 1/1] perf tools: fix pid option for stat Liming Wang
2010-01-13 10:31         ` [tip:perf/core] perf tools: Fix --pid " tip-bot for Liming Wang
2009-12-30 12:22 ` [tip:perf/core] perf tools: Unify event type description tip-bot for Liming Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).