From: Adrian Hunter <adrian.hunter@intel.com>
To: Ingo Molnar <mingo@kernel.org>
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 10:38:59 +0200 [thread overview]
Message-ID: <5295AFA3.6060007@intel.com> (raw)
In-Reply-To: <20131126175335.GA9300@gmail.com>
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;
>
> - 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;
> }
>
> size_t hex_width(u64 v)
> diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
> index c8f362d..bb0a336 100644
> --- a/tools/perf/util/util.h
> +++ b/tools/perf/util/util.h
> @@ -253,7 +253,7 @@ bool strlazymatch(const char *str, const char *pat);
> int strtailcmp(const char *s1, const char *s2);
> char *strxfrchar(char *s, char from, char to);
> unsigned long convert_unit(unsigned long value, char *unit);
> -int readn(int fd, void *buf, size_t size);
> +int readn(int fd, void *buf, ssize_t size);
>
> struct perf_event_attr;
>
>
>
next prev parent reply other threads:[~2013-11-27 8:31 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 [this message]
2013-11-27 11:57 ` Ingo Molnar
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=5295AFA3.6060007@intel.com \
--to=adrian.hunter@intel.com \
--cc=acme@ghostprotocols.net \
--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=mingo@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.