From: Paolo Bonzini <pbonzini@redhat.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH 11/19] use a bottom half to run timers
Date: Mon, 04 Jan 2010 21:01:32 +0100 [thread overview]
Message-ID: <4B42491C.1050709@redhat.com> (raw)
In-Reply-To: <4B424E95.4040806@codemonkey.ws>
On 01/04/2010 09:24 PM, Anthony Liguori wrote:
>
> I'm not a huge fan of this for a couple reasons. The first is that
> it introduces a subtle semantic change. Previously, timers always
> ran before bottom halves whereas after this change, timers may run
> after some bottoms halves but before others.
I see what you mean, and you are right: qemu_bh_new adds a
bottom half at the beginning of the queue, so it's pretty much
guaranteed that a ptimer's bottom half will run _before_ the alarm timer's.
There are three possible fixes:
1) make async.c use a tail queue. Fixes the bug, but it is too clever IMHO.
2) in tcg_exec, where there is
if (timer_alarm_pending) {
timer_alarm_pending = 0;
break;
}
instead check if any bottom half is scheduled. With this change, after
the timers run, if the ptimer's bottom half hadn't run TCG would not
execute code, qemu_bh_calculate_timeout would make main_loop_wait
nonblocking, and the ptimer's bottom half would execute right away.
BTW after my series the above check will test whether the timer bottom
half is scheduled, so in some sense this could be considered a bugfix
that would be placed _very early_ in the series or could even go in
independently.
3) Both of the above. 2 would provide the fix and 1 would provide a
performance improvement by avoiding the useless looping.
> But more importantly, I think timer dispatch needs to be part of the
> select loop. malc has a git tree that replaces host alarm timers
> with select() timeouts. This has a lot of really nice properties
> like it eliminates the need for signals and EINTR handling. A move
> like this would likely make this more difficult.
Not necessarily, or at least, splitting qemu-timer.c may make it
marginally more difficult but not having a bottom half for timers.
With qemu-timer.c split you'd need something like
if (rc == 0) host_alarm_handler ();
after the select loop. I suppose you could basically revert this patch
and move timer handling into host_alarm_handler, but the code should
work independent of this patch. This patch (modulo your other
objection) just adds a level of indirection but doesn't change the
overall structure of the main loop.
Paolo
next prev parent reply other threads:[~2010-01-05 19:58 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 ` [Qemu-devel] [PATCH 11/19] use a bottom half to run timers Paolo Bonzini
2010-01-04 20:24 ` 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 [this message]
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=4B42491C.1050709@redhat.com \
--to=pbonzini@redhat.com \
--cc=anthony@codemonkey.ws \
--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).