All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 03/13] qemu-timer: move common code to qemu_rearm_alarm_timer
Date: Mon, 17 Oct 2011 14:51:04 -0500	[thread overview]
Message-ID: <4E9C8728.3090302@codemonkey.ws> (raw)
In-Reply-To: <1318332930-16217-4-git-send-email-pbonzini@redhat.com>

On 10/11/2011 06:35 AM, Paolo Bonzini wrote:
> Signed-off-by: Paolo Bonzini<pbonzini@redhat.com>

Reviewed-by: Anthony Liguori <Aliguori@us.ibm.com>

Regards,

Anthony Liguori

> ---
>   qemu-timer.c |  129 ++++++++++++++++++++++++----------------------------------
>   1 files changed, 53 insertions(+), 76 deletions(-)
>
> diff --git a/qemu-timer.c b/qemu-timer.c
> index acf7a15..e2551f3 100644
> --- a/qemu-timer.c
> +++ b/qemu-timer.c
> @@ -153,7 +153,7 @@ struct qemu_alarm_timer {
>       char const *name;
>       int (*start)(struct qemu_alarm_timer *t);
>       void (*stop)(struct qemu_alarm_timer *t);
> -    void (*rearm)(struct qemu_alarm_timer *t);
> +    void (*rearm)(struct qemu_alarm_timer *t, int64_t nearest_delta_ns);
>   #if defined(__linux__)
>       int fd;
>       timer_t timer;
> @@ -181,12 +181,46 @@ static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
>       return !!t->rearm;
>   }
>
> +static int64_t qemu_next_alarm_deadline(void)
> +{
> +    int64_t delta;
> +    int64_t rtdelta;
> +
> +    if (!use_icount&&  vm_clock->active_timers) {
> +        delta = vm_clock->active_timers->expire_time -
> +                     qemu_get_clock_ns(vm_clock);
> +    } else {
> +        delta = INT32_MAX;
> +    }
> +    if (host_clock->active_timers) {
> +        int64_t hdelta = host_clock->active_timers->expire_time -
> +                 qemu_get_clock_ns(host_clock);
> +        if (hdelta<  delta) {
> +            delta = hdelta;
> +        }
> +    }
> +    if (rt_clock->active_timers) {
> +        rtdelta = (rt_clock->active_timers->expire_time -
> +                 qemu_get_clock_ns(rt_clock));
> +        if (rtdelta<  delta) {
> +            delta = rtdelta;
> +        }
> +    }
> +
> +    return delta;
> +}
> +
>   static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
>   {
> -    if (!alarm_has_dynticks(t))
> +    int64_t nearest_delta_ns;
> +    assert(alarm_has_dynticks(t));
> +    if (!rt_clock->active_timers&&
> +        !vm_clock->active_timers&&
> +        !host_clock->active_timers) {
>           return;
> -
> -    t->rearm(t);
> +    }
> +    nearest_delta_ns = qemu_next_alarm_deadline();
> +    t->rearm(t, nearest_delta_ns);
>   }
>
>   /* TODO: MIN_TIMER_REARM_NS should be optimized */
> @@ -196,23 +230,23 @@ static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
>
>   static int mm_start_timer(struct qemu_alarm_timer *t);
>   static void mm_stop_timer(struct qemu_alarm_timer *t);
> -static void mm_rearm_timer(struct qemu_alarm_timer *t);
> +static void mm_rearm_timer(struct qemu_alarm_timer *t, int64_t delta);
>
>   static int win32_start_timer(struct qemu_alarm_timer *t);
>   static void win32_stop_timer(struct qemu_alarm_timer *t);
> -static void win32_rearm_timer(struct qemu_alarm_timer *t);
> +static void win32_rearm_timer(struct qemu_alarm_timer *t, int64_t delta);
>
>   #else
>
>   static int unix_start_timer(struct qemu_alarm_timer *t);
>   static void unix_stop_timer(struct qemu_alarm_timer *t);
> -static void unix_rearm_timer(struct qemu_alarm_timer *t);
> +static void unix_rearm_timer(struct qemu_alarm_timer *t, int64_t delta);
>
>   #ifdef __linux__
>
>   static int dynticks_start_timer(struct qemu_alarm_timer *t);
>   static void dynticks_stop_timer(struct qemu_alarm_timer *t);
> -static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
> +static void dynticks_rearm_timer(struct qemu_alarm_timer *t, int64_t delta);
>
>   #endif /* __linux__ */
>
> @@ -715,8 +749,6 @@ void qemu_run_all_timers(void)
>       qemu_run_timers(host_clock);
>   }
>
> -static int64_t qemu_next_alarm_deadline(void);
> -
>   #ifdef _WIN32
>   static void CALLBACK host_alarm_handler(PVOID lpParam, BOOLEAN unused)
>   #else
> @@ -781,33 +813,6 @@ int64_t qemu_next_icount_deadline(void)
>       return delta;
>   }
>
> -static int64_t qemu_next_alarm_deadline(void)
> -{
> -    int64_t delta;
> -    int64_t rtdelta;
> -
> -    if (!use_icount&&  vm_clock->active_timers) {
> -        delta = vm_clock->active_timers->expire_time -
> -                     qemu_get_clock_ns(vm_clock);
> -    } else {
> -        delta = INT32_MAX;
> -    }
> -    if (host_clock->active_timers) {
> -        int64_t hdelta = host_clock->active_timers->expire_time -
> -                 qemu_get_clock_ns(host_clock);
> -        if (hdelta<  delta)
> -            delta = hdelta;
> -    }
> -    if (rt_clock->active_timers) {
> -        rtdelta = (rt_clock->active_timers->expire_time -
> -                 qemu_get_clock_ns(rt_clock));
> -        if (rtdelta<  delta)
> -            delta = rtdelta;
> -    }
> -
> -    return delta;
> -}
> -
>   #if defined(__linux__)
>
>   #include "compatfd.h"
> @@ -860,20 +865,13 @@ static void dynticks_stop_timer(struct qemu_alarm_timer *t)
>       timer_delete(host_timer);
>   }
>
> -static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
> +static void dynticks_rearm_timer(struct qemu_alarm_timer *t,
> +                                 int64_t nearest_delta_ns)
>   {
>       timer_t host_timer = t->timer;
>       struct itimerspec timeout;
> -    int64_t nearest_delta_ns = INT64_MAX;
>       int64_t current_ns;
>
> -    assert(alarm_has_dynticks(t));
> -    if (!rt_clock->active_timers&&
> -        !vm_clock->active_timers&&
> -        !host_clock->active_timers)
> -        return;
> -
> -    nearest_delta_ns = qemu_next_alarm_deadline();
>       if (nearest_delta_ns<  MIN_TIMER_REARM_NS)
>           nearest_delta_ns = MIN_TIMER_REARM_NS;
>
> @@ -915,19 +913,12 @@ static int unix_start_timer(struct qemu_alarm_timer *t)
>       return 0;
>   }
>
> -static void unix_rearm_timer(struct qemu_alarm_timer *t)
> +static void unix_rearm_timer(struct qemu_alarm_timer *t,
> +                             int64_t nearest_delta_ns)
>   {
>       struct itimerval itv;
> -    int64_t nearest_delta_ns = INT64_MAX;
>       int err;
>
> -    assert(alarm_has_dynticks(t));
> -    if (!rt_clock->active_timers&&
> -        !vm_clock->active_timers&&
> -        !host_clock->active_timers)
> -        return;
> -
> -    nearest_delta_ns = qemu_next_alarm_deadline();
>       if (nearest_delta_ns<  MIN_TIMER_REARM_NS)
>           nearest_delta_ns = MIN_TIMER_REARM_NS;
>
> @@ -1014,23 +1005,14 @@ static void mm_stop_timer(struct qemu_alarm_timer *t)
>       timeEndPeriod(mm_period);
>   }
>
> -static void mm_rearm_timer(struct qemu_alarm_timer *t)
> +static void mm_rearm_timer(struct qemu_alarm_timer *t, int64_t delta)
>   {
> -    int nearest_delta_ms;
> -
> -    assert(alarm_has_dynticks(t));
> -    if (!rt_clock->active_timers&&
> -        !vm_clock->active_timers&&
> -        !host_clock->active_timers) {
> -        return;
> -    }
> -
> -    timeKillEvent(mm_timer);
> -
> -    nearest_delta_ms = (qemu_next_alarm_deadline() + 999999) / 1000000;
> +    int nearest_delta_ms = (delta + 999999) / 1000000;
>       if (nearest_delta_ms<  1) {
>           nearest_delta_ms = 1;
>       }
> +
> +    timeKillEvent(mm_timer);
>       mm_timer = timeSetEvent(nearest_delta_ms,
>                               mm_period,
>                               mm_alarm_handler,
> @@ -1082,19 +1064,14 @@ static void win32_stop_timer(struct qemu_alarm_timer *t)
>       }
>   }
>
> -static void win32_rearm_timer(struct qemu_alarm_timer *t)
> +static void win32_rearm_timer(struct qemu_alarm_timer *t,
> +                              int64_t nearest_delta_ns)
>   {
>       HANDLE hTimer = t->timer;
>       int nearest_delta_ms;
>       BOOLEAN success;
>
> -    assert(alarm_has_dynticks(t));
> -    if (!rt_clock->active_timers&&
> -        !vm_clock->active_timers&&
> -        !host_clock->active_timers)
> -        return;
> -
> -    nearest_delta_ms = (qemu_next_alarm_deadline() + 999999) / 1000000;
> +    nearest_delta_ms = (nearest_delta_ns + 999999) / 1000000;
>       if (nearest_delta_ms<  1) {
>           nearest_delta_ms = 1;
>       }

  reply	other threads:[~2011-10-17 19:51 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-11 11:35 [Qemu-devel] [PATCH v2 00/13] allow tools to use the QEMU main loop Paolo Bonzini
2011-10-11 11:35 ` [Qemu-devel] [PATCH 01/13] remove unused function Paolo Bonzini
2011-10-17 19:49   ` Anthony Liguori
2011-10-11 11:35 ` [Qemu-devel] [PATCH 02/13] qemu-timer: remove active_timers array Paolo Bonzini
2011-10-17 19:50   ` Anthony Liguori
2011-10-11 11:35 ` [Qemu-devel] [PATCH 03/13] qemu-timer: move common code to qemu_rearm_alarm_timer Paolo Bonzini
2011-10-17 19:51   ` Anthony Liguori [this message]
2011-10-11 11:35 ` [Qemu-devel] [PATCH 04/13] qemu-timer: more clock functions Paolo Bonzini
2011-10-17 19:51   ` Anthony Liguori
2011-10-11 11:35 ` [Qemu-devel] [PATCH 05/13] qemu-timer: move icount to cpus.c Paolo Bonzini
2011-10-11 11:35 ` [Qemu-devel] [PATCH 06/13] qemu-timer: do not refer to runstate_is_running() Paolo Bonzini
2011-10-11 11:35 ` [Qemu-devel] [PATCH 07/13] qemu-timer: use atexit for quit_timers Paolo Bonzini
2011-10-11 11:35 ` [Qemu-devel] [PATCH 08/13] qemu-timer: move more stuff out of qemu-timer.c Paolo Bonzini
2011-10-11 11:35 ` [Qemu-devel] [PATCH 09/13] qemu-timer: do not use RunState change handlers Paolo Bonzini
2011-10-11 11:35 ` [Qemu-devel] [PATCH 10/13] create main-loop.h Paolo Bonzini
2011-10-11 11:35 ` [Qemu-devel] [PATCH 11/13] create main-loop.c Paolo Bonzini
2011-10-11 11:35 ` [Qemu-devel] [PATCH 12/13] Revert to a hand-made select loop Paolo Bonzini
2011-10-11 11:35 ` [Qemu-devel] [PATCH 13/13] simplify main loop functions Paolo Bonzini
2011-10-17 19:56 ` [Qemu-devel] [PATCH v2 00/13] allow tools to use the QEMU main loop Anthony Liguori
2011-10-17 20:09   ` Paolo Bonzini
2011-10-17 20:11     ` Anthony Liguori
2011-10-17 20:19       ` Paolo Bonzini
2011-10-18 11:59         ` Paolo Bonzini

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=4E9C8728.3090302@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.