public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Masami Hiramatsu <mhiramat@kernel.org>
Cc: linux-kernel@vger.kernel.org, Namhyung Kim <namhyung@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>
Subject: Re: [PATCH perf/core v2 1/8] perf: Rewrite strbuf not to die
Date: Thu, 5 May 2016 20:25:38 -0300	[thread overview]
Message-ID: <20160505232538.GK11069@kernel.org> (raw)
In-Reply-To: <20160429150950.30063.39517.stgit@devbox>

Em Sat, Apr 30, 2016 at 12:09:50AM +0900, Masami Hiramatsu escreveu:
> Rewrite strbuf implementation not to use die() nor xrealloc().
> Instead of die, now most of the API returns error code or 0 if
> succeeded.
> 
> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> ---
>  tools/perf/util/strbuf.c |   93 +++++++++++++++++++++++++++++++++-------------
>  tools/perf/util/strbuf.h |   25 +++++++-----
>  2 files changed, 82 insertions(+), 36 deletions(-)
> 
> diff --git a/tools/perf/util/strbuf.c b/tools/perf/util/strbuf.c
> index 8fb7329..a98bb60 100644
> --- a/tools/perf/util/strbuf.c
> +++ b/tools/perf/util/strbuf.c
> @@ -1,3 +1,4 @@
> +#include "debug.h"
>  #include "cache.h"
>  #include <linux/kernel.h>
>  
> @@ -17,12 +18,13 @@ int prefixcmp(const char *str, const char *prefix)
>   */
>  char strbuf_slopbuf[1];
>  
> -void strbuf_init(struct strbuf *sb, ssize_t hint)
> +int strbuf_init(struct strbuf *sb, ssize_t hint)
>  {
>  	sb->alloc = sb->len = 0;
>  	sb->buf = strbuf_slopbuf;
>  	if (hint)
> -		strbuf_grow(sb, hint);
> +		return strbuf_grow(sb, hint);
> +	return 0;
>  }
>  
>  void strbuf_release(struct strbuf *sb)
> @@ -42,67 +44,104 @@ char *strbuf_detach(struct strbuf *sb, size_t *sz)
>  	return res;
>  }
>  
> -void strbuf_grow(struct strbuf *sb, size_t extra)
> +int strbuf_grow(struct strbuf *sb, size_t extra)
>  {
> -	if (sb->len + extra + 1 <= sb->len)
> -		die("you want to use way too much memory");
> -	if (!sb->alloc)
> -		sb->buf = NULL;
> -	ALLOC_GROW(sb->buf, sb->len + extra + 1, sb->alloc);
> +	char *buf;
> +	size_t nr = sb->len + extra + 1;
> +
> +	if (nr < sb->alloc)
> +		return 0;
> +
> +	if (nr <= sb->len)
> +		return -E2BIG;
> +
> +	if (alloc_nr(sb->alloc) > nr)
> +		nr = alloc_nr(sb->alloc);
> +
> +	buf = malloc(nr * sizeof(*buf));
> +	if (!buf)
> +		return -ENOMEM;
> +
> +	if (sb->alloc) {
> +		memcpy(buf, sb->buf, sb->alloc);
> +		free(sb->buf);
> +	}

Why not use realloc? I.e. as the old code did, the problem was not that,
was just the panic when the realloc operation fails, that you are
removing here.

I.e. the above would be:

	buf = realloc(sb->buf, nr * sizeof(*buf));
	if (!buf)
		return -ENOMEM;

> +	sb->buf = buf;
> +	sb->alloc = nr;
> +	return 0;

I.e. no need to do the memcpy() nor the free(), no?

>  ssize_t strbuf_read(struct strbuf *sb, int fd, ssize_t hint)
>  {
>  	size_t oldlen = sb->len;
>  	size_t oldalloc = sb->alloc;
> +	int ret;
> +
> +	ret = strbuf_grow(sb, hint ? hint : 8192);
> +	if (ret)
> +		return ret;
>  
> -	strbuf_grow(sb, hint ? hint : 8192);
>  	for (;;) {
>  		ssize_t cnt;
>  
> @@ -112,12 +151,14 @@ ssize_t strbuf_read(struct strbuf *sb, int fd, ssize_t hint)
>  				strbuf_release(sb);
>  			else
>  				strbuf_setlen(sb, oldlen);
> -			return -1;
> +			return cnt;

This is unrelated, no?

I.e. this _was_ already returning a failure code, but then you are
propagating the read() return, which may even be a good idea, haven't
thought about that, but is unrelated to what this patch is doing, please
put it in a separate patch if you think it is a good idea.

All the rest seems ok, going over the other patches now.

- Arnaldo

  reply	other threads:[~2016-05-05 23:25 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-29 15:09 [PATCH perf/core v2 0/8] perf tools: Update strbuf to remove xrealloc Masami Hiramatsu
2016-04-29 15:09 ` [PATCH perf/core v2 1/8] perf: Rewrite strbuf not to die Masami Hiramatsu
2016-05-05 23:25   ` Arnaldo Carvalho de Melo [this message]
2016-05-05 23:49     ` Arnaldo Carvalho de Melo
2016-05-10  1:00     ` Masami Hiramatsu
2016-04-29 15:10 ` [PATCH perf/core v2 2/8] perf probe: Check the return value of strbuf APIs Masami Hiramatsu
2016-05-05 23:46   ` Arnaldo Carvalho de Melo
2016-05-10  2:37     ` Masami Hiramatsu
2016-04-29 15:10 ` [PATCH perf/core v2 3/8] perf help: Make check_emacsclient_version to check " Masami Hiramatsu
2016-05-05 23:51   ` Arnaldo Carvalho de Melo
2016-04-29 15:10 ` [PATCH perf/core v2 4/8] perf: Make alias handler to check return value of strbuf Masami Hiramatsu
2016-05-05 23:53   ` Arnaldo Carvalho de Melo
2016-04-29 15:10 ` [PATCH perf/core v2 5/8] perf header: Make topology checkers " Masami Hiramatsu
2016-05-05 23:55   ` Arnaldo Carvalho de Melo
2016-05-10  2:58     ` Masami Hiramatsu
2016-04-29 15:10 ` [PATCH perf/core v2 6/8] perf pmu: Make pmu_formats_string " Masami Hiramatsu
2016-05-05 23:56   ` Arnaldo Carvalho de Melo
2016-04-29 15:10 ` [PATCH perf/core v2 7/8] perf help: Do not use ALLOC_GROW in add_cmd_list Masami Hiramatsu
2016-05-05 23:58   ` Arnaldo Carvalho de Melo
2016-04-29 15:11 ` [PATCH perf/core v2 8/8] perf tools: Remove xrealloc and ALLOC_GROW Masami Hiramatsu
2016-05-05 23:58   ` Arnaldo Carvalho de Melo
2016-04-29 15:14 ` [PATCH perf/core v2 0/8] perf tools: Update strbuf to remove xrealloc Arnaldo Carvalho de Melo

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=20160505232538.GK11069@kernel.org \
    --to=acme@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=mingo@redhat.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox