[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 14/19] disentangle tcg and deadline calculation
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 14/19] disentangle tcg and deadline calculation |
Date: |
Mon, 21 Dec 2009 09:09:25 +0100 |
Just tell main_loop_wait whether to be blocking or nonblocking, so that
there is no need to call qemu_cpus_have_work from the timer subsystem.
Instead, tcg_cpu_exec can say "we want the main loop not to block because
we have stuff to do".
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/xenfb.c | 6 ++++--
sysemu.h | 2 +-
vl.c | 25 ++++++++++++++++---------
3 files changed, 21 insertions(+), 12 deletions(-)
diff --git a/hw/xenfb.c b/hw/xenfb.c
index 795a326..422cd53 100644
--- a/hw/xenfb.c
+++ b/hw/xenfb.c
@@ -983,12 +983,14 @@ void xen_init_display(int domid)
wait_more:
i++;
- main_loop_wait(10); /* miliseconds */
+ main_loop_wait(true);
xfb = xen_be_find_xendev("vfb", domid, 0);
xin = xen_be_find_xendev("vkbd", domid, 0);
if (!xfb || !xin) {
- if (i < 256)
+ if (i < 256) {
+ usleep(10000);
goto wait_more;
+ }
xen_be_printf(NULL, 1, "displaystate setup failed\n");
return;
}
diff --git a/sysemu.h b/sysemu.h
index 9d80bb2..1384ef9 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -60,7 +60,7 @@ void do_info_snapshots(Monitor *mon);
void qemu_announce_self(void);
-void main_loop_wait(int timeout);
+void main_loop_wait(bool nonblocking);
int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int blk_enable,
int shared);
diff --git a/vl.c b/vl.c
index 9bf9806..f7472db 100644
--- a/vl.c
+++ b/vl.c
@@ -592,6 +592,7 @@ struct qemu_alarm_timer {
};
static struct qemu_alarm_timer *alarm_timer;
+static int qemu_calculate_timeout(void);
static inline int qemu_alarm_pending(void)
{
@@ -3507,7 +3508,7 @@ static void *kvm_cpu_thread_fn(void *arg)
return NULL;
}
-static void tcg_cpu_exec(void);
+static bool tcg_cpu_exec(void);
static void *tcg_cpu_thread_fn(void *arg)
{
@@ -3786,14 +3787,20 @@ static void host_main_loop_wait(int *timeout)
}
#endif
-void main_loop_wait(int timeout)
+void main_loop_wait(bool nonblocking)
{
IOHandlerRecord *ioh;
fd_set rfds, wfds, xfds;
int ret, nfds;
struct timeval tv;
+ int timeout;
- qemu_bh_update_timeout(&timeout);
+ if (nonblocking)
+ timeout = 0;
+ else {
+ timeout = qemu_calculate_timeout();
+ qemu_bh_update_timeout(&timeout);
+ }
host_main_loop_wait(&timeout);
@@ -3898,7 +3905,7 @@ static int qemu_cpu_exec(CPUState *env)
return ret;
}
-static void tcg_cpu_exec(void)
+static bool tcg_cpu_exec(void)
{
int ret = 0;
@@ -3908,7 +3915,7 @@ static void tcg_cpu_exec(void)
CPUState *env = cur_cpu = next_cpu;
if (!vm_running)
- break;
+ return false;
if (qemu_alarm_pending())
break;
if (cpu_can_run(env))
@@ -3919,6 +3926,7 @@ static void tcg_cpu_exec(void)
break;
}
}
+ return qemu_cpus_have_work();
}
static int qemu_calculate_timeout(void)
@@ -3928,8 +3936,6 @@ static int qemu_calculate_timeout(void)
if (!vm_running)
timeout = 5000;
- else if (qemu_cpus_have_work())
- timeout = 0;
else {
/* XXX: use timeout computed from timers */
int64_t add;
@@ -3989,16 +3995,17 @@ static void main_loop(void)
for (;;) {
do {
+ bool nonblocking = false;
#ifdef CONFIG_PROFILER
int64_t ti;
#endif
#ifndef CONFIG_IOTHREAD
- tcg_cpu_exec();
+ nonblocking = tcg_cpu_exec();
#endif
#ifdef CONFIG_PROFILER
ti = profile_getclock();
#endif
- main_loop_wait(qemu_calculate_timeout());
+ main_loop_wait(nonblocking);
#ifdef CONFIG_PROFILER
dev_time += profile_getclock() - ti;
#endif
--
1.6.5.2
- Re: [Qemu-devel] [PATCH 11/19] use a bottom half to run timers, (continued)
[Qemu-devel] [PATCH 10/19] add qemu_bh_scheduled, Paolo Bonzini, 2009/12/21
[Qemu-devel] [PATCH 06/19] more alarm timer cleanup, Paolo Bonzini, 2009/12/21
[Qemu-devel] [PATCH 16/19] tweak qemu_notify_event, Paolo Bonzini, 2009/12/21
[Qemu-devel] [PATCH 13/19] move tcg_has_work to cpu-exec.c and rename it, Paolo Bonzini, 2009/12/21
[Qemu-devel] [PATCH 12/19] new function qemu_icount_delta, Paolo Bonzini, 2009/12/21
[Qemu-devel] [PATCH 15/19] do not provide qemu_event_increment if iothread not used, Paolo Bonzini, 2009/12/21
[Qemu-devel] [PATCH 14/19] disentangle tcg and deadline calculation,
Paolo Bonzini <=
[Qemu-devel] [PATCH 18/19] introduce qemu_clock_enable, Paolo Bonzini, 2009/12/21
[Qemu-devel] [PATCH 17/19] move vmstate registration of vmstate_timers earlier, Paolo Bonzini, 2009/12/21
[Qemu-devel] [PATCH 19/19] split out qemu-timer.c, Paolo Bonzini, 2009/12/21