qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Dmitry Osipenko <digetx@gmail.com>
To: Peter Crosthwaite <crosthwaitepeter@gmail.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
	qemu-arm <qemu-arm@nongnu.org>,
	QEMU Developers <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH v12 8/9] hw/ptimer: Perform delayed tick instead of immediate if delta = 0
Date: Wed, 9 Mar 2016 22:56:04 +0300	[thread overview]
Message-ID: <56E07FD4.70209@gmail.com> (raw)
In-Reply-To: <CAPokK=reD-sN1525osBbcxjFDzyJKvaoEf69C7wb6oHco4N=Lw@mail.gmail.com>

09.03.2016 00:08, Peter Crosthwaite пишет:
> On Sat, Jan 30, 2016 at 8:43 AM, Dmitry Osipenko <digetx@gmail.com> wrote:
>> It might be necessary by some emulated HW to perform the tick after one
>> period if delta = 0. Given that it is much less churny to implement immediate
>> tick by the ptimer user itself, let's make ptimer do the delayed tick.
>>
>
> Isn't this related to previous patch? It is kind of a rounding problem
> that will vary from timer to timer. Some timers may interpret the
> "tick" as the wrap-around back to the load value (even if that is 0)
> while others interpret the tick as the transition to zero (makes more
> sense for a one-shot). It's hard to set a universal policy here.

If by previous patch you are meaning "Fix counter - 1 ...", then no, it's a 
distinct issue/feature. I endeavored to add some sort of "flags" to ptimer in 
order to support various policies, but quickly realized that it doesn't really 
worth an effort since there are no users of those policies (currently "delta = 
0" is a forbidden case) and ptimer VMSD version would be bumped.

It's not possible (doesn't make sense) for ptimer user to implement policy 
provided by this patch by itself. Other policies could be easily supported in 
future if desired (or implemented by ptimer user).

>
> But is this a non-issue when we consider that event latency (usually
> interrupt latency) is undefined anyway?
>

It's not an issue for a timer that has quite short period. Some of the 
arm_mptimer tests would fail (in icount mode) if that policy not implemented.

BTW, I think "deferred" might be better than "delayed", however not sure :)

> Regards,
> Peter

