qemu-system-sparc loses serial console data on EAGAIN
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
QEMU |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
When running a guest OS with a serial console under
"qemu-system-sparc -nographic", parts of the serial console output
are sometimes lost.
This happens when a write() to standard output by qemu returns EAGAIN,
as may be the case when the guest is generating console output faster
than the tty (or pty/pipe/socket, etc.) connected to qemu's standard
output accepts it. The bug affects all releases of qemu since 1.5,
which was the first version to set stdout to O_NONBLOCK mode. Version
1.4.2 and earlier work correctly.
To reproduce the bug, you will need a guest OS configured with a
serial console, and a host with a slow tty. The attached shell script
"sparc-test.sh" does this by using Aboriginal Linux as the serial
console guest, and a pty controlled by a Python script and the
"pexpect" Python module as the slow tty. A "seq" command is sent
to the guest to generate 100,000 lines of output containing sequential
integers, and the output is checked for gaps. The script limits the
tty output rate by occasionally sleeping for 1/10 of a second.
This bug was originally reported against qemu-system-i386 as
bug #1335444, and has since been fixed in qemu-system-i386,
but remains in qemu-system-sparc as of today's git sources
(d00e6cddc220de
this separate bug for the sparc case because I was asked
to do so by Paolo Bonzini in #1335444.
The automated test infrastructure of the NetBSD project is based on
qemu, and runs some 100 CPU-hours per day of full system tests of
NetBSD-current on emulated i386, amd64, and sparc systems.
This is all still running on qemu 0.15 (!). The main obstacle to
upgrading to a current version of qemu is this three-year-old regression
which breaks the sparc tests by losing some of the serial console output.
It would be really nice if this could be fixed.