Patchwork Main loop

login
register
mail settings
Submitter malc
Date Sept. 28, 2009, 11:57 p.m.
Message ID <Pine.LNX.4.64.0909290353020.11081@linmac.oyster.ru>
Download mbox | patch
Permalink /patch/34407/
State Superseded
Headers show

Comments

malc - Sept. 28, 2009, 11:57 p.m.
On Mon, 28 Sep 2009, Glauber Costa wrote:

> > > Glauber spent some time with the IO thread recently.  Any reason you didn't
> > > start with the existing IO thread (besides the fact that it doesn't work with
> > > TCG)?
> > > 
> > 
> > Because i wasn't writing a replacement for IO Thread to begin with (btw it
> > does work with TCG), what it doesn't do is play nicely with icount[1], 
> > work on Windows, and for mysterious reasons still requires alarm timers, 
> > it also deadlocks for me when killing QEMU windows while running smp 
> > guest, but that's easily corrected mistake somewhere i guess.
> 

[..snip..]

> 
> Note that I don't think it requires alarm timers at all, by design. So, 
> again, why should we drop what we have in favour of your implementation?

It doesn't require them, yet no one has come up even with the
following crude patch which brings the time of booting debian netinst
closer to mtloop. That said the real reason why iothread should be
dropped is that it's basically a big pile of shit, not only alarm
timers weren't dropped the code uses pthread_cond_timedwait all over
the place for NO good reason without ever checking the result thus
wasting time, 2 seconds of the boot time were chopped of just by
replacing it with palin wait, with such an attention to detail i
wonder what other monsters are lurking there.

 struct qemu_alarm_win32 {
@@ -816,6 +824,9 @@ static void init_icount_adjust(void)
 }
 
 static struct qemu_alarm_timer alarm_timers[] = {
+#ifdef CONFIG_IOTHREAD
+    {"notimer", 0, notimer_start_timer, notimer_stop_timer, NULL, NULL},
+#endif
 #ifndef _WIN32
 #ifdef __linux__
     {"dynticks", ALARM_FLAG_DYNTICKS, dynticks_start_timer,
@@ -1167,7 +1178,7 @@ static int64_t qemu_next_deadline(void)
     return delta;
 }
 
-#if defined(__linux__) || defined(_WIN32)
+#if defined(__linux__) || defined(_WIN32) || defined(CONFIG_IOTHREAD)
 static uint64_t qemu_next_deadline_dyntick(void)
 {
     int64_t delta;
@@ -4199,7 +4210,11 @@ static int qemu_calculate_timeout(void)
 
     return timeout;
 #else /* CONFIG_IOTHREAD */
-    return 1000;
+    if (alarm_timer->start == notimer_start_timer) {
+        return qemu_next_deadline_dyntick() / 1000;
+    } else {
+        return 1000;
+    }
 #endif
 }

Patch

diff --git a/vl.c b/vl.c
index c6c6a6b..fb04b25 100644
--- a/vl.c
+++ b/vl.c
@@ -718,6 +718,14 @@  static void qemu_rearm_alarm_timer(struct 
qemu_alarm_timer *t)
 
 static struct qemu_alarm_timer *alarm_timer;
 
+static int notimer_start_timer(struct qemu_alarm_timer *t)
+{
+    return 0;
+}
+static void notimer_stop_timer(struct qemu_alarm_timer *t)
+{
+}
+
 #ifdef _WIN32