From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:52818) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TGJFm-0007sZ-US for qemu-devel@nongnu.org; Mon, 24 Sep 2012 20:43:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TGJFl-0006aD-Qf for qemu-devel@nongnu.org; Mon, 24 Sep 2012 20:43:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:65318) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TGJFl-0006a9-HS for qemu-devel@nongnu.org; Mon, 24 Sep 2012 20:43:57 -0400 Date: Tue, 25 Sep 2012 02:45:23 +0200 From: "Michael S. Tsirkin" Message-ID: <20120925004523.GB22779@redhat.com> References: <87d31b0wlj.fsf@codemonkey.ws> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87d31b0wlj.fsf@codemonkey.ws> Subject: Re: [Qemu-devel] [PATCH 03/14] iov: add iov_cpy List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: Jason Wang , qemu-devel@nongnu.org, aurelien@aurel32.net, stefanha@linux.vnet.ibm.com On Mon, Sep 24, 2012 at 07:34:00PM -0500, Anthony Liguori wrote: > "Michael S. Tsirkin" writes: > > > Add API to copy part of iovec safely. > > > > Signed-off-by: Michael S. Tsirkin > > --- > > iov.c | 23 +++++++++++++++++++++++ > > iov.h | 9 +++++++++ > > 2 files changed, 32 insertions(+) > > > > diff --git a/iov.c b/iov.c > > index c6a66f0..0dfcb28 100644 > > --- a/iov.c > > +++ b/iov.c > > @@ -228,3 +228,26 @@ void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt, > > fprintf(fp, "\n"); > > } > > } > > + > > +unsigned iov_cpy(struct iovec *dst_iov, unsigned int dst_iov_cnt, > > + const struct iovec *iov, unsigned int iov_cnt, > > + size_t offset, size_t bytes) > > I think the readability f the cde wuld be imprved if yu added the > missing 'o' to iov_cpy. I was thinking about memcpy but maybe that's not a good model to follow. Will fix. > Otherwise: > > Reviewed-by: Anthony Liguori > > Regards, > > Anthony Liguori > > > +{ > > + size_t len; > > + unsigned int i, j; > > + for (i = 0, j = 0; i < iov_cnt && j < dst_iov_cnt && bytes; i++) { > > + if (offset >= iov[i].iov_len) { > > + offset -= iov[i].iov_len; > > + continue; > > + } > > + len = MIN(bytes, iov[i].iov_len - offset); > > + > > + dst_iov[j].iov_base = iov[i].iov_base + offset; > > + dst_iov[j].iov_len = len; > > + j++; > > + bytes -= len; > > + offset = 0; > > + } > > + assert(offset == 0); > > + return j; > > +} > > diff --git a/iov.h b/iov.h > > index a73569f..f0daefa 100644 > > --- a/iov.h > > +++ b/iov.h > > @@ -86,3 +86,12 @@ ssize_t iov_send_recv(int sockfd, struct iovec *iov, unsigned iov_cnt, > > */ > > void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt, > > FILE *fp, const char *prefix, size_t limit); > > + > > +/* > > + * Partial copy of vector from iov to dst_iov (data is not copied). > > + * dst_iov overlaps iov at a specified offset. > > + * size of dst_iov is at most bytes. Actual size is returned. > > + */ > > +size_t iov_cpy(struct iovec *dst_iov, unsigned int dst_iov_cnt, > > + const struct iovec *iov, unsigned int iov_cnt, > > + size_t offset, size_t bytes); > > -- > > MST