From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:54462) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UJRIj-0000CP-D3 for qemu-devel@nongnu.org; Sat, 23 Mar 2013 12:28:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UJRIg-00029O-6a for qemu-devel@nongnu.org; Sat, 23 Mar 2013 12:28:13 -0400 Received: from e32.co.us.ibm.com ([32.97.110.150]:48186) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UJRIg-000260-09 for qemu-devel@nongnu.org; Sat, 23 Mar 2013 12:28:10 -0400 Received: from /spool/local by e32.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Sat, 23 Mar 2013 10:27:55 -0600 Received: from d03relay01.boulder.ibm.com (d03relay01.boulder.ibm.com [9.17.195.226]) by d03dlp02.boulder.ibm.com (Postfix) with ESMTP id C72013E40044 for ; Sat, 23 Mar 2013 10:27:40 -0600 (MDT) Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay01.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r2NGRp1q115610 for ; Sat, 23 Mar 2013 10:27:51 -0600 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r2NGRofI022232 for ; Sat, 23 Mar 2013 10:27:51 -0600 Message-ID: <514DD805.50604@linux.vnet.ibm.com> Date: Sat, 23 Mar 2013 12:27:49 -0400 From: "Michael R. Hines" MIME-Version: 1.0 References: <1363856971-4601-1-git-send-email-owasserm@redhat.com> <1363856971-4601-11-git-send-email-owasserm@redhat.com> In-Reply-To: <1363856971-4601-11-git-send-email-owasserm@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC 10/12] Add qemu_put_buffer_no_copy List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Orit Wasserman Cc: pbonzini@redhat.com, quintela@redhat.com, chegu_vinod@hp.com, qemu-devel@nongnu.org, mst@redhat.com Can you add a "flag" or something to indicate that the iov pointer belongs to RAM and not to device state? That way, I could re-use this code for RDMA - if I see this flag, I will know to send to RDMA..... - Michael On 03/21/2013 05:09 AM, Orit Wasserman wrote: > This allow us to add a buffer to the iovec to send without copying it > into the static buffer. > > Signed-off-by: Orit Wasserman > --- > include/migration/qemu-file.h | 5 +++++ > savevm.c | 42 ++++++++++++++++++++++++------------------ > 2 files changed, 29 insertions(+), 18 deletions(-) > > diff --git a/include/migration/qemu-file.h b/include/migration/qemu-file.h > index 8d3da9b..5168be2 100644 > --- a/include/migration/qemu-file.h > +++ b/include/migration/qemu-file.h > @@ -75,6 +75,11 @@ int qemu_fclose(QEMUFile *f); > int64_t qemu_ftell(QEMUFile *f); > void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size); > void qemu_put_byte(QEMUFile *f, int v); > +/* > + * put_buffer without copying the buffer. > + * The buffer should be available till it is sent. > + */ > +void qemu_put_buffer_no_copy(QEMUFile *f, const uint8_t *buf, int size); > > static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v) > { > diff --git a/savevm.c b/savevm.c > index 40d96f4..32a506e 100644 > --- a/savevm.c > +++ b/savevm.c > @@ -629,6 +629,22 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size) > { > int l; > > + while (size > 0) { > + l = IO_BUF_SIZE - f->buf_index; > + if (l > size) { > + l = size; > + } > + memcpy(f->buf + f->buf_index, buf, l); > + f->buf_index += l; > + f->is_write = 1; > + qemu_put_buffer_no_copy(f, f->buf + (f->buf_index - l), l); > + buf += l; > + size -= l; > + } > +} > + > +void qemu_put_buffer_no_copy(QEMUFile *f, const uint8_t *buf, int size) > +{ > if (f->last_error) { > return; > } > @@ -639,24 +655,14 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size) > abort(); > } > > - while (size > 0) { > - l = IO_BUF_SIZE - f->buf_index; > - if (l > size) > - l = size; > - memcpy(f->buf + f->buf_index, buf, l); > - f->iov[f->iovcnt].iov_base = f->buf + f->buf_index; > - f->iov[f->iovcnt++].iov_len = l; > - f->is_write = 1; > - f->buf_index += l; > - f->bytes_xfer += l; > - buf += l; > - size -= l; > - if (f->buf_index >= IO_BUF_SIZE || f->iovcnt >= MAX_IOV_SIZE) { > - qemu_fflush(f); > - if (qemu_file_get_error(f)) { > - break; > - } > - } > + f->iov[f->iovcnt].iov_base = (uint8_t *)buf; > + f->iov[f->iovcnt++].iov_len = size; > + > + f->is_write = 1; > + f->bytes_xfer += size; > + > + if (f->buf_index >= IO_BUF_SIZE || f->iovcnt >= MAX_IOV_SIZE) { > + qemu_fflush(f); > } > } >