Qemu locks up when incoming serial fills up
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
QEMU |
Expired
|
Undecided
|
Unassigned |
Bug Description
I'm using Windows, I'm not sure if this happens on Linux, but for all I know it does. To repro, fire up any image (ideally one that does almost nothing, and doesn't read the serial port), and use the option "-serial pipe:mypipe". Then use Putty or something else to connect to that named pipe so Qemu starts up. Now start typing into Putty. For a VM image that never reads the serial port, upon typing the 16th character Qemu stops executing instructions in the guest (as evidenced either by being unable to step in gdb, seeing that "info registers" in the monitor always reports the same value, or just by observing that the guest is hung). For OS images that do regularly read the serial port, this may require pasting >16 bytes into Putty at once. This occurs with more than just Putty, use anything that can write at a named pipe.
I would have expected that bytes get dropped, or even more ideally blocked at the sender's side of the named pipe. I would not expect that the entire VM stops. You seem to be able to unwedge the VM by switching to the monitor and running "i /1c 0x3f8" until you've pulled enough out of buffer that it's happy to run again. Interestingly, all bytes seem to come through (more than just the 16) when read from the monitor.
I haven't been able to get a source environment set up, but I have tried a few of the Windows binaries. This repros in 1.4.1, 1.3.0, 1.2, and 1.0, the most recent build I found that did not have this behavior was 0.15.0.
Maybe I'm missing something very obvious, and if so, I apologize in advance. I'm also happy to create an OS image that highlights this problem if it would help.
Some food for thought: main_loop_ wait quickly calls "unlock IO thread", poll, "lock IO thread". be_can_ write, which I think calls serial_ can_receive1, which might say sorry, no space.
* os_host_
* win_chr_pipe_poll calls PeekNamedPipe, which would report data available, satisfying the poll.
* win_chr_read_poll calls qemu_chr_
* win_chr_read would then bail as s->max_size is zero, skipping the call to ReadFile.
So perhaps the poll was satisfied, but no data was ever read from that pipe, putting it in a tight loop? The non-Windows version of os_host_ main_loop_ wait has some sort of MAX_MAIN_LOOP_SPIN valve in which the comment suggests the VCPU threads could starve. Could this be happening in the Windows version as well?