[PATCH 1/5] perf top: Use active evsel for non-sample events on old kernel

January 29th, 2012 - 04:00 am ET by Namhyung Kim | Report spam
If multiple events are specified on old kernel,
perf_evlist__id2evsel() returns NULL for non-sampling events
since the sample.id doesn't contain valid value, and it triggers
assert below. If only one event is given, the function returns
the evsel regardless of sample.id, this is why most case cause
no problem on old kernel.

Fix it by using active evsel.

Signed-off-by: Namhyung Kim <namhyung@gmail.com>

tools/perf/builtin-top.c | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index e8b033c074f9..f68fba52c8d8 100644
a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -771,6 +771,14 @@ static void perf_top__mmap_read_idx(struct perf_top *top, int idx)
}

evsel = perf_evlist__id2evsel(session->evlist, sample.id);
+ if (evsel == NULL && !session->sample_id_all &&
+ event->header.type != PERF_RECORD_SAMPLE) {
+ /*
+ * Old kernel, no sample_id_all field.
+ * Just use active evsel.
+ */
+ evsel = top->sym_evsel;
+ }
assert(evsel != NULL);

origin = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
1.7.8.2

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
email Follow the discussionReplies 6 repliesReplies Make a reply

Replies

#1 David Ahern
January 29th, 2012 - 10:30 am ET | Report spam
On 01/29/2012 01:55 AM, Namhyung Kim wrote:
When a user tries to open so many events, perf_event_oen syscall
may fail with EMFILE. Provide an advice for that case.

Signed-off-by: Namhyung Kim

tools/perf/builtin-record.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 32870eef952f..5d3b6794d93b 100644
a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -249,6 +249,10 @@ try_again:
ui__warning("The %s event is not supported.",
event_name(pos));
exit(EXIT_FAILURE);
+ } else if (err == EMFILE) {
+ ui__warning("Too many events are opened."
+ "Try again after reducing the number of events.");
+ exit(EXIT_FAILURE);
}

printf("");



It's not just the number of events: an fd is opened for each specified
event on each specified cpu and for each specified task. See
__perf_evsel__open(). e.g., the new --uid option on a 16 cpu server can
hit the limit pretty fast.

David
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Similar topics