Messages in this thread Patch in this message | | | Subject | Re: [PATCH 0/2] perf: Redesign trace events reordering | From | Tom Zanussi <> | Date | Wed, 05 May 2010 00:48:47 -0500 |
| |
Hi Frederic,
On Wed, 2010-05-05 at 02:03 +0200, Frederic Weisbecker wrote: > I recently noticed that the new reordering design is broken > when it deals with tons of events. > > This patchset provides another algorithm to deal with that, > tested without any problem. > > And since it involves more frequent flushes, I guess it could > plug nicely with the live mode.
Very nice! I tried these out with live mode and it seems to work fine, after applying the patch below.
I initially had a problem with 'unexpected end of event stream' errors, then noticed that the FINISHED_ROUND events were basically just headers with no data, which caused the read of the 0-length payload to appear as end-of-stream.
I'll do some more testing (and fix some warnings in the scripts that this mode seems to elicit), but it seems so far to work pretty well for live mode...
Tom
From: Tom Zanussi <tzanussi@gmail.com> Date: Wed, 5 May 2010 00:27:40 -0500 Subject: [PATCH] perf/live-mode: handle payload-less events
Some events, such as the PERF_RECORD_FINISHED_ROUND event consist of only an event header and no data. In this case, a 0-length payload will be read, and the 0 return value will be wrongly interpreted as an 'unexpected end of event stream'.
This patch allows for proper handling of data-less events by skipping 0-length reads.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com> --- tools/perf/util/session.c | 19 +++++++++++-------- 1 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 9401909..00ab298 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -696,15 +696,18 @@ more: p = &event; p += sizeof(struct perf_event_header); - err = do_read(self->fd, p, size - sizeof(struct perf_event_header)); - if (err <= 0) { - if (err == 0) { - pr_err("unexpected end of event stream\n"); - goto done; - } + if (size - sizeof(struct perf_event_header)) { + err = do_read(self->fd, p, + size - sizeof(struct perf_event_header)); + if (err <= 0) { + if (err == 0) { + pr_err("unexpected end of event stream\n"); + goto done; + } - pr_err("failed to read event data\n"); - goto out_err; + pr_err("failed to read event data\n"); + goto out_err; + } } if (size == 0 || -- 1.6.4.GIT
| |