qemu-e2k/chardev
Klim Kireev a8aa6197a2 chardev/char-socket: add POLLHUP handler
The following behavior was observed for QEMU configured by libvirt
to use guest agent as usual for the guests without virtio-serial
driver (Windows or the guest remaining in BIOS stage).

In QEMU on first connect to listen character device socket
the listen socket is removed from poll just after the accept().
virtio_serial_guest_ready() returns 0 and the descriptor
of the connected Unix socket is removed from poll and it will
not be present in poll() until the guest will initialize the driver
and change the state of the serial to "guest connected".

In libvirt connect() to guest agent is performed on restart and
is run under VM state lock. Connect() is blocking and can
wait forever.
In this case libvirt can not perform ANY operation on that VM.

The bug can be easily reproduced this way:

Terminal 1:
qemu-system-x86_64 -m 512 -device pci-serial,chardev=serial1 -chardev socket,id=serial1,path=/tmp/console.sock,server,nowait
(virtio-serial and isa-serial also fit)

Terminal 2:
minicom -D unix\#/tmp/console.sock
(type something and press enter)
C-a x (to exit)

Do 3 times:
minicom -D unix\#/tmp/console.sock
C-a x

It needs 4 connections, because the first one is accepted by QEMU, then two are queued by
the kernel, and the 4th blocks.

The problem is that QEMU doesn't add a read watcher after succesful read
until the guest device wants to acquire recieved data, so
I propose to install a separate pullhup watcher regardless of
whether the device waits for data or not.

Signed-off-by: Klim Kireev <klim.kireev@virtuozzo.com>
Message-Id: <20180125135129.9305-1-klim.kireev@virtuozzo.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2018-02-07 14:09:24 +01:00
..
Makefile.objs buildsys: Move brlapi libs to per object 2017-09-22 10:20:34 +08:00
baum.c baum: Truncate braille device size to 84x1 2017-12-21 09:22:44 +01:00
char-console.c chardev: move headers to include/chardev 2017-06-02 11:33:52 +04:00
char-fd.c chardev: remove context in chr_update_read_handler 2017-09-22 21:07:27 +02:00
char-fe.c chardev: use backend chr context when watch for fe 2018-01-12 13:22:02 +01:00
char-file.c chardev: move headers to include/chardev 2017-06-02 11:33:52 +04:00
char-io.c chardev: move headers to include/chardev 2017-06-02 11:33:52 +04:00
char-mux.c chardev: fix backend events regression with mux chardev 2017-12-21 09:30:32 +01:00
char-null.c chardev: move headers to include/chardev 2017-06-02 11:33:52 +04:00
char-parallel.c chardev: move headers to include/chardev 2017-06-02 11:33:52 +04:00
char-pipe.c chardev: move headers to include/chardev 2017-06-02 11:33:52 +04:00
char-pty.c chardev: fix incorrect unref of source 2018-02-05 13:54:39 +01:00
char-ringbuf.c chardev: move headers to include/chardev 2017-06-02 11:33:52 +04:00
char-serial.c chardev: Clean up previous patch indentation 2018-01-16 14:54:52 +01:00
char-socket.c chardev/char-socket: add POLLHUP handler 2018-02-07 14:09:24 +01:00
char-stdio.c chardev: move headers to include/chardev 2017-06-02 11:33:52 +04:00
char-udp.c chardev: remove context in chr_update_read_handler 2017-09-22 21:07:27 +02:00
char-win-stdio.c chardev: move headers to include/chardev 2017-06-02 11:33:52 +04:00
char-win.c chardev: move headers to include/chardev 2017-06-02 11:33:52 +04:00
char.c chardev: introduce qemu_chr_timeout_add_ms() 2018-01-12 13:22:02 +01:00
msmouse.c char: move char devices to chardev/ 2017-06-02 11:33:53 +04:00
spice.c char: move char devices to chardev/ 2017-06-02 11:33:53 +04:00
testdev.c char: move char devices to chardev/ 2017-06-02 11:33:53 +04:00
trace-events docs: fix broken paths to docs/devel/tracing.txt 2017-07-31 13:12:53 +03:00
wctablet.c misc: remove headers implicitly included 2017-12-18 17:07:02 +03:00