From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 11/19] use a bottom half to run timers
Date: Mon, 21 Dec 2009 09:09:22 +0100 [thread overview]
Message-ID: <1261382970-23251-12-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1261382970-23251-1-git-send-email-pbonzini@redhat.com>
Make the timer subsystem register its own bottom half instead of
placing the bottom half code in the heart of the main loop. To
test if an alarm timer is pending, just check if the bottom half is
scheduled.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
vl.c | 68 ++++++++++++++++++++++++++++++++++++-----------------------------
1 files changed, 38 insertions(+), 30 deletions(-)
diff --git a/vl.c b/vl.c
index 78807f5..289aadc 100644
--- a/vl.c
+++ b/vl.c
@@ -573,10 +573,17 @@ struct qemu_alarm_timer {
void (*rearm)(struct qemu_alarm_timer *t);
void *priv;
+ QEMUBH *bh;
char expired;
- char pending;
};
+static struct qemu_alarm_timer *alarm_timer;
+
+static inline int qemu_alarm_pending(void)
+{
+ return qemu_bh_scheduled(alarm_timer->bh);
+}
+
static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
{
return !!t->rearm;
@@ -593,8 +600,6 @@ static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
/* TODO: MIN_TIMER_REARM_US should be optimized */
#define MIN_TIMER_REARM_US 250
-static struct qemu_alarm_timer *alarm_timer;
-
#ifdef _WIN32
struct qemu_alarm_win32 {
@@ -874,7 +879,7 @@ void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
/* Rearm if necessary */
if (pt == &active_timers[ts->clock->type]) {
- if (!alarm_timer->pending) {
+ if (!qemu_alarm_pending()) {
qemu_rearm_alarm_timer(alarm_timer);
}
/* Interrupt execution to force deadline recalculation. */
@@ -1001,6 +1006,31 @@ static const VMStateDescription vmstate_timers = {
static void qemu_event_increment(void);
+static void qemu_timer_bh(void *opaque)
+{
+ struct qemu_alarm_timer *t = opaque;
+
+ /* rearm timer, if not periodic */
+ if (t->expired) {
+ t->expired = 0;
+ qemu_rearm_alarm_timer(t);
+ }
+
+ /* vm time timers */
+ if (vm_running) {
+ if (!cur_cpu || likely(!(cur_cpu->singlestep_enabled & SSTEP_NOTIMER)))
+ qemu_run_timers(&active_timers[QEMU_CLOCK_VIRTUAL],
+ qemu_get_clock(vm_clock));
+ }
+
+ /* real time timers */
+ qemu_run_timers(&active_timers[QEMU_CLOCK_REALTIME],
+ qemu_get_clock(rt_clock));
+
+ qemu_run_timers(&active_timers[QEMU_CLOCK_HOST],
+ qemu_get_clock(host_clock));
+}
+
#ifdef _WIN32
static void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
DWORD_PTR dwUser, DWORD_PTR dw1,
@@ -1059,8 +1089,7 @@ static void host_alarm_handler(int host_signum)
cpu_exit(next_cpu);
}
#endif
- t->pending = 1;
- qemu_notify_event();
+ qemu_bh_schedule(t->bh);
}
}
@@ -1446,7 +1475,8 @@ static int init_timer_alarm(void)
}
/* first event is at time 0 */
- t->pending = 1;
+ t->bh = qemu_bh_new(qemu_timer_bh, t);
+ qemu_bh_schedule(t->bh);
alarm_timer = t;
qemu_add_vm_change_state_handler(alarm_timer_on_change_state_rearm, t);
@@ -3811,28 +3841,6 @@ void main_loop_wait(int timeout)
slirp_select_poll(&rfds, &wfds, &xfds, (ret < 0));
- /* rearm timer, if not periodic */
- if (alarm_timer->expired) {
- alarm_timer->expired = 0;
- qemu_rearm_alarm_timer(alarm_timer);
- }
-
- alarm_timer->pending = 0;
-
- /* vm time timers */
- if (vm_running) {
- if (!cur_cpu || likely(!(cur_cpu->singlestep_enabled & SSTEP_NOTIMER)))
- qemu_run_timers(&active_timers[QEMU_CLOCK_VIRTUAL],
- qemu_get_clock(vm_clock));
- }
-
- /* real time timers */
- qemu_run_timers(&active_timers[QEMU_CLOCK_REALTIME],
- qemu_get_clock(rt_clock));
-
- qemu_run_timers(&active_timers[QEMU_CLOCK_HOST],
- qemu_get_clock(host_clock));
-
/* Check bottom-halves last in case any of the earlier events triggered
them. */
qemu_bh_poll();
@@ -3888,7 +3896,7 @@ static void tcg_cpu_exec(void)
if (!vm_running)
break;
- if (alarm_timer->pending)
+ if (qemu_alarm_pending())
break;
if (cpu_can_run(env))
ret = qemu_cpu_exec(env);
--
1.6.5.2
next prev parent reply other threads:[~2009-12-21 8:09 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-21 8:09 [Qemu-devel] [PATCH 00/19][RFC] Cleanups + split timer handling out of vl.o Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 01/19] centralize handling of -icount Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 02/19] add qemu_icount_round Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 03/19] avoid dubiously clever code in win32_start_timer Paolo Bonzini
2010-01-04 19:34 ` Anthony Liguori
2010-01-04 18:39 ` Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 04/19] fix error in win32_rearm_timer Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 05/19] only one flag is needed for alarm_timer Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 06/19] more alarm timer cleanup Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 07/19] add qemu_get_clock_ns Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 08/19] move kbd/mouse events to event.c Paolo Bonzini
2010-01-04 20:19 ` Anthony Liguori
2009-12-21 8:09 ` [Qemu-devel] [PATCH 09/19] remove qemu_rearm_alarm_timer from main loop Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 10/19] add qemu_bh_scheduled Paolo Bonzini
2009-12-21 8:09 ` Paolo Bonzini [this message]
2010-01-04 20:24 ` [Qemu-devel] [PATCH 11/19] use a bottom half to run timers Anthony Liguori
2010-01-04 19:38 ` Jamie Lokier
2010-01-05 8:38 ` Paolo Bonzini
2010-01-04 20:01 ` [Qemu-devel] " Michael S. Tsirkin
2010-01-04 23:54 ` Anthony Liguori
2010-01-05 12:07 ` Michael S. Tsirkin
2010-01-05 15:23 ` malc
2010-01-05 15:23 ` Michael S. Tsirkin
2010-01-05 15:32 ` malc
2010-01-05 15:33 ` Michael S. Tsirkin
2010-01-05 15:39 ` malc
2010-01-04 20:01 ` Paolo Bonzini
2010-01-04 23:59 ` Anthony Liguori
2010-01-05 12:48 ` Paolo Bonzini
2010-01-05 13:06 ` Anthony Liguori
2010-01-06 1:20 ` Jamie Lokier
2009-12-21 8:09 ` [Qemu-devel] [PATCH 12/19] new function qemu_icount_delta Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 13/19] move tcg_has_work to cpu-exec.c and rename it Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 14/19] disentangle tcg and deadline calculation Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 15/19] do not provide qemu_event_increment if iothread not used Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 16/19] tweak qemu_notify_event Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 17/19] move vmstate registration of vmstate_timers earlier Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 18/19] introduce qemu_clock_enable Paolo Bonzini
2009-12-21 8:09 ` [Qemu-devel] [PATCH 19/19] split out qemu-timer.c Paolo Bonzini
2010-01-04 20:26 ` Anthony Liguori
2010-01-04 19:26 ` [Qemu-devel] [PATCH 00/19][RFC] Cleanups + split timer handling out of vl.o Anthony Liguori
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=1261382970-23251-12-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).