linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/7] Profiling sleep times (v4)
@ 2011-12-07 13:55 Andrew Vagin
  2011-12-07 13:55 ` [PATCH 1/6] perf: use event_name() to get an event name Andrew Vagin
                   ` (5 more replies)
  0 siblings, 6 replies; 15+ messages in thread
From: Andrew Vagin @ 2011-12-07 13:55 UTC (permalink / raw)
  To: acme
  Cc: linux-kernel, a.p.zijlstra, paulus, mingo, asharma, devel,
	dsahern, linux-perf-users

Do you want to know where your code waits locks for a long time?
Yes! It's for you. This feature helps you to find bottlenecks.

It's not artificial task. Once one of my colleague was investigating a
scalability problem. He pressed sysrq-t some times and tried to merge
call-chains by hand. But perf can do that.

Problem:
The problem is that events sched_stat_* contain call-chains of
non-target tasks.
About month ago I sent series of patches:

[PATCH 0/3] trace: add ability to collect call chains of non current task.

Peter and Frederic explained me, that this solve isn't good and will be
better to make it in userspace.

Now it's in userspace. This series expands "perf inject" to be able to
merge sched_switch events and sched_stat* events. sched_switch events
contain correct call-chains and sched_stat contains a correct time
slices.

v2:
* Removed all known issues. Now it works completely.
* Improved usability of sched-stat scripts according with Arun's comments.
v3: fixed accoding to comments from David Ahem
v4: rebase to linux-tip

Andrew Vagin (6):
  perf: use event_name() to get an event name
  perf: add ability to change event according to sample (v3)
  perf: add ability to record event period
  perf: teach "perf inject" to work with files
  perf: teach perf inject to merge sched_stat_* and sched_switch events
  perf: add scripts for profiling sleep times (v2)

 tools/perf/builtin-inject.c                     |  132 +++++++++++++++++++++--
 tools/perf/builtin-record.c                     |    1 +
 tools/perf/perf.h                               |    1 +
 tools/perf/scripts/python/bin/sched-stat-record |   65 +++++++++++
 tools/perf/scripts/python/bin/sched-stat-report |    5 +
 tools/perf/util/event.h                         |    2 +
 tools/perf/util/evsel.c                         |   77 +++++++++++++
 tools/perf/util/header.c                        |    2 +-
 tools/perf/util/session.h                       |    9 ++
 9 files changed, 286 insertions(+), 8 deletions(-)
 create mode 100644 tools/perf/scripts/python/bin/sched-stat-record
 create mode 100644 tools/perf/scripts/python/bin/sched-stat-report

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

* [PATCH 1/6] perf: use event_name() to get an event name
  2011-12-07 13:55 [PATCH 0/7] Profiling sleep times (v4) Andrew Vagin
@ 2011-12-07 13:55 ` Andrew Vagin
  2011-12-07 13:55 ` [PATCH 2/6] perf: add ability to change event according to sample (v3) Andrew Vagin
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 15+ messages in thread
From: Andrew Vagin @ 2011-12-07 13:55 UTC (permalink / raw)
  To: acme
  Cc: linux-kernel, a.p.zijlstra, paulus, mingo, asharma, devel,
	dsahern, linux-perf-users

perf_evsel.name may be not initialized

Signed-off-by: Andrew Vagin <avagin@openvz.org>
---
 tools/perf/util/header.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 9272f3a..5b01449 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -388,7 +388,7 @@ static int write_event_desc(int fd, struct perf_header *h __used,
 		/*
 		 * write event string as passed on cmdline
 		 */
-		ret = do_write_string(fd, attr->name);
+		ret = do_write_string(fd, event_name(attr));
 		if (ret < 0)
 			return ret;
 		/*
-- 
1.7.1


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

* [PATCH 2/6] perf: add ability to change event according to sample (v3)
  2011-12-07 13:55 [PATCH 0/7] Profiling sleep times (v4) Andrew Vagin
  2011-12-07 13:55 ` [PATCH 1/6] perf: use event_name() to get an event name Andrew Vagin
@ 2011-12-07 13:55 ` Andrew Vagin
  2011-12-12 17:35   ` [tip:perf/core] perf tools: Add ability to synthesize event according to a sample tip-bot for Andrew Vagin
  2011-12-07 13:55 ` [PATCH 3/6] perf: add ability to record event period Andrew Vagin
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Andrew Vagin @ 2011-12-07 13:55 UTC (permalink / raw)
  To: acme
  Cc: linux-kernel, a.p.zijlstra, paulus, mingo, asharma, devel,
	dsahern, linux-perf-users

It's opposition of perf_session__parse_sample.

v2: fixed mistakes which David Arhen found
v3: s/data/sample/
    s/perf_event__change_sample/perf_event__synthesize_sample

Reviewed-by: David Ahern <dsahern@gmail.com>
Signed-off-by: Andrew Vagin <avagin@openvz.org>
---
 tools/perf/util/event.h   |    2 +
 tools/perf/util/evsel.c   |   74 +++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/session.h |    9 +++++
 3 files changed, 85 insertions(+), 0 deletions(-)

diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 0d80201..cc3cc11 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -199,6 +199,8 @@ const char *perf_event__name(unsigned int id);
 int perf_event__parse_sample(const union perf_event *event, u64 type,
 			     int sample_size, bool sample_id_all,
 			     struct perf_sample *sample, bool swapped);
+int perf_event__synthesize_sample(union perf_event *event, u64 type,
+			     const struct perf_sample *sample, bool swapped);
 
 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index ee68d69..e2d1b22 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -574,3 +574,77 @@ int perf_event__parse_sample(const union perf_event *event, u64 type,
 
 	return 0;
 }
+
+int perf_event__synthesize_sample(union perf_event *event, u64 type,
+			     const struct perf_sample *sample, bool swapped)
+{
+	u64 *array;
+
+	/*
+	 * used for cross-endian analysis. See git commit 65014ab3
+	 * for why this goofiness is needed.
+	 */
+	union {
+		u64 val64;
+		u32 val32[2];
+	} u;
+
+	array = event->sample.array;
+
+	if (type & PERF_SAMPLE_IP) {
+		event->ip.ip = sample->ip;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_TID) {
+		u.val32[0] = sample->pid;
+		u.val32[1] = sample->tid;
+		if (swapped) {
+			/* undo swap of u64, then swap on individual u32s */
+			u.val32[0] = bswap_32(u.val32[0]);
+			u.val32[1] = bswap_32(u.val32[1]);
+			u.val64 = bswap_64(u.val64);
+		}
+
+		*array = u.val64;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_TIME) {
+		*array = sample->time;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_ADDR) {
+		*array = sample->addr;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_ID) {
+		*array = sample->id;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_STREAM_ID) {
+		*array = sample->stream_id;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_CPU) {
+		u.val32[0] = sample->cpu;
+		if (swapped) {
+			/* undo swap of u64, then swap on individual u32s */
+			u.val32[0] = bswap_32(u.val32[0]);
+			u.val64 = bswap_64(u.val64);
+		}
+		*array = u.val64;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_PERIOD) {
+		*array = sample->period;
+		array++;
+	}
+
+	return 0;
+}
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
index 30e9c6b..4ed73d3 100644
--- a/tools/perf/util/session.h
+++ b/tools/perf/util/session.h
@@ -134,6 +134,15 @@ static inline int perf_session__parse_sample(struct perf_session *session,
 					session->header.needs_swap);
 }
 
