On 7 September 2016 at 14:22, Dmitry Osipenko <[email protected]> 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