* [Qemu-devel] [PATCH] Small change to remove short 250us timeouts every other time through the wait loop.
@ 2012-03-22 14:59 Peter Portante
2012-03-27 12:34 ` Avi Kivity
0 siblings, 1 reply; 3+ messages in thread
From: Peter Portante @ 2012-03-22 14:59 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Portante
Basically, the main wait loop calls qemu_run_all_timers() unconditionally. The
first thing this routine used to do is to see if a timer had been serviced,
and then reset the loop timeout to the next deadline.
However, the new deadlines had not been calculated at that point, as
qemu_run_timers() had not been called yet for each of the clocks. So
qemu_rearm_alarm_timer() would end up with a negative or zero deadline, and
default to setting a 250us timeout for the loop.
As qemu_run_timers() is called for each clock, the real deadlines would be put
in place, but because a loop timeout was already set, the loop timeout would
not be changed.
Once that 250us timeout fired, the real deadline would be used for the
subsequent timeout.
For idle VMs, this effectively doubles the number of times through the loop,
doubling the number of select() system calls, timer calls, etc. putting added
scheduling pressure on the kernel. And under cgroups, this really causes a big
problem because the cgroup code does not scale well.
By simply running the timers before trying to rearm the timer, we always rearm
with a non-zero deadline, effectively halving the number of system calls.
Signed-off-by: Peter Portante <pportant@redhat.com>
---
qemu-timer.c | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/qemu-timer.c b/qemu-timer.c
index d7f56e5..b0845f1 100644
--- a/qemu-timer.c
+++ b/qemu-timer.c
@@ -472,16 +472,16 @@ void qemu_run_all_timers(void)
{
alarm_timer->pending = 0;
+ /* vm time timers */
+ qemu_run_timers(vm_clock);
+ qemu_run_timers(rt_clock);
+ qemu_run_timers(host_clock);
+
/* rearm timer, if not periodic */
if (alarm_timer->expired) {
alarm_timer->expired = 0;
qemu_rearm_alarm_timer(alarm_timer);
}
-
- /* vm time timers */
- qemu_run_timers(vm_clock);
- qemu_run_timers(rt_clock);
- qemu_run_timers(host_clock);
}
#ifdef _WIN32
--
1.7.7.6
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH] Small change to remove short 250us timeouts every other time through the wait loop.
2012-03-22 14:59 [Qemu-devel] [PATCH] Small change to remove short 250us timeouts every other time through the wait loop Peter Portante
@ 2012-03-27 12:34 ` Avi Kivity
2012-03-27 13:14 ` Peter Portante
0 siblings, 1 reply; 3+ messages in thread
From: Avi Kivity @ 2012-03-27 12:34 UTC (permalink / raw)
To: Peter Portante; +Cc: qemu-devel, Peter Portante
On 03/22/2012 04:59 PM, Peter Portante wrote:
> Basically, the main wait loop calls qemu_run_all_timers() unconditionally. The
> first thing this routine used to do is to see if a timer had been serviced,
> and then reset the loop timeout to the next deadline.
>
> However, the new deadlines had not been calculated at that point, as
> qemu_run_timers() had not been called yet for each of the clocks. So
> qemu_rearm_alarm_timer() would end up with a negative or zero deadline, and
> default to setting a 250us timeout for the loop.
>
> As qemu_run_timers() is called for each clock, the real deadlines would be put
> in place, but because a loop timeout was already set, the loop timeout would
> not be changed.
>
> Once that 250us timeout fired, the real deadline would be used for the
> subsequent timeout.
>
> For idle VMs, this effectively doubles the number of times through the loop,
> doubling the number of select() system calls, timer calls, etc. putting added
> scheduling pressure on the kernel. And under cgroups, this really causes a big
> problem because the cgroup code does not scale well.
>
> By simply running the timers before trying to rearm the timer, we always rearm
> with a non-zero deadline, effectively halving the number of system calls.
Reviewed-by: Avi Kivity <avi@redhat.com>
Note the canonical subject line for patches is "subsystem: short
description", in this case something like "qemu-timer: remove spurious
host alarm wakeups" would be a good fit.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH] Small change to remove short 250us timeouts every other time through the wait loop.
2012-03-27 12:34 ` Avi Kivity
@ 2012-03-27 13:14 ` Peter Portante
0 siblings, 0 replies; 3+ messages in thread
From: Peter Portante @ 2012-03-27 13:14 UTC (permalink / raw)
To: Avi Kivity; +Cc: qemu-devel@nongnu.org
Should I resubmit the patch? Thanks,
-peter
On Mar 27, 2012, at 8:34 AM, Avi Kivity <avi@redhat.com> wrote:
> On 03/22/2012 04:59 PM, Peter Portante wrote:
>> Basically, the main wait loop calls qemu_run_all_timers() unconditionally. The
>> first thing this routine used to do is to see if a timer had been serviced,
>> and then reset the loop timeout to the next deadline.
>>
>> However, the new deadlines had not been calculated at that point, as
>> qemu_run_timers() had not been called yet for each of the clocks. So
>> qemu_rearm_alarm_timer() would end up with a negative or zero deadline, and
>> default to setting a 250us timeout for the loop.
>>
>> As qemu_run_timers() is called for each clock, the real deadlines would be put
>> in place, but because a loop timeout was already set, the loop timeout would
>> not be changed.
>>
>> Once that 250us timeout fired, the real deadline would be used for the
>> subsequent timeout.
>>
>> For idle VMs, this effectively doubles the number of times through the loop,
>> doubling the number of select() system calls, timer calls, etc. putting added
>> scheduling pressure on the kernel. And under cgroups, this really causes a big
>> problem because the cgroup code does not scale well.
>>
>> By simply running the timers before trying to rearm the timer, we always rearm
>> with a non-zero deadline, effectively halving the number of system calls.
>
> Reviewed-by: Avi Kivity <avi@redhat.com>
>
> Note the canonical subject line for patches is "subsystem: short
> description", in this case something like "qemu-timer: remove spurious
> host alarm wakeups" would be a good fit.
>
> --
> error compiling committee.c: too many arguments to function
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2012-03-27 13:14 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-03-22 14:59 [Qemu-devel] [PATCH] Small change to remove short 250us timeouts every other time through the wait loop Peter Portante
2012-03-27 12:34 ` Avi Kivity
2012-03-27 13:14 ` Peter Portante
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).