+static inline int perf_session__synthesize_sample(struct perf_session *session,
+					     union perf_event *event,
+					     const struct perf_sample *sample)
+{
+	return perf_event__synthesize_sample(event, session->sample_type,
+					sample,
+					session->header.needs_swap);
+}
+
 struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session,
 					    unsigned int type);
 
-- 
1.7.1


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

* [PATCH 3/6] perf: add ability to record event period
  2011-12-07 13:55 [PATCH 0/7] Profiling sleep times (v4) Andrew Vagin
  2011-12-07 13:55 ` [PATCH 1/6] perf: use event_name() to get an event name Andrew Vagin
  2011-12-07 13:55 ` [PATCH 2/6] perf: add ability to change event according to sample (v3) Andrew Vagin
@ 2011-12-07 13:55 ` Andrew Vagin
  2011-12-16  7:13   ` Andrew Vagin
  2011-12-07 13:55 ` [PATCH 4/6] perf: teach "perf inject" to work with files Andrew Vagin
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Andrew Vagin @ 2011-12-07 13:55 UTC (permalink / raw)
  To: acme
  Cc: linux-kernel, a.p.zijlstra, paulus, mingo, asharma, devel,
	dsahern, linux-perf-users

Signed-off-by: Andrew Vagin <avagin@openvz.org>
---
 tools/perf/builtin-record.c |    1 +
 tools/perf/perf.h           |    1 +
 tools/perf/util/evsel.c     |    3 +++
 3 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 766fa0a..f8fd14f 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -700,6 +700,7 @@ const struct option record_options[] = {
 	OPT_BOOLEAN('d', "data", &record.opts.sample_address,
 		    "Sample addresses"),
 	OPT_BOOLEAN('T', "timestamp", &record.opts.sample_time, "Sample timestamps"),
+	OPT_BOOLEAN('P', "period", &record.opts.period, "Sample period"),
 	OPT_BOOLEAN('n', "no-samples", &record.opts.no_samples,
 		    "don't sample"),
 	OPT_BOOLEAN('N', "no-buildid-cache", &record.no_buildid_cache,
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index ea804f5..64f8bee 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -200,6 +200,7 @@ struct perf_record_opts {
 	bool	     sample_time;
 	bool	     sample_id_all_avail;
 	bool	     system_wide;
+	bool	     period;
 	unsigned int freq;
 	unsigned int mmap_pages;
 	unsigned int user_freq;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index e2d1b22..8550018 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -108,6 +108,9 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts)
 	if (opts->system_wide)
 		attr->sample_type	|= PERF_SAMPLE_CPU;
 
+	if (opts->period)
+		attr->sample_type	|= PERF_SAMPLE_PERIOD;
+
 	if (opts->sample_id_all_avail &&
 	    (opts->sample_time || opts->system_wide ||
 	     !opts->no_inherit || opts->cpu_list))
-- 
1.7.1


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

* [PATCH 4/6] perf: teach "perf inject" to work with files
  2011-12-07 13:55 [PATCH 0/7] Profiling sleep times (v4) Andrew Vagin
                   ` (2 preceding siblings ...)
  2011-12-07 13:55 ` [PATCH 3/6] perf: add ability to record event period Andrew Vagin
@ 2011-12-07 13:55 ` Andrew Vagin
  2011-12-07 13:56 ` [PATCH 5/6] perf: teach perf inject to merge sched_stat_* and sched_switch events Andrew Vagin
  2011-12-07 13:56 ` [PATCH 6/6] perf: add scripts for profiling sleep times (v2) Andrew Vagin
  5 siblings, 0 replies; 15+ messages in thread
From: Andrew Vagin @ 2011-12-07 13:55 UTC (permalink / raw)
  To: acme
  Cc: linux-kernel, a.p.zijlstra, paulus, mingo, asharma, devel,
	dsahern, linux-perf-users

Before this patch "perf inject" can only handle data from pipe.

I want to use "perf inject" for reworking events. Look at my following patch.

Signed-off-by: Andrew Vagin <avagin@openvz.org>
---
 tools/perf/builtin-inject.c |   33 +++++++++++++++++++++++++++++++--
 1 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index 09c1061..f87779f 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -14,7 +14,12 @@
 
 #include "util/parse-options.h"
 
