diff options
Diffstat (limited to 'vl.c')
-rw-r--r-- | vl.c | 32 |
1 files changed, 21 insertions, 11 deletions
@@ -1321,7 +1321,7 @@ void qemu_system_vmstop_request(int reason) qemu_notify_event(); } -void main_loop_wait(int nonblocking) +int main_loop_wait(int nonblocking) { fd_set rfds, wfds, xfds; int ret, nfds; @@ -1349,9 +1349,15 @@ void main_loop_wait(int nonblocking) qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds); slirp_select_fill(&nfds, &rfds, &wfds, &xfds); - qemu_mutex_unlock_iothread(); + if (timeout > 0) { + qemu_mutex_unlock_iothread(); + } + ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv); - qemu_mutex_lock_iothread(); + + if (timeout > 0) { + qemu_mutex_lock_iothread(); + } qemu_iohandler_poll(&rfds, &wfds, &xfds, ret); slirp_select_poll(&rfds, &wfds, &xfds, (ret < 0)); @@ -1362,6 +1368,7 @@ void main_loop_wait(int nonblocking) them. */ qemu_bh_poll(); + return ret; } #ifndef CONFIG_IOTHREAD @@ -1379,7 +1386,8 @@ qemu_irq qemu_system_powerdown; static void main_loop(void) { - bool nonblocking = false; + bool nonblocking; + int last_io __attribute__ ((unused)) = 0; #ifdef CONFIG_PROFILER int64_t ti; #endif @@ -1388,7 +1396,9 @@ static void main_loop(void) qemu_main_loop_start(); for (;;) { -#ifndef CONFIG_IOTHREAD +#ifdef CONFIG_IOTHREAD + nonblocking = !kvm_enabled() && last_io > 0; +#else nonblocking = cpu_exec_all(); if (vm_request_pending()) { nonblocking = true; @@ -1397,7 +1407,7 @@ static void main_loop(void) #ifdef CONFIG_PROFILER ti = profile_getclock(); #endif - main_loop_wait(nonblocking); + last_io = main_loop_wait(nonblocking); #ifdef CONFIG_PROFILER dev_time += profile_getclock() - ti; #endif @@ -1689,7 +1699,7 @@ static int chardev_init_func(QemuOpts *opts, void *opaque) { CharDriverState *chr; - chr = qemu_chr_open_opts(opts, NULL); + chr = qemu_chr_new_from_opts(opts, NULL); if (!chr) return -1; return 0; @@ -1828,7 +1838,7 @@ static int serial_parse(const char *devname) exit(1); } snprintf(label, sizeof(label), "serial%d", index); - serial_hds[index] = qemu_chr_open(label, devname, NULL); + serial_hds[index] = qemu_chr_new(label, devname, NULL); if (!serial_hds[index]) { fprintf(stderr, "qemu: could not open serial device '%s': %s\n", devname, strerror(errno)); @@ -1850,7 +1860,7 @@ static int parallel_parse(const char *devname) exit(1); } snprintf(label, sizeof(label), "parallel%d", index); - parallel_hds[index] = qemu_chr_open(label, devname, NULL); + parallel_hds[index] = qemu_chr_new(label, devname, NULL); if (!parallel_hds[index]) { fprintf(stderr, "qemu: could not open parallel device '%s': %s\n", devname, strerror(errno)); @@ -1881,7 +1891,7 @@ static int virtcon_parse(const char *devname) qemu_opt_set(dev_opts, "driver", "virtconsole"); snprintf(label, sizeof(label), "virtcon%d", index); - virtcon_hds[index] = qemu_chr_open(label, devname, NULL); + virtcon_hds[index] = qemu_chr_new(label, devname, NULL); if (!virtcon_hds[index]) { fprintf(stderr, "qemu: could not open virtio console '%s': %s\n", devname, strerror(errno)); @@ -1897,7 +1907,7 @@ static int debugcon_parse(const char *devname) { QemuOpts *opts; - if (!qemu_chr_open("debugcon", devname, NULL)) { + if (!qemu_chr_new("debugcon", devname, NULL)) { exit(1); } opts = qemu_opts_create(qemu_find_opts("device"), "debugcon", 1); |