From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1423580AbdEYIJ4 (ORCPT ); Thu, 25 May 2017 04:09:56 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58830 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1423470AbdEYIIw (ORCPT ); Thu, 25 May 2017 04:08:52 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 55B6F61B8A Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=jolsa@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 55B6F61B8A Date: Thu, 25 May 2017 10:08:48 +0200 From: Jiri Olsa To: David Carrillo-Cisneros Cc: linux-kernel@vger.kernel.org, Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Alexander Shishkin , Andi Kleen , Simon Que , Wang Nan , Jiri Olsa , He Kuang , Masami Hiramatsu , David Ahern , Namhyung Kim , Stephane Eranian , Paul Turner Subject: Re: [PATCH v2 10/13] perf header: add a buffer to struct feat_fd Message-ID: <20170525080848.GH14467@krava> References: <20170523074853.54892-1-davidcc@google.com> <20170523074853.54892-11-davidcc@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170523074853.54892-11-davidcc@google.com> User-Agent: Mutt/1.8.0 (2017-02-23) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 25 May 2017 08:08:52 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, May 23, 2017 at 12:48:50AM -0700, David Carrillo-Cisneros wrote: SNIP > @@ -82,11 +83,27 @@ bool perf_header__has_feat(const struct perf_header *header, int feat) > /* Return: 0 if succeded, -ERR if failed. */ > int do_write(struct feat_fd *fd, const void *buf, size_t size) > { > - ssize_t ret; > + void *addr; > > - ret = writen(fd->fd, buf, size); > - if (ret != (ssize_t)size) > - return ret < 0 ? (int)ret: -1; > + if (!fd->buf) { > + ssize_t ret = writen(fd->fd, buf, size); > + > + if (ret != (ssize_t)size) > + return ret < 0 ? (int)ret : -1; > + return 0; > + } > +retry: > + if (size > (fd->size - fd->offset)) { > + addr = realloc(fd->buf, fd->size << 1); > + if (!addr) > + return -ENOSPC; > + fd->buf = addr; > + fd->size <<= 1; > + goto retry; > + } > + > + memcpy(fd->buf + fd->offset, buf, size); > + fd->offset += size; > > return 0; please put those 2 cases in separate functions > } > @@ -126,10 +143,21 @@ static int do_write_string(struct feat_fd *fd, const char *str) > > static int __do_read(struct feat_fd *fd, void *addr, ssize_t size) > { > - ssize_t ret = readn(fd->fd, addr, size); > + if (!fd->buf) { > + ssize_t ret = readn(fd->fd, addr, size); > + > + if (ret != (ssize_t)size) > + return ret < 0 ? (int)ret : -1; > + return 0; > + } > + > + assert((ssize_t)fd->size > fd->offset); > + if (size > (ssize_t)fd->size - fd->offset) > + return -1; > + > + memcpy(addr, fd->buf + fd->offset, size); > + fd->offset += size; > > - if (ret != (ssize_t)size) > - return ret < 0 ? (int)ret : -1; > return 0; > } same for the read thanks, jirka