Re: [PATCH] ktimers subsystem 2.6.14-rc2-kt5

From: Roman Zippel (zippel_at_linux-m68k.org)
Date: 10/27/05

  • Next message: Marcel Holtmann: "4GB memory and Intel Dual-Core system"
    Date:	Thu, 27 Oct 2005 22:23:51 +0200 (CEST)
    To: George Anzinger <george@mvista.com>
    
    

    Hi,

    On Sun, 23 Oct 2005, George Anzinger wrote:

    > > > > Above says IOW if we have a clock with a frequency f and a resolution with
    > > > > r=10^9/f, we have to round time t up so that it becomes a integer multiple i
    > > > > of r, so that once the counter reaches the value i all timer with up to a
    > > > > time value of i*r are expired.
    > >
    > >
    > > You don't specifically disagree, so I can assume you agree that this a valid
    > > interpretation of the spec?
    > > (I'm asking because it's important for the design of the timer system.)
    >
    > I agree with the proviso that we can define such a clock as an abstraction of
    > a clock with a better resolution. I.e. we can provide clocks with lesser
    > resolution than the physical clock has.

    I had a different aspect in mind: at what resolution are we doing the
    calculations?
    Let's say we have a clock with a frequency of 300Hz, now we could programm
    the timer like this:

            tmp = time * 300;
            clock = tmp / 10^9 + (tmp % 10^9 != 0);

    This rounds the time to the next clock count and as soon as the clock
    reaches this count the timer is expired.
    OTOH We could also do this at the timer interrupt:

            tmp = clock * 10^9;
            time = tmp / 300 + (tmp % 300 != 0);

    and use time to expire all timer upto this time. In either case the
    behaviour is exactly the same.

    The problem is now that we can export the real resolution only as integer
    value. What consequences has this to the kernel timer implementation?
    Something like above must be done anyway, so what's the point in doing an
    extra rounding step?
    For example if we set a timer to expire at 999999990ns, so the next
    interrupt is at 1000000000ns, but rounding it to 3333333ns means the
    expiry time changes to 1003333233ns and the timer expires one clock tick
    later.
    Which application seriously expects this kind of behaviour?

    > I admit I have not looked, in detail, at this part of ktimers, however,
    > assuming that the clock ticks at HZ then the normal error to be expected is
    > and average of 1/2 the resolution with a max of 1 resolution. This is AFTER
    > the rounding to the next resolution, so we can expect the expiry to be any
    > where from 0 to 2*resolution-1. (up to resolution-1 from rounding, and up to
    > one resolution from clock skew). This the way I and every one I have worked
    > with understand the standard.

    For relative timer I agree that the error can be twice the resolution.
    First the value read from the clock must be rounded up and then we still
    have to wait till the next clock tick.
    OTOH for absolute timer we don't need the first step, we just have to wait
    until the clock reaches this time. Why should we add an extra error to it,
    if we can avoid it? The spec actually says "a timer expiration signal is
    requested when the associated clock reaches or exceeds the specified
    time." The clock resolution causes the actual expiration time
    automatically to be a rounded value of the requested value.

    Next question would be what happens if timer and clock resolution differs?
    For example if the clock has a resolution of 1us and the timer runs every
    1ms. For relative timer this would mean we can keep the error within
    1.001ms and for absolute timer within 1ms. Do we really have to force an
    error larger than really necessary?

    Interesting is now that Thomas doesn't take the clock resolution into
    account at all. Let's say clock and timer resolution are 1ms (or HZ=1000).
    If we program a normal kernel timer, we do something like this:

            timer->expires = jiffies + 1 + usecs_to_jiffies(timeout);

    Thomas does now basically this:

            timer->expires = jiffies * res + round(timeout, res);

    IOW if the clock resolution is larger than the interrupt delay, the timer
    may expire early.

    > We have had good acceptance of the HRT patch in our customer base. As far as
    > I know we have not gotten any feed back on just what resolution they want or
    > use. We allow them to define it (within reason) at configure time. I have
    > been recommending, for the x86, nothing better than about 100usec but this is
    > based on my machine being able to handle an interrupt in about that amount of
    > time.
    >
    > We don't require alignment of the resolution with the actual hardware
    > resolution as at these levels the interrupt jitter smooths over any issues in
    > this area.

    I expected as much, so users who do care make sure the timer resolution is
    good enough. In this case I would also expect that they are interested in
    keeping the error as small as possible.

    > A comment here, in some of your math examples you seem to be
    > implying that we are going to use a particular resolution from the begining of
    > time to compute expiry time. In fact, we start from "now" as defined by a,
    > possibly corrected, system clock. Once we have the rounded expiry time we use
    > full resolution math to figure how to fit that into the timing services. So,
    > infact, the resolution comes into play only over 1 to 2 resolutions of the
    > requested time. In other words, errors do not accumulate since we always mark
    > to the corrected clock.

    I didn't imply that, I tried to keep focus on the model as described in
    the spec. I think we should keep the focus on the behaviour this model
    describes, no user cares how the kernel implements the spec, just that the
    visible behaviour matches the spec.
    SUS rationale specifically says "The interfaces also allow flexibility in
    the implementation of the functions. For example, ..." (in "Relationship
    of Timers to Clocks"), i.e. there is not one true implementation and so I
    think it's very well worth it to explore our options. Reducing the whole
    design to a single number (the resolution returned by clock_getres())
    would be IMO very shortsighted. We could very well allow the user to
    define his own timer based on various parameters, so he can adjust the
    timer to his needs.

    bye, Roman
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/


  • Next message: Marcel Holtmann: "4GB memory and Intel Dual-Core system"

    Relevant Pages

    • Re: [patch 00/21] hrtimer - High-resolution timer subsystem
      ... Right now the primary function of the state is to tell whether the timer ... > Of course if you consider the possibility of including high resolution ... problem requires solving problems in the clock abstraction first, ...
      (Linux-Kernel)
    • Re: [RFC][PATCH] new timeofday core subsystem (v.A0)
      ... >>Still need some way to do user timers that are tightly pegged to the clock. ... > nothing to peg or tie the timer with. ... > caused latency caused by the interrupt programming. ... >>adjust it for drift over time. ...
      (Linux-Kernel)
    • Re: [patch 00/21] hrtimer - High-resolution timer subsystem
      ... >> This way the list head is only necessary for the high resolution case. ... > (e.g. wakeup + timer restart). ... Even if the clock ...
      (Linux-Kernel)
    • Re: [PATCH] ktimers subsystem 2.6.14-rc2-kt5
      ... I agree with the proviso that we can define such a clock as an abstraction of a clock with a better ... I.e. we can provide clocks with lesser resolution than the physical clock has. ... > "Quantization error shall not cause the timer to expire earlier than the ... >>Now, if the timer we use actually has a resolution of 1.33333 usec, do we want ...
      (Linux-Kernel)
    • Re: [PATCH] ktimers subsystem 2.6.14-rc2-kt5
      ... >>that of the specified clock. ... >>the resolution of the specified timer shall be rounded up to the larger ... Quantization error shall not cause the timer to ... The errors introduced by this are, at most, 1.3333 usec, and they are NOT ...
      (Linux-Kernel)