From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38103) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X1ac8-0006Al-Pb for qemu-devel@nongnu.org; Mon, 30 Jun 2014 08:23:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X1ac4-0006NC-WD for qemu-devel@nongnu.org; Mon, 30 Jun 2014 08:23:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:12514) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X1ac4-0006N1-OF for qemu-devel@nongnu.org; Mon, 30 Jun 2014 08:23:12 -0400 Message-ID: <53B156A7.8010306@redhat.com> Date: Mon, 30 Jun 2014 14:23:03 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1400860669-21593-1-git-send-email-roger.pau@citrix.com> <1400860669-21593-4-git-send-email-roger.pau@citrix.com> <539B1A5C.80104@citrix.com> <53B14359.9050902@citrix.com> In-Reply-To: <53B14359.9050902@citrix.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v2 3/3] serial: poll the serial console with G_IO_HUP List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?UTF-8?B?Um9nZXIgUGF1IE1vbm7DqQ==?= , qemu-devel@nongnu.org, xen-devel@lists.xenproject.org Cc: Peter Crosthwaite , Michael Tokarev , =?UTF-8?B?QW5kcmVhcyBGw6RyYmVy?= Il 30/06/2014 13:00, Roger Pau Monn=C3=A9 ha scritto: > Do I need to resend this? it's been more than a month without review. I'll send a pull request for it. Sorry for the delay. Paolo > On 13/06/14 17:35, Roger Pau Monn=C3=A9 wrote: >> Ping? >> >> On 23/05/14 17:57, Roger Pau Monne wrote: >>> On FreeBSD polling a master pty while the other end is not connected >>> with G_IO_OUT only results in an endless wait. This is different from >>> the Linux behaviour, that returns immediately. In order to demonstrat= e >>> this, I have the following example code: >>> >>> http://xenbits.xen.org/people/royger/test_poll.c >>> >>> When executed on Linux: >>> >>> $ ./test_poll >>> In callback >>> >>> On FreeBSD instead, the callback never gets called: >>> >>> $ ./test_poll >>> >>> So, in order to workaround this, poll the source with G_IO_HUP (which >>> makes the code behave the same way on both Linux and FreeBSD). >>> >>> Signed-off-by: Roger Pau Monn=C3=A9 >>> Cc: Peter Crosthwaite >>> Cc: Michael Tokarev >>> Cc: "Andreas F=C3=A4rber" >>> Cc: Paolo Bonzini >>> Cc: xen-devel@lists.xenproject.org >>> --- >>> Changes since v1: >>> - Fix other users of qemu_chr_fe_add_watch to use G_IO_HUP. >>> --- >>> hw/char/serial.c | 2 +- >>> hw/char/virtio-console.c | 3 ++- >>> hw/usb/redirect.c | 2 +- >>> monitor.c | 2 +- >>> 4 files changed, 5 insertions(+), 4 deletions(-) >>> >>> diff --git a/hw/char/serial.c b/hw/char/serial.c >>> index f4d167f..2a2c9e5 100644 >>> --- a/hw/char/serial.c >>> +++ b/hw/char/serial.c >>> @@ -246,7 +246,7 @@ static gboolean serial_xmit(GIOChannel *chan, GIO= Condition cond, void *opaque) >>> serial_receive1(s, &s->tsr, 1); >>> } else if (qemu_chr_fe_write(s->chr, &s->tsr, 1) !=3D 1) { >>> if (s->tsr_retry >=3D 0 && s->tsr_retry < MAX_XMIT_RETRY && >>> - qemu_chr_fe_add_watch(s->chr, G_IO_OUT, serial_xmit, s) = > 0) { >>> + qemu_chr_fe_add_watch(s->chr, G_IO_OUT|G_IO_HUP, serial_= xmit, s) > 0) { >>> s->tsr_retry++; >>> return FALSE; >>> } >>> diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c >>> index 6c8be0f..38e290a 100644 >>> --- a/hw/char/virtio-console.c >>> +++ b/hw/char/virtio-console.c >>> @@ -69,7 +69,8 @@ static ssize_t flush_buf(VirtIOSerialPort *port, >>> if (!k->is_console) { >>> virtio_serial_throttle_port(port, true); >>> if (!vcon->watch) { >>> - vcon->watch =3D qemu_chr_fe_add_watch(vcon->chr, G_I= O_OUT, >>> + vcon->watch =3D qemu_chr_fe_add_watch(vcon->chr, >>> + G_IO_OUT|G_IO_HU= P, >>> chr_write_unbloc= ked, vcon); >>> } >>> } >>> diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c >>> index 287a505..06e757d 100644 >>> --- a/hw/usb/redirect.c >>> +++ b/hw/usb/redirect.c >>> @@ -284,7 +284,7 @@ static int usbredir_write(void *priv, uint8_t *da= ta, int count) >>> r =3D qemu_chr_fe_write(dev->cs, data, count); >>> if (r < count) { >>> if (!dev->watch) { >>> - dev->watch =3D qemu_chr_fe_add_watch(dev->cs, G_IO_OUT, >>> + dev->watch =3D qemu_chr_fe_add_watch(dev->cs, G_IO_OUT|G= _IO_HUP, >>> usbredir_write_unbloc= ked, dev); >>> } >>> if (r < 0) { >>> diff --git a/monitor.c b/monitor.c >>> index 593679a..ae1c539 100644 >>> --- a/monitor.c >>> +++ b/monitor.c >>> @@ -304,7 +304,7 @@ void monitor_flush(Monitor *mon) >>> mon->outbuf =3D tmp; >>> } >>> if (mon->watch =3D=3D 0) { >>> - mon->watch =3D qemu_chr_fe_add_watch(mon->chr, G_IO_OUT, >>> + mon->watch =3D qemu_chr_fe_add_watch(mon->chr, G_IO_OUT|= G_IO_HUP, >>> monitor_unblocked, mo= n); >>> } >>> } >>> >> >> >