From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:39133) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TQMVi-0005BB-KL for qemu-devel@nongnu.org; Mon, 22 Oct 2012 14:13:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TQMVh-00029J-Kr for qemu-devel@nongnu.org; Mon, 22 Oct 2012 14:13:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:15755) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TQMVh-00029B-A8 for qemu-devel@nongnu.org; Mon, 22 Oct 2012 14:13:57 -0400 Date: Mon, 22 Oct 2012 16:14:29 -0200 From: Luiz Capitulino Message-ID: <20121022161429.6fc70b08@doriath.home> In-Reply-To: <1350838081-6351-2-git-send-email-lilei@linux.vnet.ibm.com> References: <1350838081-6351-1-git-send-email-lilei@linux.vnet.ibm.com> <1350838081-6351-2-git-send-email-lilei@linux.vnet.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/5] qemu-char: Add new char backend CircularMemCharDriver List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Lei Li Cc: blauwirbel@gmail.com, aliguori@us.ibm.com, qemu-devel@nongnu.org On Mon, 22 Oct 2012 00:47:57 +0800 Lei Li wrote: > Signed-off-by: Lei Li This patch should be squashed in the next one. More comments below. > --- > qemu-char.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 72 insertions(+), 0 deletions(-) > > diff --git a/qemu-char.c b/qemu-char.c > index b082bae..b174da1 100644 > --- a/qemu-char.c > +++ b/qemu-char.c > @@ -2588,6 +2588,78 @@ size_t qemu_chr_mem_osize(const CharDriverState *chr) > return d->outbuf_size; > } > > +/*********************************************************/ > +/*CircularMemoryr chardev*/ s/Memoryr/Memory > + > +typedef struct { > + size_t size; > + size_t producer; > + size_t consumer; > + uint8_t *cbuf; > +} CirMemCharDriver; > + > +static bool cirmem_chr_is_empty(const CharDriverState *chr) > +{ > + const CirMemCharDriver *d = chr->opaque; > + > + return d->producer == d->consumer; > +} > + > +static bool cirmem_chr_is_full(const CharDriverState *chr) > +{ > + const CirMemCharDriver *d = chr->opaque; > + > + return (d->producer - d->consumer) >= d->size; > +} > + > +static int cirmem_chr_write(CharDriverState *chr, const uint8_t *buf, int len) > +{ > + CirMemCharDriver *d = chr->opaque; > + int i; > + > + if (len < 0) { > + return -1; > + } > + > + /* The size should be a power of 2. */ > + for (i = 0; i < len; i++ ) { > + d->cbuf[d->producer % d->size] = buf[i]; > + d->producer++; > + } > + > + return 0; > +} > + > +static int cirmem_chr_read(CharDriverState *chr, uint8_t *buf, int len) > +{ > + CirMemCharDriver *d = chr->opaque; > + int i; > + > + if (cirmem_chr_is_empty(chr) || len < 0) { > + return -1; > + } > + > + if (len > d->size) { > + len = d->size; > + } > + > + for (i = 0; i < len; i++) { > + buf[i] = d->cbuf[d->consumer % d->size]; > + d->consumer++; > + } > + > + return 0; > +} You don't seem to reset producer/consumer anywhere, I wonder if it's possible for a long running VM to trigger the limit here. > + > +static void cirmem_chr_close(struct CharDriverState *chr) > +{ > + CirMemCharDriver *d = chr->opaque; > + > + g_free(d); > + g_free(chr->opaque); Double free. I think you want to free cbuf, like: g_free(d->cbuf); g_free(d); > + chr->opaque = NULL; > +} > + > QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename) > { > char host[65], port[33], width[8], height[8];