All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@kernel.org>
To: Adrian Hunter <adrian.hunter@intel.com>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
	Jiri Olsa <jolsa@redhat.com>,
	linux-kernel@vger.kernel.org,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Mike Galbraith <efault@gmx.de>,
	Stephane Eranian <eranian@google.com>,
	David Ahern <dsahern@gmail.com>
Subject: Re: [PATCH] tools/perf/util: Document and clean up readn() a bit
Date: Wed, 27 Nov 2013 12:57:46 +0100	[thread overview]
Message-ID: <20131127115746.GB10528@gmail.com> (raw)
In-Reply-To: <5295AFA3.6060007@intel.com>


* Adrian Hunter <adrian.hunter@intel.com> wrote:

> On 26/11/13 19:53, Ingo Molnar wrote:
> > 
> > * Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote:
> > 
> >> Em Fri, Nov 22, 2013 at 03:24:26PM +0100, Jiri Olsa escreveu:
> >>>  }
> >>> +
> >>> +ssize_t perf_data_file__write(struct perf_data_file *file,
> >>> +			      void *buf, size_t size)
> >>> +{
> >>> +	ssize_t total = size;
> >>> +
> >>> +	while (size) {
> >>> +		ssize_t ret = write(file->fd, buf, size);
> >>> +
> >>> +		if (ret < 0) {
> >>> +			pr_err("failed to write perf data, error: %m\n");
> >>> +			return -1;
> >>> +		}
> >>> +
> >>> +		size -= ret;
> >>> +		buf  += ret;
> >>> +	}
> >>> +
> >>> +	return total;
> >>
> >> So this is the functional equivalent of "readn", so please move it to
> >> just after "readn" and make this just a simple wrapper.
> > 
> > Btw., would be nice to add a small comment to readn() that describes 
> > its semantics, it looks like a useful helper.
> > 
> > I also added a check for the input parameter 'n', plus I added a 
> > 'left' variable to make the flow clearer, and added a debug check for 
> > the return value - I think returning 'n' is more obvious.
> 
> It would be nicer to match what 'read' does.
> 
> > 
> > Totally untested though.
> > 
> > Thanks,
> > 
> > 	Ingo
> > 
> > Signed-off-by: Ingo Molnar <mingo@kernel.org>
> > 
> > diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
> > index 28a0a89..4789081 100644
> > --- a/tools/perf/util/util.c
> > +++ b/tools/perf/util/util.c
> > @@ -6,6 +6,7 @@
> >  #endif
> >  #include <stdio.h>
> >  #include <stdlib.h>
> > +#include <linux/kernel.h>
> >  
> >  /*
> >   * XXX We need to find a better place for these things...
> > @@ -151,21 +152,29 @@ unsigned long convert_unit(unsigned long value, char *unit)
> >  	return value;
> >  }
> >  
> > -int readn(int fd, void *buf, size_t n)
> > +/*
> > + * Read exactly 'n' bytes or return an error:
> > + */
> > +int readn(int fd, void *buf, ssize_t n)
> 
> Should really be the same prototype as 'read' i.e.
> 
> 	ssize_t readn(int fd, void *buf, size_t n)
> 
> Need to change callers that are using 'int' too.
> 
> >  {
> >  	void *buf_start = buf;
> > +	size_t left = n;
> > +
> > +	BUG_ON(n <= 0);
> 
> 	BUG_ON(n == 0 || n > SSIZE_MAX);
> 
> >  
> > -	while (n) {
> > -		int ret = read(fd, buf, n);
> > +	while (left) {
> > +		int ret = read(fd, buf, left);
> 
> Should use the correct return type:
> 
> 		ssize_t ret = read(fd, buf, left);
> 
> >  
> >  		if (ret <= 0)
> >  			return ret;
> 
> Don't return 0 if not all the bytes were read:
> 
> 		if (ret < 0)
> 			return ret;
> 		if (!ret)
> 			break;

Okay, I thought this was an intentional 'all or nothing' interface - 
but looking at the readn() users they can tolerate partial results 
just fine.

> 
> >  
> > -		n -= ret;
> > +		left -= ret;
> >  		buf += ret;
> >  	}
> >  
> > -	return buf - buf_start;
> > +	BUG_ON(buf-buf_start != n);
> > +
> > +	return n;
> 
> Should return the same value as 'read' i.e the original
> 
> 	return buf - buf_start;

It does, in the original version I patched buf-buf_start == n, see the 
assert that checks for that.

If partial reads are returned then this bit has to change too, yes.

Thanks,

	Ingo

  reply	other threads:[~2013-11-27 11:57 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-22 14:24 [PATCH 0/3] perf tools: Add data file write interface Jiri Olsa
2013-11-22 14:24 ` [PATCH 1/3] perf tools: Add perf_data_file__write interface Jiri Olsa
2013-11-25 19:29   ` Arnaldo Carvalho de Melo
2013-11-26 10:17     ` Jiri Olsa
2013-11-26 17:53     ` [PATCH] tools/perf/util: Document and clean up readn() a bit Ingo Molnar
2013-11-27  8:38       ` Adrian Hunter
2013-11-27 11:57         ` Ingo Molnar [this message]
2013-11-27 15:19           ` David Ahern
2013-11-27 15:50             ` Jiri Olsa
2013-11-27 15:54               ` Ingo Molnar
2013-11-22 14:24 ` [PATCH 2/3] perf record: Use perf_data_file__write for output file Jiri Olsa
2013-11-25 19:31   ` Arnaldo Carvalho de Melo
2013-11-26 10:16     ` Jiri Olsa
2013-11-22 14:24 ` [PATCH 3/3] perf inject: Handle output file via perf_data_file object Jiri Olsa
2013-11-25 19:40   ` Arnaldo Carvalho de Melo
2013-11-26 10:03     ` Jiri Olsa
2013-11-26 12:42       ` Arnaldo Carvalho de Melo
2013-11-26 13:07         ` Jiri Olsa
2013-11-22 15:01 ` [PATCH 0/3] perf tools: Add data file write interface David Ahern
2013-11-23  9:44   ` Jiri Olsa
2013-11-24  0:00     ` David Ahern

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=20131127115746.GB10528@gmail.com \
    --to=mingo@kernel.org \
    --cc=acme@ghostprotocols.net \
    --cc=adrian.hunter@intel.com \
    --cc=dsahern@gmail.com \
    --cc=efault@gmx.de \
    --cc=eranian@google.com \
    --cc=fweisbec@gmail.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    /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.