>
>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
>> ---
>>   hw/core/ptimer.c | 34 +++++++++++++++-------------------
>>   1 file changed, 15 insertions(+), 19 deletions(-)
>>
>> diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c
>> index b2044fb..bcd090c 100644
>> --- a/hw/core/ptimer.c
>> +++ b/hw/core/ptimer.c
>> @@ -36,19 +36,7 @@ static void ptimer_reload(ptimer_state *s)
>>   {
>>       uint32_t period_frac = s->period_frac;
>>       uint64_t period = s->period;
>> -
>> -    if (s->delta == 0) {
>> -        ptimer_trigger(s);
>> -    }
>> -
>> -    if (s->delta == 0 && s->enabled == 1) {
>> -        s->delta = s->limit;
>> -    }
>> -
>> -    if (s->delta == 0) {
>> -        ptimer_stop(s);
>> -        return;
>> -    }
>> +    uint64_t delta = MAX(1, s->delta);
>>
>>       /*
>>        * Artificially limit timeout rate to something
>> @@ -59,15 +47,15 @@ static void ptimer_reload(ptimer_state *s)
>>        * on the current generation of host machines.
>>        */
>>
>> -    if (s->enabled == 1 && (s->delta * period < 10000) && !use_icount) {
>> -        period = 10000 / s->delta;
>> +    if (s->enabled == 1 && (delta * period < 10000) && !use_icount) {
>> +        period = 10000 / delta;
>>           period_frac = 0;
>>       }
>>
>>       s->last_event = s->next_event;
>> -    s->next_event = s->last_event + s->delta * period;
>> +    s->next_event = s->last_event + delta * period;
>>       if (period_frac) {
>> -        s->next_event += ((int64_t)period_frac * s->delta) >> 32;
>> +        s->next_event += ((int64_t)period_frac * delta) >> 32;
>>       }
>>       timer_mod(s->timer, s->next_event);
>>   }
>> @@ -75,8 +63,16 @@ static void ptimer_reload(ptimer_state *s)
>>   static void ptimer_tick(void *opaque)
>>   {
>>       ptimer_state *s = (ptimer_state *)opaque;
>> -    s->delta = 0;
>> -    ptimer_reload(s);
>> +
>> +    s->delta = (s->enabled == 1) ? s->limit : 0;
>> +
>> +    if (s->delta == 0) {
>> +        s->enabled = 0;
>> +    } else {
>> +        ptimer_reload(s);
>> +    }
>> +
>> +    ptimer_trigger(s);
>>   }
>>
>>   uint64_t ptimer_get_count(ptimer_state *s)
>> --
>> 2.7.0
>>


-- 
Dmitry

  reply	other threads:[~2016-03-09 19:56 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-30 16:43 [Qemu-devel] [PATCH v12 0/9] PTimer fixes/features and ARM MPTimer conversion Dmitry Osipenko
2016-01-30 16:43 ` [Qemu-devel] [PATCH v12 1/9] hw/ptimer: Fix issues caused by the adjusted timer limit value Dmitry Osipenko
2016-01-30 16:43 ` [Qemu-devel] [PATCH v12 2/9] hw/ptimer: Perform counter wrap around if timer already expired Dmitry Osipenko
2016-01-30 16:43 ` [Qemu-devel] [PATCH v12 3/9] hw/ptimer: Update .delta on period/freq change Dmitry Osipenko
2016-01-30 16:43 ` [Qemu-devel] [PATCH v12 4/9] hw/ptimer: Support "on the fly" timer mode switch Dmitry Osipenko
2016-01-30 16:43 ` [Qemu-devel] [PATCH v12 5/9] hw/ptimer: Introduce ptimer_get_limit Dmitry Osipenko
2016-01-30 16:43 ` [Qemu-devel] [PATCH v12 6/9] hw/ptimer: Legalize running with delta = load = 0 and abort on period = 0 Dmitry Osipenko
2016-01-30 16:43 ` [Qemu-devel] [PATCH v12 7/9] hw/ptimer: Fix counter - 1 returned by ptimer_get_count for the active timer Dmitry Osipenko
2016-02-02 15:19   ` Dmitry Osipenko
2016-02-02 15:24     ` Dmitry Osipenko
2016-03-08  3:43     ` Peter Crosthwaite
2016-03-08 19:11       ` Dmitry Osipenko
2016-01-30 16:43 ` [Qemu-devel] [PATCH v12 8/9] hw/ptimer: Perform delayed tick instead of immediate if delta = 0 Dmitry Osipenko
2016-03-08 21:08   ` Peter Crosthwaite
2016-03-09 19:56     ` Dmitry Osipenko [this message]
2016-03-16 18:34     ` Dmitry Osipenko
2016-01-30 16:43 ` [Qemu-devel] [PATCH v12 9/9] arm_mptimer: Convert to use ptimer Dmitry Osipenko
2016-03-08 21:03   ` Peter Crosthwaite
2016-03-16 14:36 ` [Qemu-devel] [PATCH v12 0/9] PTimer fixes/features and ARM MPTimer conversion Peter Maydell
2016-03-16 15:33   ` Dmitry Osipenko
2016-03-28 13:22   ` Dmitry Osipenko
2016-03-29 19:00     ` Peter Maydell
2016-03-29 20:17       ` Dmitry Osipenko
2016-05-24 16:20         ` Peter Maydell
2016-05-24 17:15           ` Dmitry Osipenko

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=56E07FD4.70209@gmail.com \
    --to=digetx@gmail.com \
    --cc=crosthwaitepeter@gmail.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).