When the IO thread calls monitor_flush() repeatedly & quickly in
succession, outside of callback context, many redundant G_IO_OUT watches
are installed. (One such caller is the "info tlb" / tlb_info() HMP
command which produces a lot of monitor output.)

While this redundancy is no problem in itself, it can trigger -1/EINVAL
in poll() by growing "gpollfds" beyond limits. This is a persistent
condition, causing qemu to spin in the main loop.

Patch #2 corrects this.

My first stab at a fix was patch #1. Although in retrospect probably
unrelated to the main problem, I'm including it because it should
qualify as an improvement / cleanup in its own right.

See <https://bugzilla.redhat.com/show_bug.cgi?id=970047> for more
details.

Laszlo Ersek (2):
  char: io_channel_send: don't lose written bytes
  monitor: maintain at most one G_IO_OUT watch

 monitor.c   |   11 +++++++++--
 qemu-char.c |   41 +++++++++++++++++++----------------------
 2 files changed, 28 insertions(+), 24 deletions(-)


Reply via email to