[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC] [PATCHv4 10/13] aio / timers: Convert mainloop to
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [RFC] [PATCHv4 10/13] aio / timers: Convert mainloop to use timeout |
Date: |
Thu, 1 Aug 2013 16:14:11 +0200 |
On Aug 01 2013, Alex Bligh wrote:
> Paolo,
>
> >>@@ -449,6 +460,7 @@ int main_loop_wait(int nonblocking)
> >> {
> >> int ret;
> >> uint32_t timeout = UINT32_MAX;
> >>+ int64_t timeout_ns;
> >>
> >> if (nonblocking) {
> >> timeout = 0;
> >>@@ -462,7 +474,21 @@ int main_loop_wait(int nonblocking)
> >> slirp_pollfds_fill(gpollfds);
> >> # endif
> >> qemu_iohandler_fill(gpollfds);
> >>- ret = os_host_main_loop_wait(timeout);
> >>+
> >>+ if (timeout == UINT32_MAX) {
> >>+ timeout_ns = -1;
> >>+ } else {
> >>+ timeout_ns = (uint64_t)timeout * (int64_t)(SCALE_MS);
> >>+ }
> >>+
> >>+ timeout_ns = qemu_soonest_timeout(timeout_ns,
> >>+ qemu_clock_deadline_ns(rt_clock));
> >>+ timeout_ns = qemu_soonest_timeout(timeout_ns,
> >>+ qemu_clock_deadline_ns(vm_clock));
> >
> >This must not be included if use_icount.
>
> Really? qemu_run_all_timers was running all 3 timers irrespective of
> use_icount, and doing a qemu_notify if anything expired, so I'm merely
> mimicking the existing behaviour here.
Maybe I'm misreading the code. If it is a replacement of
qemu_next_alarm_deadline, then it is indeed omitting vm_clock.
> I'm not quite sure what use_icount does. Does vm_clock get disabled
> if it is set? (in which case it won't matter).
It doesn't count nanoseconds anymore. The clock is updated by the
VCPU thread. When the VCPU thread notices that the clock is past the
earliest timers, it does a qemu_notify_event(). That exits the g_poll
and qemu_run_all_timers then can process the callbacks.
> The way it's done at the moment is that the QEMUTimerList user can
> create as many QEMUTimerLists as he wants. So AioContext asks for one
> of one type. It could equally ask for three - one of each type.
>
> I think that's probably adequate.
>
> >Once you do this, you get some complications due to more data structures,
> >but other code is simplified noticeably. For example, you lose the
> >concept of a default timerlist (it's just the timerlist of the default
> >AioContext).
>
> Yep - per the above that's really intrusive (I think I touched well over
> a hundred files). The problem is that lots of things refer to vm_clock
> to set a timer (when it's a clock so should use a timer list) and
> also to vm_clock to read the timer (which is a clock function).
Yes, that's fine. You can still keep the shorter invocation,
but instead of using clock->timerlist it would use
qemu_aio_context->clocks[clock->type].
Related to this, a better name for the "full" functions taking
a timerlist could be simply timer_new_ns etc. And I would remove
the allocation step for these functions. It is shameful how little
we use qemu_free_timer, and removing allocation would "fix" the
problem completely for users of the QEMUTimerList-based functions.
It's already a convention to use qemu_* only for functions that use some
global state, for example qemu_notify_event() vs. aio_notify().
> >And because all timerlists have an AioContext,
>
> Well old callers, particularly those not using an AioContext, would
> not have an AioContext would they?
It would be qemu_aio_context.
> I was trying hard to avoid anything having to iterate over all
> timerlists, and leave the timerlist to be per-thread where possible.
> This may well fail for the clock warp stuff. I probably need to
> exactly the same as on qemu_clock_enable() here if use_icount is
> true. WDYT?
Yes. This:
qemu_mod_timer(icount_warp_timer, vm_clock_warp_start + deadline);
would have to use the earliest deadline of all vm_clock timerlists.
And this:
if (qemu_clock_expired(vm_clock)) {
qemu_notify_event();
}
would also have to walk all timerlists for vm_clock, and notify
those that have expired. But you would not need one warp timer
per timerlist.
Paolo
- Re: [Qemu-devel] [RFC] [PATCHv4 10/13] aio / timers: Convert mainloop to use timeout, Paolo Bonzini, 2013/08/01
- Re: [Qemu-devel] [RFC] [PATCHv4 10/13] aio / timers: Convert mainloop to use timeout, Alex Bligh, 2013/08/01
- Re: [Qemu-devel] [RFC] [PATCHv4 10/13] aio / timers: Convert mainloop to use timeout,
Paolo Bonzini <=
- Re: [Qemu-devel] [RFC] [PATCHv4 10/13] aio / timers: Convert mainloop to use timeout, Alex Bligh, 2013/08/02
- [Qemu-devel] [RFC] [PATCHv5 00/16] aio / timers: Add AioContext timers and use ppoll, Alex Bligh, 2013/08/04
- [Qemu-devel] [RFC] [PATCHv5 01/16] aio / timers: add qemu-timer.c utility functions, Alex Bligh, 2013/08/04
- [Qemu-devel] [RFC] [PATCHv5 04/16] aio / timers: Make qemu_run_timers and qemu_run_all_timers return progress, Alex Bligh, 2013/08/04
- [Qemu-devel] [RFC] [PATCHv5 07/16] aio / timers: Add QEMUTimerListGroup and helper functions, Alex Bligh, 2013/08/04
- [Qemu-devel] [RFC] [PATCHv5 10/16] aio / timers: aio_ctx_prepare sets timeout from AioContext timers, Alex Bligh, 2013/08/04
- [Qemu-devel] [RFC] [PATCHv5 08/16] aio / timers: Add QEMUTimerListGroup to AioContext, Alex Bligh, 2013/08/04
- [Qemu-devel] [RFC] [PATCHv5 13/16] aio / timers: On timer modification, qemu_notify or aio_notify, Alex Bligh, 2013/08/04
- [Qemu-devel] [RFC] [PATCHv5 12/16] aio / timers: Convert mainloop to use timeout, Alex Bligh, 2013/08/04
- [Qemu-devel] [RFC] [PATCHv5 02/16] aio / timers: add ppoll support with qemu_poll_ns, Alex Bligh, 2013/08/04