qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 17/18] disentangle tcg and deadline calculation
Date: Wed, 10 Mar 2010 11:38:54 +0100	[thread overview]
Message-ID: <1268217535-26554-18-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1268217535-26554-1-git-send-email-pbonzini@redhat.com>

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 <pbonzini@redhat.com>
---
 hw/xenfb.c |    6 ++++--
 sysemu.h   |    2 +-
 vl.c       |   23 +++++++++++++++--------
 3 files changed, 20 insertions(+), 11 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 afa11b5..f84413f 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -64,7 +64,7 @@ void cpu_synchronize_all_post_init(void);
 
 void qemu_announce_self(void);
 
-void main_loop_wait(int timeout);
+void main_loop_wait(int nonblocking);
 
 int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int blk_enable,
                             int shared);
diff --git a/vl.c b/vl.c
index d97da4d..34d39c0 100644
--- a/vl.c
+++ b/vl.c
@@ -618,6 +618,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)
 {
@@ -3597,7 +3598,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)
 {
@@ -3915,14 +3916,20 @@ static void host_main_loop_wait(int *timeout)
 }
 #endif
 
-void main_loop_wait(int timeout)
+void main_loop_wait(int 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);
 
@@ -4029,7 +4036,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;
 
@@ -4054,6 +4061,7 @@ static void tcg_cpu_exec(void)
             break;
         }
     }
+    return tcg_has_work();
 }
 
 static int qemu_calculate_timeout(void)
@@ -4063,8 +4071,6 @@ static int qemu_calculate_timeout(void)
 
     if (!vm_running)
         timeout = 5000;
-    else if (tcg_has_work())
-        timeout = 0;
     else {
      /* XXX: use timeout computed from timers */
         int64_t add;
@@ -4124,16 +4130,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.6

  parent reply	other threads:[~2010-03-10 10:39 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-10 10:38 [Qemu-devel] [PATCH 00/18] extract qemu-timer.c Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 01/18] avoid dubiously clever code in win32_start_timer Paolo Bonzini
2010-03-17 16:58   ` Anthony Liguori
2010-03-10 10:38 ` [Qemu-devel] [PATCH 02/18] fix error in win32_rearm_timer Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 03/18] only one flag is needed for alarm_timer Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 04/18] more alarm timer cleanup Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 05/18] do not use qemu_event_increment outside qemu_notify_event Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 06/18] tweak qemu_notify_event Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 07/18] remove qemu_rearm_alarm_timer from main loop Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 08/18] extract timer handling out of main_loop_wait Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 09/18] change qemu_run_timers interface Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 10/18] introduce and use qemu_clock_enable Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 11/18] centralize handling of -icount Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 12/18] add qemu_icount_round Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 13/18] add qemu_alarm_pending Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 14/18] new function qemu_icount_delta Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 15/18] move vmstate registration of vmstate_timers earlier Paolo Bonzini
2010-03-10 10:38 ` [Qemu-devel] [PATCH 16/18] place together more #ifdef CONFIG_IOTHREAD blocks Paolo Bonzini
2010-03-10 10:38 ` Paolo Bonzini [this message]
2010-03-10 10:38 ` [Qemu-devel] [PATCH 18/18] split out qemu-timer.c Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1268217535-26554-18-git-send-email-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).