From: Luiz Capitulino <lcapitulino@redhat.com>
To: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
Cc: fred.konrad@greensocs.com, qemu-devel@nongnu.org, kraxel@redhat.com
Subject: Re: [Qemu-devel] [PATCH 2/2] Monitor: Make output buffer dynamic
Date: Wed, 27 Mar 2013 08:27:56 -0400 [thread overview]
Message-ID: <20130327082756.212b15f7@redhat.com> (raw)
In-Reply-To: <515295A1.8030705@linux.vnet.ibm.com>
On Wed, 27 Mar 2013 14:45:53 +0800
Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote:
> Hi, Luiz
> Personally I hope reduce the dynamic allocated buffer which brings
> fragments and unexpected memory grow. Instead, how about sacrifice
> some time to wait output complete, since monitor is not time critical?
> in this case static buffer's size can decide how many work can be
> postponded. Following is my suggestion:
I'd be fine with it if you find a good way to postpone work, but sleeping
on random timers is not a good way.
Also, QEMU allocates fragments of memory in so many places that I doubt
this is an valid argument. You're right that long QMP output can cause
unexpected memory growth, but I expected this to be really rare and if
this really bother us, we can ask monitor_puts() to flush at, say, every
4096 bytes.
>
> --- a/monitor.c
> +++ b/monitor.c
> @@ -293,17 +293,28 @@ static void monitor_puts(Monitor *mon, const char
> *str)
> {
> char c;
>
> + /* if mux do not put in any thing to buffer */
> + if (mon->mux_out) {
> + return;
> + }
> +
> for(;;) {
> - assert(mon->outbuf_index < sizeof(mon->outbuf) - 1);
> + if (mon->outbuf_index >= sizeof(mon->outbuf) - 1) {
> + /* when buffer is full, flush it and retry. If buffer is
> bigger, more
> + work can be postponed. */
> + monitor_flush(mon);
> + usleep(1);
> + continue;
> + }
> c = *str++;
> if (c == '\0')
> break;
> if (c == '\n')
> mon->outbuf[mon->outbuf_index++] = '\r';
> mon->outbuf[mon->outbuf_index++] = c;
> - if (mon->outbuf_index >= (sizeof(mon->outbuf) - 1)
> - || c == '\n')
> + if (c == '\n') {
> monitor_flush(mon);
> + }
> }
> }
>
> > Commit f628926bb423fa8a7e0b114511400ea9df38b76a changed monitor_flush()
> > to retry on qemu_chr_fe_write() errors. However, the Monitor's output
> > buffer can keep growing while the retry is not issued and this can
> > cause the buffer to overflow.
> >
> > To reproduce this issue, just start qemu and type on the Monitor:
> >
> > (qemu) ?
> >
> > This will cause the assertion to trig.
> >
> > To fix this problem this commit makes the Monitor buffer dynamic,
> > which means that it can grow as much as needed.
> >
> > Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> > ---
> > monitor.c | 42 +++++++++++++++++++++++++-----------------
> > 1 file changed, 25 insertions(+), 17 deletions(-)
> >
>
next prev parent reply other threads:[~2013-03-27 12:28 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-25 19:40 [Qemu-devel] [PATCH 0/2] Monitor: make output buffer dynamic Luiz Capitulino
2013-03-25 19:40 ` [Qemu-devel] [PATCH 1/2] qstring: add qobject_get_length() Luiz Capitulino
2013-04-09 3:02 ` Hu Tao
2013-04-09 12:38 ` Luiz Capitulino
2013-03-25 19:40 ` [Qemu-devel] [PATCH 2/2] Monitor: Make output buffer dynamic Luiz Capitulino
2013-03-25 21:07 ` Paolo Bonzini
2013-03-25 21:44 ` Luiz Capitulino
2013-03-27 6:45 ` Wenchao Xia
2013-03-27 12:27 ` Luiz Capitulino [this message]
2013-03-28 3:21 ` Wenchao Xia
2013-04-02 9:18 ` Gerd Hoffmann
2013-04-02 9:19 ` [Qemu-devel] [PATCH 0/2] Monitor: make " Gerd Hoffmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130327082756.212b15f7@redhat.com \
--to=lcapitulino@redhat.com \
--cc=fred.konrad@greensocs.com \
--cc=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=xiawenc@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.