On Wed, Sep 19, 2012 at 3:44 AM, Jan Kiszka <jan.kis...@siemens.com> wrote:

> On 2012-09-19 09:26, Paolo Bonzini wrote:
> > Il 18/09/2012 22:37, Anthony Liguori ha scritto:
> >> Unfortunately, there's a lot of Windows code in qemu-timer.c and
> main-loop.c
> >> right now otherwise the refactoring would be trivial.  I'll leave that
> for
> >> another day.
> >>
> >> Cc: Paolo Bonzini <pbonz...@redhat.com>
> >> Cc: Jan Kiszka <jan.kis...@siemens.com>
> >> Signed-off-by: Anthony Liguori <aligu...@us.ibm.com>
> >> ---
> >> Please note, this is lightly tested.  Since this is such a fundamental
> change,
> >> I'd like to do some performance analysis before committing but wanted
> to share
> >> early.
> >
> > Looks good.  I think Peter Portante tested something similar, and found
> no big
> > difference between the two.  But it's a good thing and, in my opinion,
> for
> > non-timerfd OSes we should simply adjust the select() timeout and not
> bother
> > with signals.
>
> What would be the advantage of timerfd over select? On Linux, both use
> hrtimers (and low slack for RT processes).


I am not sure the comparison is timerfd v. select, but timerfd v signal
based timer (setitimer). The timerfd path allows you to integrate with
select/poll/epoll loops, where as signal based timers make that more
difficult. One can do the same thing with signalfd, but only for one
signal, where as you can setup multiple timers at the expense of file
descriptors.

Additionally, FWIW, select() has a resolution capped by its use of struct
timeval, which is microseconds, where timerfd_settime allows for nanosecond
resolution.


> I'm starting to like the
> select/WaitForMultipleObjects pattern as it would allow to consolidate
> over basically two versions of timers and simplify the code.
>

With timerfd, signalfd and eventfd, Linux seems to have provided all the
coverage needed to make that happen.


>
> Jan
>
> >
> > I'm not sure if the same can be done for Windows, but I think it's
> possible as long
> > as you keep the timeBeginPeriod/timeEndPeriod calls.  As a start,
> Stefan, can you
> > check if the win32 timer works for you with the calls added?  Like this:
> >
> > diff --git a/qemu-timer.c b/qemu-timer.c
> > index c7a1551..721c769 100644
> > --- a/qemu-timer.c
> > +++ b/qemu-timer.c
> > @@ -673,6 +673,10 @@ static int win32_start_timer(struct
> qemu_alarm_timer *t)
> >      HANDLE hTimer;
> >      BOOLEAN success;
> >
> > +    timeGetDevCaps(&mm_tc, sizeof(mm_tc));
> > +
> > +    timeBeginPeriod(mm_tc.wPeriodMin);
> > +
> >      /* If you call ChangeTimerQueueTimer on a one-shot timer (its period
> >         is zero) that has already expired, the timer is not updated.
>  Since
> >         creating a new timer is relatively expensive, set a bogus
> one-hour
> > @@ -688,6 +692,7 @@ static int win32_start_timer(struct qemu_alarm_timer
> *t)
> >      if (!success) {
> >          fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n",
> >                  GetLastError());
> > +        timeEndPeriod(mm_tc.wPeriodMin);
> >          return -1;
> >      }
> >
> > @@ -702,6 +707,7 @@ static void win32_stop_timer(struct qemu_alarm_timer
> *t)
> >      if (hTimer) {
> >          DeleteTimerQueueTimer(NULL, hTimer, NULL);
> >      }
> > +    timeEndPeriod(mm_tc.wPeriodMin);
> >  }
> >
> >  static void win32_rearm_timer(struct qemu_alarm_timer *t,
> >
> > Paolo
> >
>
> --
> Siemens AG, Corporate Technology, CT RTC ITP SDP-DE
> Corporate Competence Center Embedded Linux
>
>

Reply via email to