Go to file
Paolo Bonzini d185c094b4 qemu-char: eliminate busy waiting on can_read returning zero
The character backend refactoring introduced an undesirable busy wait.
The busy wait happens if can_read returns zero and there is data available
on the character device's file descriptor.  Then, the I/O watch will
fire continuously and, with TCG, the CPU thread will never run.

    1) Char backend asks front end if it can write
    2) Front end says no
    3) poll() finds the char backend's descriptor is available
    4) Goto (1)

What we really want is this (note that step 3 avoids the busy wait):

    1) Char backend asks front end if it can write
    2) Front end says no
    3) poll() goes on without char backend's descriptor
    4) Goto (1) until qemu_chr_accept_input() called

    5) Char backend asks front end if it can write
    6) Front end says yes
    7) poll() finds the char backend's descriptor is available
    8) Backend handler called

After this patch, the IOWatchPoll source and the watch source are
separated.  The IOWatchPoll is simply a hook that runs during the prepare
phase on each main loop iteration.  The hook adds/removes the actual
source depending on the return value from can_read.

A simple reproducer is

    qemu-system-i386 -serial mon:stdio

... followed by banging on the terminal as much as you can. :)  Without
this patch, emulation will hang.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-id: 1365177573-11817-1-git-send-email-pbonzini@redhat.com
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
2013-04-05 12:53:07 -05:00
audio audio: Replace non-portable asprintf in debug code by g_strdup_printf 2013-01-16 12:03:26 -06:00
backends qemu-char: Call fe_claim / fe_release when not using qdev chr properties 2013-04-04 19:21:25 -05:00
block qcow2: Fix L1 write error handling in qcow2_update_snapshot_refcount 2013-04-05 18:58:05 +02:00
bsd-user qemu-log: default to stderr for logging output 2013-02-26 13:31:47 -06:00
default-configs VMXNET3 device implementation 2013-03-25 11:13:10 +01:00
disas Add moxie disassembler 2013-03-23 14:25:41 +00:00
docs trace: Provide a detailed event control interface 2013-03-28 14:19:57 +01:00
fpu softfloat: Handle float_muladd_negate_c when product is zero 2013-01-26 13:22:09 +00:00
fsdev virtfs-proxy-helper: Fix unchecked strdup() by conv. to g_strdup() 2013-01-30 11:14:46 +01:00
gdb-xml gdb-xml: fix hacks in powerpc register numbering 2009-07-12 23:42:05 +02:00
hw Merge remote-tracking branch 'stefanha/trivial-patches' into staging 2013-04-05 12:52:48 -05:00
include Merge remote-tracking branch 'kwolf/for-anthony' into staging 2013-04-05 12:49:10 -05:00
ldscripts build: create ldscripts/ 2012-12-19 08:29:06 +01:00
libcacard libcacard: Fix unchecked strdup() by converting to g_strdup() 2013-01-30 11:14:46 +01:00
linux-headers linux-headers: Update to v3.9-rc2 2013-04-01 11:50:04 -06:00
linux-user linux-user: Don't omit comma for strace of rt_sigaction() 2013-04-05 14:40:54 +02:00
net qemu-char: Call fe_claim / fe_release when not using qdev chr properties 2013-04-04 19:21:25 -05:00
pc-bios ipxe: update binaries 2013-03-25 09:13:18 +01:00
pixman@97336fad32 qapi: move include files to include/qobject/ 2012-12-19 08:31:31 +01:00
po po: Update German translation 2013-04-04 00:28:37 +02:00
qapi qapi: Fix unchecked strdup() by converting to g_strdup() 2013-01-30 11:14:46 +01:00
qga Fix typos and misspellings 2013-03-22 13:25:07 +01:00
QMP virtio,pci,qom 2013-03-26 16:16:43 -05:00
qobject qstring: add qstring_get_length() 2013-04-05 08:42:29 -04:00
qom virtio,pci,qom 2013-03-26 16:16:43 -05:00
roms virtio,pci,qom 2013-03-26 16:16:43 -05:00
scripts trace: [stderr] Port to generic event information and new control interface 2013-03-28 14:19:57 +01:00
slirp oslib-posix: rename socket_set_nonblock() to qemu_set_nonblock() 2013-04-02 11:47:37 -04:00
stubs stubs: Add a vmstate_dummy struct for CONFIG_USER_ONLY 2013-03-12 10:35:54 +01:00
sysconfigs/target Eliminate cpus-x86_64.conf file 2012-09-21 15:12:58 +02:00
target-alpha cpu: Replace do_interrupt() by CPUClass::do_interrupt method 2013-03-12 10:35:55 +01:00
target-arm target-arm: Override do_interrupt for ARMv7-M profile 2013-03-12 10:35:55 +01:00
target-cris cpu: Replace do_interrupt() by CPUClass::do_interrupt method 2013-03-12 10:35:55 +01:00
target-i386 extract/unify the constant 0xfee00000 as APIC_DEFAULT_ADDRESS 2013-04-04 19:23:09 -05:00
target-lm32 target-lm32: use HELPER() macro 2013-03-18 19:40:34 +01:00
target-m68k cpu: Replace do_interrupt() by CPUClass::do_interrupt method 2013-03-12 10:35:55 +01:00
target-microblaze microblaze: Add support for the sleep insn 2013-04-02 10:47:29 +02:00
target-mips target-mips: fix rndrashift_short_acc and code for EXTR_ instructions 2013-03-17 01:06:34 +01:00
target-moxie target-moxie: set do_interrupt to a target-specific helper function 2013-03-31 18:26:31 +00:00
target-openrisc cpu: Replace do_interrupt() by CPUClass::do_interrupt method 2013-03-12 10:35:55 +01:00
target-ppc target-ppc: Use NARROW_MODE macro for tlbie 2013-03-22 15:28:54 +01:00
target-s390x target-s390: Fix SRNMT 2013-04-05 14:54:11 +02:00
target-sh4 cpu: Replace do_interrupt() by CPUClass::do_interrupt method 2013-03-12 10:35:55 +01:00
target-sparc cpu: Replace do_interrupt() by CPUClass::do_interrupt method 2013-03-12 10:35:55 +01:00
target-unicore32 cpu: Replace do_interrupt() by CPUClass::do_interrupt method 2013-03-12 10:35:55 +01:00
target-xtensa cpu: Replace do_interrupt() by CPUClass::do_interrupt method 2013-03-12 10:35:55 +01:00
tcg tcg/mips: Implement muls2_i32 2013-04-01 18:49:17 +02:00
tests test-visitor-serialization: Fix some memory leaks 2013-04-05 14:38:45 +02:00
tpm tpm: Fix several compiler warnings (redefined data types) 2013-04-03 15:06:03 -05:00
trace trace: rebuild generated-events.o when configuration changes 2013-03-28 14:19:57 +01:00
ui Merge remote-tracking branch 'luiz/queue/qmp' into staging 2013-04-02 14:07:35 -05:00
util Allow clock_gettime() monotonic clock to be utilized on more OS's 2013-04-04 20:22:45 -05:00
.exrc qemu: add .exrc 2012-09-07 09:02:44 +03:00
.gitignore .gitignore: rename trace/generated-tracers.dtrace 2013-03-28 14:19:57 +01:00
.gitmodules pixman: add submodule 2012-11-01 13:10:06 +01:00
.mailmap Add a .mailmap to map pre-git-conversion authors to friendly names 2011-12-12 17:06:21 -06:00
aio-posix.c aio: support G_IO_HUP and G_IO_ERR 2013-02-21 16:17:31 -06:00
aio-win32.c aio: Fix return value of aio_poll() 2013-01-17 10:51:42 +01:00
arch_init.c like acpi_table_install(), acpi_table_add() should propagate Errors 2013-04-04 19:23:08 -05:00
async.c aio: add a ThreadPool instance to AioContext 2013-03-15 16:07:50 +01:00
balloon.c softmmu: move include files to include/sysemu/ 2012-12-19 08:32:45 +01:00
block-migration.c migration: run setup callbacks out of big lock 2013-03-11 13:32:01 +01:00
block.c block: clean up I/O throttling wait_time code 2013-04-05 18:58:05 +02:00
blockdev-nbd.c softmmu: move include files to include/sysemu/ 2012-12-19 08:32:45 +01:00
blockdev.c block: keep I/O throttling slice time constant 2013-04-05 18:58:05 +02:00
blockjob.c misc: move include files to include/qemu/ 2012-12-19 08:32:39 +01:00
bt-host.c MinGW: Replace setsockopt by qemu_setsocketopt 2013-03-22 13:14:48 +01:00
bt-vhci.c softmmu: move remaining include files to include/ subdirectories 2012-12-19 08:32:46 +01:00
Changelog fix some common typos 2012-05-14 07:27:24 +02:00
cmd.c misc: move include files to include/qemu/ 2012-12-19 08:32:39 +01:00
cmd.h Delete useless 'extern' qualifiers for functions 2011-01-23 16:21:20 +00:00
CODING_STYLE Replace Qemu by QEMU in internal documentation 2012-04-07 13:58:25 +00:00
configure configure: remove unset variables 2013-04-02 14:05:15 -05:00
COPYING
COPYING.LIB
coroutine-gthread.c block: move include files to include/block/ 2012-12-19 08:31:31 +01:00
coroutine-sigaltstack.c Merge remote-tracking branch 'kwolf/for-anthony' into staging 2013-02-26 07:44:39 -06:00
coroutine-ucontext.c Merge remote-tracking branch 'kwolf/for-anthony' into staging 2013-02-26 07:44:39 -06:00
coroutine-win32.c block: move include files to include/block/ 2012-12-19 08:31:31 +01:00
cpu-exec.c target-i386: Don't modify env->eflags around cpu_dump_state 2013-03-23 14:30:12 +00:00
cpus.c cpu: Pass CPUState to cpu_interrupt() 2013-03-12 10:35:55 +01:00
cputlb.c cpu: Move current_tb field to CPUState 2013-02-16 14:51:00 +01:00
device_tree.c softmmu: move include files to include/sysemu/ 2012-12-19 08:32:45 +01:00
device-hotplug.c hw: move device-hotplug.o to toplevel, compile it once 2013-03-01 13:57:13 +01:00
disas.c Add moxie disassembler 2013-03-23 14:25:41 +00:00
dma-helpers.c softmmu: move include files to include/sysemu/ 2012-12-19 08:32:45 +01:00
dump-stub.c softmmu: move include files to include/sysemu/ 2012-12-19 08:32:45 +01:00
dump.c cpu: Move host_tid field to CPUState 2013-02-16 14:50:59 +01:00
exec.c exec: assert that RAMBlock size is non-zero 2013-03-26 21:02:17 +02:00
gdbstub.c qemu-char: Call fe_claim / fe_release when not using qdev chr properties 2013-04-04 19:21:25 -05:00
HACKING HACKING: List areas where we may rely on impdef C behaviour 2012-12-08 14:27:40 +00:00
hmp-commands.hx New QMP command query-cpu-max and HMP command cpu_max 2013-03-25 16:21:33 -04:00
hmp.c Merge remote-tracking branch 'quintela/migration.next' into staging 2013-03-26 13:38:00 -05:00
hmp.h New QMP command query-cpu-max and HMP command cpu_max 2013-03-25 16:21:33 -04:00
iohandler.c iohandler: switch to GPollFD 2013-02-21 16:17:31 -06:00
ioport.c exec: move include files to include/exec/ 2012-12-19 08:31:31 +01:00
kvm-all.c cpu: Pass CPUState to cpu_interrupt() 2013-03-12 10:35:55 +01:00
kvm-stub.c kvm: Pass CPUState to kvm_on_sigbus_vcpu() 2013-01-28 16:57:56 +01:00
LICENSE LICENSE: There is no libqemu.a anymore 2011-12-09 11:25:22 +00:00
main-loop.c main-loop: add qemu_get_aio_context() 2013-03-15 16:07:50 +01:00
MAINTAINERS Add top level changes for moxie 2013-03-23 14:25:42 +00:00
Makefile trace: Provide a generic tracing event descriptor 2013-03-28 14:19:57 +01:00
Makefile.objs Support for TPM command line options 2013-03-12 13:40:11 -05:00
Makefile.target build: always link device_tree.o into emulators if libfdt available 2013-03-01 15:01:19 +01:00
memory_mapping-stub.c softmmu: move include files to include/sysemu/ 2012-12-19 08:32:45 +01:00
memory_mapping.c exec: change RAM list to a TAILQ 2012-12-20 23:08:47 +01:00
memory.c memory: fix a bug of detection of memory region collision 2013-03-22 13:21:28 +01:00
migration-exec.c migration: eliminate s->migration_file 2013-03-11 13:32:03 +01:00
migration-fd.c migration: eliminate s->migration_file 2013-03-11 13:32:03 +01:00
migration-tcp.c migration: eliminate s->migration_file 2013-03-11 13:32:03 +01:00
migration-unix.c migration: eliminate s->migration_file 2013-03-11 13:32:03 +01:00
migration.c oslib-posix: rename socket_set_nonblock() to qemu_set_nonblock() 2013-04-02 11:47:37 -04:00
monitor.c hmp: human-monitor-command: stop using the Memory chardev driver 2013-04-05 08:42:29 -04:00
nbd.c oslib-posix: rename socket_set_nonblock() to qemu_set_nonblock() 2013-04-02 11:47:37 -04:00
os-posix.c softmmu: move include files to include/sysemu/ 2012-12-19 08:32:45 +01:00
os-win32.c softmmu: move include files to include/sysemu/ 2012-12-19 08:32:45 +01:00
page_cache.c page_cache: dup memory on insert 2013-03-11 13:32:03 +01:00
qapi-schema-test.json qapi: add struct-errors test case to test-qmp-output-visitor 2012-03-27 09:11:00 -03:00
qapi-schema.json qapi schema: add AcpiTableOptions 2013-04-04 19:23:08 -05:00
qdev-monitor.c hw: move qdev-monitor.o to toplevel directory 2013-03-01 13:54:10 +01:00
qdict-test-data.txt Introduce QDict test data file 2009-09-04 09:37:34 -05:00
qemu-bridge-helper.c qemu-bridge-helper: force usage of a very high MAC address for the bridge 2013-03-28 12:58:52 -05:00
qemu-char.c qemu-char: eliminate busy waiting on can_read returning zero 2013-04-05 12:53:07 -05:00
qemu-coroutine-io.c misc: move include files to include/qemu/ 2012-12-19 08:32:39 +01:00
qemu-coroutine-lock.c coroutine: use AioContext for CoQueue BH 2013-03-15 16:07:51 +01:00
qemu-coroutine-sleep.c misc: move include files to include/qemu/ 2012-12-19 08:32:39 +01:00
qemu-coroutine.c coroutine: move pooling to common code 2013-02-22 21:21:10 +01:00
qemu-doc.texi sheepdog: add support for connecting to unix domain socket 2013-03-04 09:54:17 +01:00
qemu-img-cmds.hx qemu-img: Add compare subcommand 2013-02-22 21:21:10 +01:00
qemu-img.c block: Add options QDict to bdrv_open() prototype 2013-03-15 16:07:49 +01:00
qemu-img.texi qemu-img: Add compare subcommand 2013-02-22 21:21:10 +01:00
qemu-io.c block: Add options QDict to bdrv_file_open() prototypes 2013-03-22 17:51:31 +01:00
qemu-log.c qemu-log: default to stderr for logging output 2013-02-26 13:31:47 -06:00
qemu-nbd.c block: Add options QDict to bdrv_open() prototype 2013-03-15 16:07:49 +01:00
qemu-nbd.texi qemu-nbd: add --discard option 2013-02-22 21:29:43 +01:00
qemu-options-wrapper.h vl.c: In qemu -h output, only print options for the arch we are running as 2011-12-19 10:27:33 -06:00
qemu-options.h vl.c: Move option generation logic into a wrapper file 2011-12-19 10:27:33 -06:00
qemu-options.hx help: add docs for missing 'queues' option of tap 2013-04-03 15:09:07 -05:00
qemu-seccomp.c softmmu: move include files to include/sysemu/ 2012-12-19 08:32:45 +01:00
qemu-tech.texi qemu-tech.texi: update implemented xtensa features list 2012-11-29 13:00:52 -06:00
qemu-timer.c softmmu: move include files to include/sysemu/ 2012-12-19 08:32:45 +01:00
qemu.sasl Add SASL authentication support ("Daniel P. Berrange") 2009-03-06 20:27:28 +00:00
qmp-commands.hx Merge remote-tracking branch 'quintela/migration.next' into staging 2013-03-26 13:38:00 -05:00
qmp.c softmmu: move remaining include files to include/ subdirectories 2012-12-19 08:32:46 +01:00
qtest.c qtest: use synchronous I/O for char device 2013-03-26 10:08:12 -05:00
readline.c readline: Fix unchecked strdup() by converting to g_strdup() 2013-01-30 11:14:46 +01:00
README Update README 2011-12-11 17:50:43 -06:00
rules.mak rules/mak: make clean should blow away timestamp files 2013-01-30 01:31:08 +02:00
savevm.c oslib-posix: rename socket_set_nonblock() to qemu_set_nonblock() 2013-04-02 11:47:37 -04:00
spice-qemu-char.c spice-qemu-char: Drop hackish vmc_register on spice_chr_write 2013-03-27 10:26:50 -05:00
tcg-runtime.c tcg: Implement multiword multiply helpers 2013-02-23 17:25:28 +00:00
tci.c exec: move include files to include/exec/ 2012-12-19 08:31:31 +01:00
thread-pool.c threadpool: drop global thread pool 2013-03-15 16:07:51 +01:00
thunk.c exec: move include files to include/exec/ 2012-12-19 08:31:31 +01:00
trace-events Merge remote-tracking branch 'stefanha/block' into staging 2013-03-28 12:57:37 -05:00
translate-all.c tcg: Fix occasional TCG broken problem when ldst optimization enabled 2013-03-22 21:38:21 +01:00
translate-all.h cputlb: Pass CPUState to cpu_unlink_tb() 2013-02-16 14:51:00 +01:00
user-exec.c Replace all setjmp()/longjmp() with sigsetjmp()/siglongjmp() 2013-02-23 16:11:19 +00:00
VERSION Open up 1.5 development tree 2013-02-15 17:40:56 -06:00
version.rc mingw: add version information to the executables 2010-09-26 16:07:57 +00:00
vl.c acpi_table_add(): accept QemuOpts and parse it with OptsVisitor 2013-04-04 19:23:08 -05:00
xbzrle.c Move XBZRLE encoding code to a separate file to allow testing 2013-02-01 08:32:20 +01:00
xen-all.c cpu: Move halted and interrupt_request fields to CPUState 2013-03-12 10:35:55 +01:00
xen-mapcache.c xen-mapcache: pass the right size argument to test_bits 2013-04-03 11:51:53 +00:00
xen-stub.c exec: move include files to include/exec/ 2012-12-19 08:31:31 +01:00

Read the documentation in qemu-doc.html or on http://wiki.qemu.org

- QEMU team