-static char		const *input_name = "-";
+static char		const *input_name	= "-";
+static const char	*output_name		= "-";
+static int		pipe_output		= 0;
+static int		output;
+static u64		bytes_written		= 0;
+
 static bool		inject_build_ids;
 
 static int perf_event__repipe_synth(struct perf_tool *tool __used,
@@ -27,12 +32,14 @@ static int perf_event__repipe_synth(struct perf_tool *tool __used,
 	size = event->header.size;
 
 	while (size) {
-		int ret = write(STDOUT_FILENO, buf, size);
+		int ret = write(output, buf, size);
 		if (ret < 0)
 			return -errno;
 
 		size -= ret;
 		buf += ret;
+
+		bytes_written += ret;
 	}
 
 	return 0;
@@ -239,8 +246,14 @@ static int __cmd_inject(void)
 	if (session == NULL)
 		return -ENOMEM;
 
+	if (!pipe_output)
+		lseek(output, session->header.data_offset, SEEK_SET);
 	ret = perf_session__process_events(session, &perf_inject);
 
+	if (!pipe_output) {
+		session->header.data_size += bytes_written;
+		perf_session__write_header(session, session->evlist, output, true);
+	}
 	perf_session__delete(session);
 
 	return ret;
@@ -254,6 +267,10 @@ static const char * const report_usage[] = {
 static const struct option options[] = {
 	OPT_BOOLEAN('b', "build-ids", &inject_build_ids,
 		    "Inject build-ids into the output stream"),
+	OPT_STRING('i', "input", &input_name, "file",
+		    "input file name"),
+	OPT_STRING('o', "output", &output_name, "file",
+		    "output file name"),
 	OPT_INCR('v', "verbose", &verbose,
 		 "be more verbose (show build ids, etc)"),
 	OPT_END()
@@ -269,6 +286,18 @@ int cmd_inject(int argc, const char **argv, const char *prefix __used)
 	if (argc)
 		usage_with_options(report_usage, options);
 
+	if (!strcmp(output_name, "-")) {
+		pipe_output = 1;
+		output = STDOUT_FILENO;
+	} else {
+		output = open(output_name, O_CREAT| O_WRONLY | O_TRUNC,
+							S_IRUSR | S_IWUSR);
+		if (output < 0) {
+			perror("failed to create output file");
+			exit(-1);
+		}
+	}
+
 	if (symbol__init() < 0)
 		return -1;
 
-- 
1.7.1


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

* [PATCH 5/6] perf: teach perf inject to merge sched_stat_* and sched_switch events
  2011-12-07 13:55 [PATCH 0/7] Profiling sleep times (v4) Andrew Vagin
                   ` (3 preceding siblings ...)
  2011-12-07 13:55 ` [PATCH 4/6] perf: teach "perf inject" to work with files Andrew Vagin
@ 2011-12-07 13:56 ` Andrew Vagin
  2011-12-07 13:56 ` [PATCH 6/6] perf: add scripts for profiling sleep times (v2) Andrew Vagin
  5 siblings, 0 replies; 15+ messages in thread
From: Andrew Vagin @ 2011-12-07 13:56 UTC (permalink / raw)
  To: acme
  Cc: linux-kernel, a.p.zijlstra, paulus, mingo, asharma, devel,
	dsahern, linux-perf-users

You may want to know where and how long a task is sleeping. A callchain
may be found in sched_switch and a time slice in stat_iowait, so I add
handler in perf inject for merging this events.

My code saves sched_switch event for each process and when it meets
stat_iowait, it reports the sched_switch event, because this event
contains a correct callchain. By another words it replaces all
stat_iowait events on proper sched_switch events.

Signed-off-by: Andrew Vagin <avagin@openvz.org>
---
 tools/perf/builtin-inject.c |   99 ++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 94 insertions(+), 5 deletions(-)

diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index f87779f..fa6b6f0 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -13,6 +13,8 @@
 #include "util/debug.h"
 
 #include "util/parse-options.h"
+#include "util/trace-event.h"
+
 
 static char		const *input_name	= "-";
 static const char	*output_name		= "-";
@@ -21,6 +23,9 @@ static int		output;
 static u64		bytes_written		= 0;
 
 static bool		inject_build_ids;
+static bool		inject_sched_stat;
+
+struct perf_session	*session;
 
 static int perf_event__repipe_synth(struct perf_tool *tool __used,
 				    union perf_event *event,
@@ -47,7 +52,7 @@ static int perf_event__repipe_synth(struct perf_tool *tool __used,
 
 static int perf_event__repipe_op2_synth(struct perf_tool *tool,
 					union perf_event *event,
-					struct perf_session *session __used)
+					struct perf_session *s __used)
 {
 	return perf_event__repipe_synth(tool, event, NULL);
 }
@@ -59,7 +64,7 @@ static int perf_event__repipe_event_type_synth(struct perf_tool *tool,
 }
 
 static int perf_event__repipe_tracing_data_synth(union perf_event *event,
-						 struct perf_session *session __used)
+						 struct perf_session *s __used)
 {
 	return perf_event__repipe_synth(NULL, event, NULL);
 }
@@ -114,12 +119,12 @@ static int perf_event__repipe_task(struct perf_tool *tool,
 }
 
 static int perf_event__repipe_tracing_data(union perf_event *event,
-					   struct perf_session *session)
+					   struct perf_session *s)
 {
 	int err;
 
 	perf_event__repipe_synth(NULL, event, NULL);
-	err = perf_event__process_tracing_data(event, session);
+	err = perf_event__process_tracing_data(event, s);
 
 	return err;
 }
@@ -205,6 +210,86 @@ repipe:
 	return 0;
 }
 
+struct event_entry
+{
+	struct list_head list;
+	u32 pid;
+	union perf_event event[0];
+};
+
+static LIST_HEAD(samples);
+
+static int perf_event__sched_stat(struct perf_tool *tool,
+				      union perf_event *event,
+				      struct perf_sample *sample,
+				      struct perf_evsel *evsel __used,
+				      struct machine *machine)
+{
+	int type;
+	struct event *e;
+	const char *evname = NULL;
+	uint32_t size;
+	struct event_entry *ent;
+	union perf_event *event_sw = NULL;
+	struct perf_sample sample_sw;
+	int sched_process_exit;
+
+	size = event->header.size;
+
+	type = trace_parse_common_type(sample->raw_data);
+	e = trace_find_event(type);
+	if (e)
+		evname = e->name;
+
+	sched_process_exit = !strcmp(evname, "sched_process_exit");
+
+	if (!strcmp(evname, "sched_switch") ||  sched_process_exit) {
+		list_for_each_entry(ent, &samples, list)
+			if (sample->pid == ent->pid)
+				break;
+
+		if (&ent->list != &samples) {
+			list_del(&ent->list);
+			free(ent);
+		}
+
+		if (sched_process_exit)
+			return 0;
+
+		ent = malloc(size + sizeof(struct event_entry));
+		ent->pid = sample->pid;
+		memcpy(&ent->event, event, size);
+		list_add(&ent->list, &samples);
+		return 0;
+
+	} else if (!strncmp(evname, "sched_stat_", 11)) {
+		u32 pid;
+
+		pid = raw_field_value(e, "pid", sample->raw_data);
+
+		list_for_each_entry(ent, &samples, list) {
+			if (pid == ent->pid)
+				break;
+		}
+
+		if (&ent->list == &samples) {
+			pr_debug("Could not find sched_switch for pid %u\n", pid);
+			return 0;
+		}
+
+		event_sw = &ent->event[0];
+		perf_session__parse_sample(session, event_sw, &sample_sw);
+		sample_sw.period = sample->period;
+		sample_sw.time = sample->time;
+		perf_session__synthesize_sample(session, event_sw, &sample_sw);
+		perf_event__repipe(tool, event_sw, &sample_sw, machine);
+		return 0;
+	}
+
+	perf_event__repipe(tool, event, sample, machine);
+
+	return 0;
+}
 struct perf_tool perf_inject = {
 	.sample		= perf_event__repipe_sample,
 	.mmap		= perf_event__repipe,
@@ -230,7 +315,6 @@ static void sig_handler(int sig __attribute__((__unused__)))
 
 static int __cmd_inject(void)
 {
-	struct perf_session *session;
 	int ret = -EINVAL;
 
 	signal(SIGINT, sig_handler);
@@ -240,6 +324,9 @@ static int __cmd_inject(void)
 		perf_inject.mmap	 = perf_event__repipe_mmap;
 		perf_inject.fork	 = perf_event__repipe_task;
 		perf_inject.tracing_data = perf_event__repipe_tracing_data;
+	} else if (inject_sched_stat) {
+		perf_inject.sample	= perf_event__sched_stat;
+		perf_inject.ordered_samples = true;
 	}
 
 	session = perf_session__new(input_name, O_RDONLY, false, true, &perf_inject);
@@ -267,6 +354,8 @@ static const char * const report_usage[] = {
 static const struct option options[] = {
 	OPT_BOOLEAN('b', "build-ids", &inject_build_ids,
 		    "Inject build-ids into the output stream"),
+	OPT_BOOLEAN('s', "sched-stat", &inject_sched_stat,
+		    "correct call-chains for shed-stat-*"),
 	OPT_STRING('i', "input", &input_name, "file",
 		    "input file name"),
 	OPT_STRING('o', "output", &output_name, "file",
-- 
1.7.1


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

* [PATCH 6/6] perf: add scripts for profiling sleep times (v2)
  2011-12-07 13:55 [PATCH 0/7] Profiling sleep times (v4) Andrew Vagin
                   ` (4 preceding siblings ...)
  2011-12-07 13:56 ` [PATCH 5/6] perf: teach perf inject to merge sched_stat_* and sched_switch events Andrew Vagin
@ 2011-12-07 13:56 ` Andrew Vagin
  5 siblings, 0 replies; 15+ messages in thread
From: Andrew Vagin @ 2011-12-07 13:56 UTC (permalink / raw)
  To: acme
  Cc: linux-kernel, a.p.zijlstra, paulus, mingo, asharma, devel,
	dsahern, linux-perf-users

E.g.:
 # perf script record -- sched:sched_stat_sleep -- ./foo
 # perf script report sched-stat
or
 # perf script record -- -e sched:sched_stat_sleep

v2: Add ability to record events for a defined process. It executes a small
bash script, then executes perf with filtering by pid and then a bash script
executes a target process.

Signed-off-by: Andrew Vagin <avagin@openvz.org>
---
 tools/perf/scripts/python/bin/sched-stat-record |   65 +++++++++++++++++++++++
 tools/perf/scripts/python/bin/sched-stat-report |    5 ++
 2 files changed, 70 insertions(+), 0 deletions(-)
 create mode 100644 tools/perf/scripts/python/bin/sched-stat-record
 create mode 100644 tools/perf/scripts/python/bin/sched-stat-report

diff --git a/tools/perf/scripts/python/bin/sched-stat-record b/tools/perf/scripts/python/bin/sched-stat-record
new file mode 100644
index 0000000..02da7c1
--- /dev/null
+++ b/tools/perf/scripts/python/bin/sched-stat-record
@@ -0,0 +1,65 @@
+#!/bin/bash
+# perf script record -- sched:sched_stat_[smth] -- CMD
+# perf script record -- -e sched:sched_stat_[smth]
+#
+set -o monitor
+
+usage()
+{
+	echo "Usage:"
+	echo "	perf script record sched-stat -- sched:sched_stat_[smth] -- CMD"
+	echo "	perf script record sched-stat -- [PERF OPTS] -e sched:sched_stat_[smth]"
+	exit 1;
+}
+
+declare -a opt
+declare -a cmd
+f=0;
+for i in "${@:2}"; do
+	if [ "$i" == "--" ]; then
+		f=1
+		continue
+	fi
+	if [ $f -eq 1 ]; then
+		cmd[${#cmd[*]}]="$i"
+	else
+		opt[${#opt[*]}]="$i"
+	fi
+done
+
+if [[ "${opt[@]}" != *sched_stat_* ]]; then
+	usage;
+fi
+
+if [ ${#cmd[@]} -eq 0 ]; then
+	if [ ${#opt[@]} -eq 0 ]; then
+		usage;
+	fi
+	exec perf record -agP \
+		-e sched:sched_switch \
+		--filter "prev_state == 1 || prev_state == 2" \
+		"${opt[@]}"
+fi
+
+if [ ${#opt[@]} -ne 1 ]; then
+	usage;
+fi
+
+# Wait until a target process is stopped.
+bash -c 'kill -STOP $$; exec "$@"' -- "${cmd[@]}" &
+pid=$!
+wait %1
+[ $? -eq 147 ] || exit 1;
+
+perf record -agP \
+		-e sched:sched_switch \
+		--filter "prev_pid == $pid && prev_state == 1 || prev_state == 2" \
+		-e sched:sched_process_exit -e "${opt[@]}" --filter "pid == $pid" &
+pid_perf=$!
+kill -CONT %1
+while :; do
+	wait %1
+	[ $? -eq 127 ] && break;
+done
+kill -INT %2
+wait %2
diff --git a/tools/perf/scripts/python/bin/sched-stat-report b/tools/perf/scripts/python/bin/sched-stat-report
new file mode 100644
index 0000000..e5114ce
--- /dev/null
+++ b/tools/perf/scripts/python/bin/sched-stat-report
@@ -0,0 +1,5 @@
+#!/bin/bash
+# description: profiling sleep times
+perf inject -s -i perf.data -o perf.data.d || exit
+perf report -i perf.data.d || exit
+unlink perf.data.d
-- 
1.7.1


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

* [tip:perf/core] perf tools: Add ability to synthesize event according to a sample
  2011-12-07 13:55 ` [PATCH 2/6] perf: add ability to change event according to sample (v3) Andrew Vagin
@ 2011-12-12 17:35   ` tip-bot for Andrew Vagin
  0 siblings, 0 replies; 15+ messages in thread
From: tip-bot for Andrew Vagin @ 2011-12-12 17:35 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: acme, linux-kernel, paulus, hpa, mingo, a.p.zijlstra, avagin,
	dsahern, tglx, asharma, mingo

Commit-ID:  74eec26facadbe6dbc0621bc862892c915c4534f
Gitweb:     http://git.kernel.org/tip/74eec26facadbe6dbc0621bc862892c915c4534f
Author:     Andrew Vagin <avagin@openvz.org>
AuthorDate: Mon, 28 Nov 2011 12:03:31 +0300
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 12 Dec 2011 08:44:00 -0200

perf tools: Add ability to synthesize event according to a sample

It's the counterpart of perf_session__parse_sample.

v2: fixed mistakes found by David Ahern.
v3: s/data/sample/
    s/perf_event__change_sample/perf_event__synthesize_sample

Reviewed-by: David Ahern <dsahern@gmail.com>
Cc: Arun Sharma <asharma@fb.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: devel@openvz.org
Link: http://lkml.kernel.org/r/1323266161-394927-3-git-send-email-avagin@openvz.org
Signed-off-by: Andrew Vagin <avagin@openvz.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/event.h   |    3 ++
 tools/perf/util/evsel.c   |   79 +++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/session.h |    8 ++++
 3 files changed, 90 insertions(+), 0 deletions(-)

diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 0d80201..cbdeaad 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -199,6 +199,9 @@ const char *perf_event__name(unsigned int id);
 int perf_event__parse_sample(const union perf_event *event, u64 type,
 			     int sample_size, bool sample_id_all,
 			     struct perf_sample *sample, bool swapped);
+int perf_event__synthesize_sample(union perf_event *event, u64 type,
+				  const struct perf_sample *sample,
+				  bool swapped);
 
 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index ee68d69..4a8c8b0 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -574,3 +574,82 @@ int perf_event__parse_sample(const union perf_event *event, u64 type,
 
 	return 0;
 }
+
+int perf_event__synthesize_sample(union perf_event *event, u64 type,
+				  const struct perf_sample *sample,
+				  bool swapped)
+{
+	u64 *array;
+
+	/*
+	 * used for cross-endian analysis. See git commit 65014ab3
+	 * for why this goofiness is needed.
+	 */
+	union {
+		u64 val64;
+		u32 val32[2];
+	} u;
+
+	array = event->sample.array;
+
+	if (type & PERF_SAMPLE_IP) {
+		event->ip.ip = sample->ip;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_TID) {
+		u.val32[0] = sample->pid;
+		u.val32[1] = sample->tid;
+		if (swapped) {
+			/*
+			 * Inverse of what is done in perf_event__parse_sample
+			 */
+			u.val32[0] = bswap_32(u.val32[0]);
+			u.val32[1] = bswap_32(u.val32[1]);
+			u.val64 = bswap_64(u.val64);
+		}
+
+		*array = u.val64;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_TIME) {
+		*array = sample->time;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_ADDR) {
+		*array = sample->addr;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_ID) {
+		*array = sample->id;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_STREAM_ID) {
+		*array = sample->stream_id;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_CPU) {
+		u.val32[0] = sample->cpu;
+		if (swapped) {
+			/*
+			 * Inverse of what is done in perf_event__parse_sample
+			 */
+			u.val32[0] = bswap_32(u.val32[0]);
+			u.val64 = bswap_64(u.val64);
+		}
+		*array = u.val64;
+		array++;
+	}
+
+	if (type & PERF_SAMPLE_PERIOD) {
+		*array = sample->period;
+		array++;
+	}
+
+	return 0;
+}
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
index 30e9c6b6..fb69612 100644
--- a/tools/perf/util/session.h
+++ b/tools/perf/util/session.h
@@ -134,6 +134,14 @@ static inline int perf_session__parse_sample(struct perf_session *session,
 					session->header.needs_swap);
 }
 
+static inline int perf_session__synthesize_sample(struct perf_session *session,
+						  union perf_event *event,
+						  const struct perf_sample *sample)
+{
+	return perf_event__synthesize_sample(event, session->sample_type,
+					     sample, session->header.needs_swap);
+}
+
 struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session,
 					    unsigned int type);
 

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

* Re: [PATCH 3/6] perf: add ability to record event period
  2011-12-07 13:55 ` [PATCH 3/6] perf: add ability to record event period Andrew Vagin
@ 2011-12-16  7:13   ` Andrew Vagin
  2011-12-19 19:20     ` Arun Sharma
  2011-12-19 20:58     ` Arnaldo Carvalho de Melo
  0 siblings, 2 replies; 15+ messages in thread
From: Andrew Vagin @ 2011-12-16  7:13 UTC (permalink / raw)
  To: acme
  Cc: Andrew Vagin, linux-kernel, a.p.zijlstra, paulus, mingo, asharma,
	devel, dsahern, linux-perf-users

Hi Arnaldo,

Could you review and commit this patch. It's quite common functionality, 
which allow to get events more effectively and to avoid losing events.

All other patches may be postponed, because Arun Sharma wants to suggest 
your version of "Profiling sleep times".

Thanks.

On 12/07/2011 05:55 PM, Andrew Vagin wrote:
> Signed-off-by: Andrew Vagin<avagin@openvz.org>
> ---
>   tools/perf/builtin-record.c |    1 +
>   tools/perf/perf.h           |    1 +
>   tools/perf/util/evsel.c     |    3 +++
>   3 files changed, 5 insertions(+), 0 deletions(-)
>
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index 766fa0a..f8fd14f 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -700,6 +700,7 @@ const struct option record_options[] = {
>   	OPT_BOOLEAN('d', "data",&record.opts.sample_address,
>   		    "Sample addresses"),
>   	OPT_BOOLEAN('T', "timestamp",&record.opts.sample_time, "Sample timestamps"),
> +	OPT_BOOLEAN('P', "period",&record.opts.period, "Sample period"),
>   	OPT_BOOLEAN('n', "no-samples",&record.opts.no_samples,
>   		    "don't sample"),
>   	OPT_BOOLEAN('N', "no-buildid-cache",&record.no_buildid_cache,
> diff --git a/tools/perf/perf.h b/tools/perf/perf.h
> index ea804f5..64f8bee 100644
> --- a/tools/perf/perf.h
> +++ b/tools/perf/perf.h
> @@ -200,6 +200,7 @@ struct perf_record_opts {
>   	bool	     sample_time;
>   	bool	     sample_id_all_avail;
>   	bool	     system_wide;
> +	bool	     period;
>   	unsigned int freq;
>   	unsigned int mmap_pages;
>   	unsigned int user_freq;
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index e2d1b22..8550018 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -108,6 +108,9 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts)
>   	if (opts->system_wide)
>   		attr->sample_type	|= PERF_SAMPLE_CPU;
>
> +	if (opts->period)
> +		attr->sample_type	|= PERF_SAMPLE_PERIOD;
> +
>   	if (opts->sample_id_all_avail&&
>   	(opts->sample_time || opts->system_wide ||
>   	     !opts->no_inherit || opts->cpu_list))


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

* Re: [PATCH 3/6] perf: add ability to record event period
  2011-12-16  7:13   ` Andrew Vagin
@ 2011-12-19 19:20     ` Arun Sharma
  2011-12-19 20:58     ` Arnaldo Carvalho de Melo
  1 sibling, 0 replies; 15+ messages in thread
From: Arun Sharma @ 2011-12-19 19:20 UTC (permalink / raw)
  To: avagin
  Cc: acme, Andrew Vagin, linux-kernel, a.p.zijlstra, paulus, mingo,
	devel, dsahern, linux-perf-users


Acked-by: Arun Sharma <asharma@fb.com>

Need PERF_SAMPLE_PERIOD for the sleep profiling kernel patch I posted 
earlier.

  -Arun

On 12/15/11 11:13 PM, Andrew Vagin wrote:
> Hi Arnaldo,
>
> Could you review and commit this patch. It's quite common functionality,
> which allow to get events more effectively and to avoid losing events.
>
> All other patches may be postponed, because Arun Sharma wants to suggest
> your version of "Profiling sleep times".
>
> Thanks.
>
> On 12/07/2011 05:55 PM, Andrew Vagin wrote:
>> Signed-off-by: Andrew Vagin<avagin@openvz.org>
>> ---
>> tools/perf/builtin-record.c | 1 +
>> tools/perf/perf.h | 1 +
>> tools/perf/util/evsel.c | 3 +++
>> 3 files changed, 5 insertions(+), 0 deletions(-)
>>
>> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
>> index 766fa0a..f8fd14f 100644
>> --- a/tools/perf/builtin-record.c
>> +++ b/tools/perf/builtin-record.c
>> @@ -700,6 +700,7 @@ const struct option record_options[] = {
>> OPT_BOOLEAN('d', "data",&record.opts.sample_address,
>> "Sample addresses"),
>> OPT_BOOLEAN('T', "timestamp",&record.opts.sample_time, "Sample
>> timestamps"),
>> + OPT_BOOLEAN('P', "period",&record.opts.period, "Sample period"),
>> OPT_BOOLEAN('n', "no-samples",&record.opts.no_samples,
>> "don't sample"),
>> OPT_BOOLEAN('N', "no-buildid-cache",&record.no_buildid_cache,
>> diff --git a/tools/perf/perf.h b/tools/perf/perf.h
>> index ea804f5..64f8bee 100644
>> --- a/tools/perf/perf.h
>> +++ b/tools/perf/perf.h
>> @@ -200,6 +200,7 @@ struct perf_record_opts {
>> bool sample_time;
>> bool sample_id_all_avail;
>> bool system_wide;
>> + bool period;
>> unsigned int freq;
>> unsigned int mmap_pages;
>> unsigned int user_freq;
>> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
>> index e2d1b22..8550018 100644
>> --- a/tools/perf/util/evsel.c
>> +++ b/tools/perf/util/evsel.c
>> @@ -108,6 +108,9 @@ void perf_evsel__config(struct perf_evsel *evsel,
>> struct perf_record_opts *opts)
>> if (opts->system_wide)
>> attr->sample_type |= PERF_SAMPLE_CPU;
>>
>> + if (opts->period)
>> + attr->sample_type |= PERF_SAMPLE_PERIOD;
>> +
>> if (opts->sample_id_all_avail&&
>> (opts->sample_time || opts->system_wide ||
>> !opts->no_inherit || opts->cpu_list))
>

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

* Re: [PATCH 3/6] perf: add ability to record event period
  2011-12-16  7:13   ` Andrew Vagin
  2011-12-19 19:20     ` Arun Sharma
@ 2011-12-19 20:58     ` Arnaldo Carvalho de Melo
  2011-12-19 21:25       ` David Ahern
  2011-12-20  8:07       ` Andrew Vagin
  1 sibling, 2 replies; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2011-12-19 20:58 UTC (permalink / raw)
  To: Andrew Vagin
  Cc: Andrew Vagin, linux-kernel, a.p.zijlstra, paulus, mingo, asharma,
	devel, dsahern, linux-perf-users

Em Fri, Dec 16, 2011 at 11:13:07AM +0400, Andrew Vagin escreveu:
> Hi Arnaldo,
> 
> Could you review and commit this patch. It's quite common
> functionality, which allow to get events more effectively and to
> avoid losing events.
> 
> All other patches may be postponed, because Arun Sharma wants to
> suggest your version of "Profiling sleep times".

It would help if you provided a more detailed patch description, this
one came with just a title :-\

You started to ellaborate above when stating that "which allows to get
events more effectively", could you please expand on that and mention
that it will be used by the following patches that will implement
feature X, etc?

I get that Arun is in agreement, everything seems OK, but we need to do
a better job on describing why we add code, the context we have now from
all these discussions will be mostly lost, say, 5 years from now when we
try to figure out why something was done in some way,

Thanks,

- Arnaldo
 
> Thanks.
> 
> On 12/07/2011 05:55 PM, Andrew Vagin wrote:
> >Signed-off-by: Andrew Vagin<avagin@openvz.org>
> >---
> >  tools/perf/builtin-record.c |    1 +
> >  tools/perf/perf.h           |    1 +
> >  tools/perf/util/evsel.c     |    3 +++
> >  3 files changed, 5 insertions(+), 0 deletions(-)
> >
> >diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> >index 766fa0a..f8fd14f 100644
> >--- a/tools/perf/builtin-record.c
> >+++ b/tools/perf/builtin-record.c
> >@@ -700,6 +700,7 @@ const struct option record_options[] = {
> >  	OPT_BOOLEAN('d', "data",&record.opts.sample_address,
> >  		    "Sample addresses"),
> >  	OPT_BOOLEAN('T', "timestamp",&record.opts.sample_time, "Sample timestamps"),
> >+	OPT_BOOLEAN('P', "period",&record.opts.period, "Sample period"),
> >  	OPT_BOOLEAN('n', "no-samples",&record.opts.no_samples,
> >  		    "don't sample"),
> >  	OPT_BOOLEAN('N', "no-buildid-cache",&record.no_buildid_cache,
> >diff --git a/tools/perf/perf.h b/tools/perf/perf.h
> >index ea804f5..64f8bee 100644
> >--- a/tools/perf/perf.h
> >+++ b/tools/perf/perf.h
> >@@ -200,6 +200,7 @@ struct perf_record_opts {
> >  	bool	     sample_time;
> >  	bool	     sample_id_all_avail;
> >  	bool	     system_wide;
> >+	bool	     period;
> >  	unsigned int freq;
> >  	unsigned int mmap_pages;
> >  	unsigned int user_freq;
> >diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> >index e2d1b22..8550018 100644
> >--- a/tools/perf/util/evsel.c
> >+++ b/tools/perf/util/evsel.c
> >@@ -108,6 +108,9 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts)
> >  	if (opts->system_wide)
> >  		attr->sample_type	|= PERF_SAMPLE_CPU;
> >
> >+	if (opts->period)
> >+		attr->sample_type	|= PERF_SAMPLE_PERIOD;
> >+
> >  	if (opts->sample_id_all_avail&&
> >  	(opts->sample_time || opts->system_wide ||
> >  	     !opts->no_inherit || opts->cpu_list))

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

* Re: [PATCH 3/6] perf: add ability to record event period
  2011-12-19 20:58     ` Arnaldo Carvalho de Melo
@ 2011-12-19 21:25       ` David Ahern
  2011-12-20  8:07       ` Andrew Vagin
  1 sibling, 0 replies; 15+ messages in thread
From: David Ahern @ 2011-12-19 21:25 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Andrew Vagin, Andrew Vagin, linux-kernel, a.p.zijlstra, paulus,
	mingo, asharma, devel, linux-perf-users

On 12/19/2011 01:58 PM, Arnaldo Carvalho de Melo wrote:
> I get that Arun is in agreement, everything seems OK, but we need to do
> a better job on describing why we add code, the context we have now from
> all these discussions will be mostly lost, say, 5 years from now when we
> try to figure out why something was done in some way,

It seems like an option is needed for all the sample attributes.
Timestamp is now covered (-T). Sample address is covered (-d). Callchain
(-g). This targets period (-P). I think that just leaves CPU, and we are
out of c/C options. ;-)

David

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

* Re: [PATCH 3/6] perf: add ability to record event period
  2011-12-19 20:58     ` Arnaldo Carvalho de Melo
  2011-12-19 21:25       ` David Ahern
@ 2011-12-20  8:07       ` Andrew Vagin
  2011-12-20 10:17         ` Peter Zijlstra
  2011-12-20 13:26         ` Arnaldo Carvalho de Melo
  1 sibling, 2 replies; 15+ messages in thread
From: Andrew Vagin @ 2011-12-20  8:07 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Andrew Vagin, linux-kernel, a.p.zijlstra, paulus, mingo, asharma,
	devel, dsahern, linux-perf-users

On 12/20/2011 12:58 AM, Arnaldo Carvalho de Melo wrote:
> Em Fri, Dec 16, 2011 at 11:13:07AM +0400, Andrew Vagin escreveu:
>> Hi Arnaldo,
>>
>> Could you review and commit this patch. It's quite common
>> functionality, which allow to get events more effectively and to
>> avoid losing events.
>>
>> All other patches may be postponed, because Arun Sharma wants to
>> suggest your version of "Profiling sleep times".
> It would help if you provided a more detailed patch description, this
> one came with just a title :-\
Look at the comment below. In it I try describe why we need this 
functionality.

The problem is that when SAMPLE_PERIOD is not set, kernel generates a
number of samples in proportion to an event's period. Number of these
samples may be too big and a kernel throttles all samples above a
defined limit.

E.g.: I want to trace when a process sleeps. I created a process, which
sleeps for 1ms and for 4ms.  perf got 100 events in both cases.

swapper     0 [000]  1141.371830: sched_stat_sleep: comm=foo pid=1801 delay=1386750 [ns]
swapper     0 [000]  1141.369444: sched_stat_sleep: comm=foo pid=1801 delay=4499585 [ns]

In the first case a kernel want to send 4499585 events and
in the second case it wants to send 1386750 events.
perf-reports shows that process sleeps in both places equal time.

Instead of this we can get only one sample with an attribute period. As
result we have less data transferring between kernel and user-space and we
avoid throttling of samples.

The patch "events: Don't divide events if it has field period" added a
kernel part of this functionality.
>
> You started to ellaborate above when stating that "which allows to get
> events more effectively", could you please expand on that and mention
> that it will be used by the following patches that will implement
> feature X, etc?
>
> I get that Arun is in agreement, everything seems OK, but we need to do
> a better job on describing why we add code, the context we have now from
> all these discussions will be mostly lost, say, 5 years from now when we
> try to figure out why something was done in some way,
>
> Thanks,
>
> - Arnaldo
>
>> Thanks.
>>
>> On 12/07/2011 05:55 PM, Andrew Vagin wrote:
>>> Signed-off-by: Andrew Vagin<avagin@openvz.org>
>>> ---
>>>   tools/perf/builtin-record.c |    1 +
>>>   tools/perf/perf.h           |    1 +
>>>   tools/perf/util/evsel.c     |    3 +++
>>>   3 files changed, 5 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
>>> index 766fa0a..f8fd14f 100644
>>> --- a/tools/perf/builtin-record.c
>>> +++ b/tools/perf/builtin-record.c
>>> @@ -700,6 +700,7 @@ const struct option record_options[] = {
>>>   	OPT_BOOLEAN('d', "data",&record.opts.sample_address,
>>>   		    "Sample addresses"),
>>>   	OPT_BOOLEAN('T', "timestamp",&record.opts.sample_time, "Sample timestamps"),
>>> +	OPT_BOOLEAN('P', "period",&record.opts.period, "Sample period"),
>>>   	OPT_BOOLEAN('n', "no-samples",&record.opts.no_samples,
>>>   		    "don't sample"),
>>>   	OPT_BOOLEAN('N', "no-buildid-cache",&record.no_buildid_cache,
>>> diff --git a/tools/perf/perf.h b/tools/perf/perf.h
>>> index ea804f5..64f8bee 100644
>>> --- a/tools/perf/perf.h
>>> +++ b/tools/perf/perf.h
>>> @@ -200,6 +200,7 @@ struct perf_record_opts {
>>>   	bool	     sample_time;
>>>   	bool	     sample_id_all_avail;
>>>   	bool	     system_wide;
>>> +	bool	     period;
>>>   	unsigned int freq;
>>>   	unsigned int mmap_pages;
>>>   	unsigned int user_freq;
>>> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
>>> index e2d1b22..8550018 100644
>>> --- a/tools/perf/util/evsel.c
>>> +++ b/tools/perf/util/evsel.c
>>> @@ -108,6 +108,9 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts)
>>>   	if (opts->system_wide)
>>>   		attr->sample_type	|= PERF_SAMPLE_CPU;
>>>
>>> +	if (opts->period)
>>> +		attr->sample_type	|= PERF_SAMPLE_PERIOD;
>>> +
>>>   	if (opts->sample_id_all_avail&&
>>>   	(opts->sample_time || opts->system_wide ||
>>>   	     !opts->no_inherit || opts->cpu_list))


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

* Re: [PATCH 3/6] perf: add ability to record event period
  2011-12-20  8:07       ` Andrew Vagin
@ 2011-12-20 10:17         ` Peter Zijlstra
  2011-12-20 13:26         ` Arnaldo Carvalho de Melo
  1 sibling, 0 replies; 15+ messages in thread
From: Peter Zijlstra @ 2011-12-20 10:17 UTC (permalink / raw)
  To: avagin
  Cc: Arnaldo Carvalho de Melo, Andrew Vagin, linux-kernel, paulus,
	mingo, asharma, devel, dsahern, linux-perf-users

On Tue, 2011-12-20 at 12:07 +0400, Andrew Vagin wrote:
> Look at the comment below. In it I try describe why we need this 
> functionality. 

Its not about comments, a patch has to have a Changelog that covers the
why and what. If it doesn't the patch won't go anywhere. Also, its not
the maintainers job to reconstruct such a changelog from an email
discussion.

So write up a proper changelog and resubmit the patch.

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

* Re: [PATCH 3/6] perf: add ability to record event period
  2011-12-20  8:07       ` Andrew Vagin
  2011-12-20 10:17         ` Peter Zijlstra
@ 2011-12-20 13:26         ` Arnaldo Carvalho de Melo
  1 sibling, 0 replies; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2011-12-20 13:26 UTC (permalink / raw)
  To: Andrew Vagin
  Cc: Andrew Vagin, linux-kernel, a.p.zijlstra, paulus, mingo, asharma,
	devel, dsahern, linux-perf-users

Em Tue, Dec 20, 2011 at 12:07:41PM +0400, Andrew Vagin escreveu:
> On 12/20/2011 12:58 AM, Arnaldo Carvalho de Melo wrote:
> >Em Fri, Dec 16, 2011 at 11:13:07AM +0400, Andrew Vagin escreveu:
> >>Hi Arnaldo,
> >>
> >>Could you review and commit this patch. It's quite common
> >>functionality, which allow to get events more effectively and to
> >>avoid losing events.
> >>
> >>All other patches may be postponed, because Arun Sharma wants to
> >>suggest your version of "Profiling sleep times".
> >It would help if you provided a more detailed patch description, this
> >one came with just a title :-\
> Look at the comment below. In it I try describe why we need this
> functionality.

Much better, please now resubmit the patch with that explanation.

Thanks,

- Arnaldo

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

end of thread, other threads:[~2011-12-20 13:26 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-07 13:55 [PATCH 0/7] Profiling sleep times (v4) Andrew Vagin
2011-12-07 13:55 ` [PATCH 1/6] perf: use event_name() to get an event name Andrew Vagin
2011-12-07 13:55 ` [PATCH 2/6] perf: add ability to change event according to sample (v3) Andrew Vagin
2011-12-12 17:35   ` [tip:perf/core] perf tools: Add ability to synthesize event according to a sample tip-bot for Andrew Vagin
2011-12-07 13:55 ` [PATCH 3/6] perf: add ability to record event period Andrew Vagin
2011-12-16  7:13   ` Andrew Vagin
2011-12-19 19:20     ` Arun Sharma
2011-12-19 20:58     ` Arnaldo Carvalho de Melo
2011-12-19 21:25       ` David Ahern
2011-12-20  8:07       ` Andrew Vagin
2011-12-20 10:17         ` Peter Zijlstra
2011-12-20 13:26         ` Arnaldo Carvalho de Melo
2011-12-07 13:55 ` [PATCH 4/6] perf: teach "perf inject" to work with files Andrew Vagin
2011-12-07 13:56 ` [PATCH 5/6] perf: teach perf inject to merge sched_stat_* and sched_switch events Andrew Vagin
2011-12-07 13:56 ` [PATCH 6/6] perf: add scripts for profiling sleep times (v2) Andrew Vagin

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).