All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Ahern <dsahern@gmail.com>
To: Andrew Jones <drjones@redhat.com>
Cc: linux-kernel@vger.kernel.org, a.p.zijlstra@chello.nl,
	paulus@samba.org, mingo@redhat.com, acme@ghostprotocols.net,
	tzanussi@gmail.com
Subject: Re: perf script: rwtop: SIGALRM and pipe read race
Date: Fri, 14 Sep 2012 10:05:03 -0600	[thread overview]
Message-ID: <505355AF.7000006@gmail.com> (raw)
In-Reply-To: <20120914153952.GA8834@turtle.usersys.redhat.com>

On 9/14/12 9:39 AM, Andrew Jones wrote:
>
> I recently tried 'perf script rwtop', and it immediately failed with
> 'failed to read event header'. Running it through strace I found that the
> when rwtop.pl is reading from the pipe, and gets one of it's alarms, that
> the ERESTARTSYS seems to confuse it - causing it to fail. It also appears
> that the problem only happens early in execution, or not at all. If I get
> lucky and don't hit the problem right away, then rwtop will run fine as
> long as I want, without any ERESTARTSYS's in its trace. I also found that
> I can avoid hitting the problem by throwing a 'pv -q' in front of the perf
> command in tools/perf/scripts/perl/bin/rwtop-report. Which I guess slows
> things down in the reader enough to always avoid the race.
>
> Sorry I don't have a solution (patch). I'll look at it more as time
> permits, but I thought I'd get it reported for starters though.


This fixes the run-time problem:

diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
index 1b8775c..a4371ae 100644
--- a/tools/perf/util/util.c
+++ b/tools/perf/util/util.c
@@ -142,6 +142,9 @@ int readn(int fd, void *buf, size_t n)
     while (n) {
         int ret = read(fd, buf, n);

+        if ((ret < 0) && (errno == EINTR))
+            continue;
+
         if (ret <= 0)
             return ret;



The only problem you will find with rwtop is that bytes_read will be 
really whacky. I traced it to:

     if ($ret > 0) {
printf("comm %s bytes_read %d\n", $common_comm, $ret);
         $reads{$common_pid}{bytes_read} += $ret;

Somehow the $ret > 0 is passing when in fact it is negative. I do not 
know much about perl to fix it.

David

  reply	other threads:[~2012-09-14 16:05 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-14 15:39 perf script: rwtop: SIGALRM and pipe read race Andrew Jones
2012-09-14 16:05 ` David Ahern [this message]
2012-09-14 18:10   ` Andrew Jones
2012-09-17 14:55     ` David Ahern
2012-09-17 15:16       ` David Ahern
2012-09-17 16:02         ` Arnaldo Carvalho de Melo
2012-09-17 16:32           ` David Ahern
2012-09-17 17:12             ` Arnaldo Carvalho de Melo
2012-09-17 20:10               ` David Ahern
2012-09-18  9:05       ` Andrew Jones
2012-09-18  9:30         ` Andrew Jones

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=505355AF.7000006@gmail.com \
    --to=dsahern@gmail.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@ghostprotocols.net \
    --cc=drjones@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=paulus@samba.org \
    --cc=tzanussi@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.