From: Igor Mammedov <imammedo@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@gmail.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
Paolo Bonzini <pbonzini@redhat.com>, QEMU <qemu-devel@nongnu.org>,
Sergio Lopez <slp@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [PATCH] hw/char/serial: Only retry if qemu_chr_fe_write returns 0
Date: Mon, 16 Jul 2018 11:03:30 +0200 [thread overview]
Message-ID: <20180716110330.7caa7448@redhat.com> (raw)
In-Reply-To: <CAJ+F1CJVQn5zucYgn9dUFOu76MZkqd2Vaep52c89AORWF=sOrA@mail.gmail.com>
On Fri, 13 Jul 2018 16:55:15 +0200
Marc-André Lureau <marcandre.lureau@gmail.com> wrote:
> Hi
>
> On Tue, Jul 10, 2018 at 3:48 PM, Igor Mammedov <imammedo@redhat.com> wrote:
> > On Tue, 5 Jun 2018 11:18:35 +0200
> > Paolo Bonzini <pbonzini@redhat.com> wrote:
> >
> >> On 05/06/2018 09:54, Sergio Lopez wrote:
> >> > Only retry on serial_xmit if qemu_chr_fe_write returns 0, as this is the
> >> > only recoverable error.
> >> >
> >> > Retrying with any other scenario, in addition to being a waste of CPU
> >> > cycles, can compromise the Guest stability if by the vCPU issuing the
> >> > write and the main loop thread are, by chance or explicit pinning,
> >> > running on the same pCPU.
> >> >
> >> > Previous discussion:
> >> >
> >> > https://lists.nongnu.org/archive/html/qemu-devel/2018-05/msg06998.html
> >> >
> >> > Signed-off-by: Sergio Lopez <slp@redhat.com>
> >> > ---
> >> > hw/char/serial.c | 2 +-
> >> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >> >
> >> > diff --git a/hw/char/serial.c b/hw/char/serial.c
> >> > index 605b0d0..6de6c29 100644
> >> > --- a/hw/char/serial.c
> >> > +++ b/hw/char/serial.c
> >> > @@ -260,7 +260,7 @@ static void serial_xmit(SerialState *s)
> >> > if (s->mcr & UART_MCR_LOOP) {
> >> > /* in loopback mode, say that we just received a char */
> >> > serial_receive1(s, &s->tsr, 1);
> >> > - } else if (qemu_chr_fe_write(&s->chr, &s->tsr, 1) != 1 &&
> >> > + } else if (qemu_chr_fe_write(&s->chr, &s->tsr, 1) == 0 &&
> >> > s->tsr_retry < MAX_XMIT_RETRY) {
> >> > assert(s->watch_tag == 0);
> >> > s->watch_tag =
> >> >
> > Hi Sergio, Paolo,
> >
> > it looks like commit
> > commit 019288bf137183bf3407c9824655b753bfafc99f
> > Author: Sergio Lopez <slp@redhat.com>
> > Date: Tue Jun 5 03:54:55 2018 -0400
> >
> > hw/char/serial: Only retry if qemu_chr_fe_write returns 0
> >
> > introduced regression wrt 2.12 and broke windows guest remote kernel debug over
> > serial, where windbg can't connect to target and target hangs when windbg tries
> > to connect to it.
> >
> > Reverting the commit fixes issue
> >
>
> is this a possible solution?
it fixes windbg over serial (with and without EINTR)
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index cd7d747c68..046c4684ff 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -261,15 +261,20 @@ static void serial_xmit(SerialState *s)
> if (s->mcr & UART_MCR_LOOP) {
> /* in loopback mode, say that we just received a char */
> serial_receive1(s, &s->tsr, 1);
> - } else if (qemu_chr_fe_write(&s->chr, &s->tsr, 1) == 0 &&
> - s->tsr_retry < MAX_XMIT_RETRY) {
> - assert(s->watch_tag == 0);
> - s->watch_tag =
> - qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP,
> - serial_watch_cb, s);
> - if (s->watch_tag > 0) {
> - s->tsr_retry++;
> - return;
> + } else {
> + int rc = qemu_chr_fe_write(&s->chr, &s->tsr, 1);
> +
> + if ((rc == 0 ||
> + (rc == -1 && (errno == EAGAIN || errno == EINTR))) &&
> + s->tsr_retry < MAX_XMIT_RETRY) {
> + assert(s->watch_tag == 0);
> + s->watch_tag =
> + qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP,
> + serial_watch_cb, s);
> + if (s->watch_tag > 0) {
> + s->tsr_retry++;
> + return;
> + }
> }
> }
> s->tsr_retry = 0;
>
>
prev parent reply other threads:[~2018-07-16 9:03 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1528185295-14199-1-git-send-email-slp@redhat.com>
2018-06-05 9:18 ` [Qemu-devel] [PATCH] hw/char/serial: Only retry if qemu_chr_fe_write returns 0 Paolo Bonzini
2018-07-09 10:25 ` Marc-André Lureau
2018-07-09 12:11 ` Peter Maydell
2018-07-09 12:23 ` Marc-André Lureau
2018-07-09 13:17 ` Paolo Bonzini
2018-07-09 13:21 ` Peter Maydell
2018-07-09 13:44 ` Paolo Bonzini
2018-07-10 13:48 ` Igor Mammedov
2018-07-13 14:55 ` Marc-André Lureau
2018-07-13 15:05 ` Paolo Bonzini
2018-07-16 9:03 ` Igor Mammedov [this message]
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=20180716110330.7caa7448@redhat.com \
--to=imammedo@redhat.com \
--cc=marcandre.lureau@gmail.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=slp@redhat.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.