From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O526g-0007JC-Ga for qemu-devel@nongnu.org; Thu, 22 Apr 2010 15:30:38 -0400 Received: from [140.186.70.92] (port=39117 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O5265-00073n-29 for qemu-devel@nongnu.org; Thu, 22 Apr 2010 15:30:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O5261-0006Qs-A3 for qemu-devel@nongnu.org; Thu, 22 Apr 2010 15:29:59 -0400 Received: from e33.co.us.ibm.com ([32.97.110.151]:45778) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O5261-0006Qe-2P for qemu-devel@nongnu.org; Thu, 22 Apr 2010 15:29:57 -0400 Received: from d03relay03.boulder.ibm.com (d03relay03.boulder.ibm.com [9.17.195.228]) by e33.co.us.ibm.com (8.14.3/8.13.1) with ESMTP id o3MJQ2N8021621 for ; Thu, 22 Apr 2010 13:26:02 -0600 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o3MJTsxj098796 for ; Thu, 22 Apr 2010 13:29:55 -0600 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id o3MJTs3K000769 for ; Thu, 22 Apr 2010 13:29:54 -0600 Message-ID: <4BD0A3B0.8040609@linux.vnet.ibm.com> Date: Thu, 22 Apr 2010 14:29:52 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <1271829445-5328-1-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> <1271829445-5328-8-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> In-Reply-To: <1271829445-5328-8-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [RFC PATCH 07/20] Introduce qemu_put_vector() and qemu_put_vector_prepare() to use put_vector() in QEMUFile. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Yoshiaki Tamura Cc: ohmura.kei@lab.ntt.co.jp, kvm@vger.kernel.org, mtosatti@redhat.com, Anthony Liguori , qemu-devel@nongnu.org, yoshikawa.takuya@oss.ntt.co.jp, avi@redhat.com On 04/21/2010 12:57 AM, Yoshiaki Tamura wrote: > For fool proof purpose, qemu_put_vector_parepare should be called > before qemu_put_vector. Then, if qemu_put_* functions except this is > called after qemu_put_vector_prepare, program will abort(). > > Signed-off-by: Yoshiaki Tamura > I don't get it. What's this protecting against? Regards, Anthony Liguori > --- > hw/hw.h | 2 ++ > savevm.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+), 0 deletions(-) > > diff --git a/hw/hw.h b/hw/hw.h > index 921cf90..10e6dda 100644 > --- a/hw/hw.h > +++ b/hw/hw.h > @@ -77,6 +77,8 @@ void qemu_fflush(QEMUFile *f); > int qemu_fclose(QEMUFile *f); > void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size); > void qemu_put_byte(QEMUFile *f, int v); > +void qemu_put_vector(QEMUFile *f, QEMUIOVector *qiov); > +void qemu_put_vector_prepare(QEMUFile *f); > void *qemu_realloc_buffer(QEMUFile *f, int size); > void qemu_clear_buffer(QEMUFile *f); > > diff --git a/savevm.c b/savevm.c > index 944e788..22d928c 100644 > --- a/savevm.c > +++ b/savevm.c > @@ -180,6 +180,7 @@ struct QEMUFile { > uint8_t *buf; > > int has_error; > + int prepares_vector; > }; > > typedef struct QEMUFileStdio > @@ -557,6 +558,58 @@ void qemu_put_byte(QEMUFile *f, int v) > qemu_fflush(f); > } > > +void qemu_put_vector(QEMUFile *f, QEMUIOVector *v) > +{ > + struct iovec *iov; > + int cnt; > + size_t bufsize; > + uint8_t *buf; > + > + if (qemu_file_get_rate_limit(f) != 0) { > + fprintf(stderr, > + "Attempted to write vector while bandwidth limit is not zero.\n"); > + abort(); > + } > + > + /* checks prepares vector. > + * For fool proof purpose, qemu_put_vector_parepare should be called > + * before qemu_put_vector. Then, if qemu_put_* functions except this > + * is called after qemu_put_vector_prepare, program will abort(). > + */ > + if (!f->prepares_vector) { > + fprintf(stderr, > + "You should prepare with qemu_put_vector_prepare.\n"); > + abort(); > + } else if (f->prepares_vector&& f->buf_index != 0) { > + fprintf(stderr, "Wrote data after qemu_put_vector_prepare.\n"); > + abort(); > + } > + f->prepares_vector = 0; > + > + if (f->put_vector) { > + qemu_iovec_to_vector(v,&iov,&cnt); > + f->put_vector(f->opaque, iov, 0, cnt); > + } else { > + qemu_iovec_to_size(v,&bufsize); > + buf = qemu_malloc(bufsize + 1 /* for '\0' */); > + qemu_iovec_to_buffer(v, buf); > + qemu_put_buffer(f, buf, bufsize); > + qemu_free(buf); > + } > + > +} > + > +void qemu_put_vector_prepare(QEMUFile *f) > +{ > + if (f->prepares_vector) { > + /* prepare vector */ > + fprintf(stderr, "Attempted to prepare vector twice\n"); > + abort(); > + } > + f->prepares_vector = 1; > + qemu_fflush(f); > +} > + > int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size1) > { > int size, l; >