On 7 September 2016 at 14:22, Dmitry Osipenko <dig...@gmail.com> wrote:
> Currently, periodic counter wraps around immediately once counter reaches
> "0", this is wrong behaviour for some of the timers, resulting in one period
> being lost. Add new ptimer policy that provides correct behaviour for such
> timers, so that counter stays with "0" for a one period before wrapping
> around.

This says it's just adding a new policy...

> @@ -91,7 +96,7 @@ uint64_t ptimer_get_count(ptimer_state *s)
>  {
>      uint64_t counter;
>
> -    if (s->enabled) {
> +    if (s->enabled && s->delta != 0) {
>          int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
>          int64_t next = s->next_event;
>          bool expired = (now - next >= 0);
> @@ -145,6 +150,14 @@ uint64_t ptimer_get_count(ptimer_state *s)
>                      div += 1;
>              }
>              counter = rem / div;
> +
> +            if (!oneshot && s->delta == s->limit) {
> +                /* Before wrapping around, timer should stay with counter = 0
> +                   for a one period.  The delta has been adjusted by +1 for
> +                   the wrapped around counter, so taking a modulo of limit + 
> 1
> +                   gives that period.  */
> +                counter %= s->limit + 1;
> +            }
>          }
>      } else {
>          counter = s->delta;

...but the changes in this function look like they affect
behaviour even if that policy flag isn't set.

thanks
-- PMM

Reply via email to