Re: [PATCH] dynamic tick patch
From: George Anzinger
Date: Fri Jan 21 2005 - 15:28:25 EST
Tony Lindgren wrote:
* George Anzinger <george@xxxxxxxxxx> [050120 15:10]:
Tony Lindgren wrote:
* George Anzinger <george@xxxxxxxxxx> [050119 16:25]:
Tony Lindgren wrote:
* George Anzinger <george@xxxxxxxxxx> [050119 15:00]:
I don't think you will ever get good time if you EVER reprogramm the
PIT. That is why the VST patch on sourceforge does NOT touch the PIT,
it only turns off the interrupt by interrupting the interrupt path (not
changing the PIT). This allows the PIT to be the "gold standard" in
time that it is designed to be. The wake up interrupt, then needs to
come from an independent timer. My patch requires a local APIC for
this. Patch is available at
http://sourceforge.net/projects/high-res-timers/
Well on my test systems I have pretty good accurate time. But I agree,
PIT is not the best option for interrupt. It should be possible to use
other interrupt sources as well.
But then again reprogramming PIT in my patch should not be that bad,
as it's not done under load.
It should not matter where the timer interrupt comes from, as long as
it comes when programmed. Updating time should be separate from timer
interrupts. Currently we have a problem where time is tied to the
timer interrupt.
In the HRT code time is most correctly stated as wall_time +
get_arch_cycles_since(wall_jiffies) (plus conversion or two:)). This is
some what removed from the tick interrupt, but is resynced to that
interrupt more or less each interrupt.
That sounds very accurate :)
A second issue is trying to get the jiffies update as close to the run of
the timer list as possible. Without this we have no hope of high res
timers.
OK. But if the timer interrupt is separated from updating the time,
the next timer interrupt should be programmable to happen exactly
when a HRT timer needs it, right?
First, HRT uses a two phase system of timing. The first phase is the
normal timer list expires the timer. The timer is then handed to the high
res code which keeps a list of timers that are to expire prior to the next
jiffie. An interrupt is scheduled to make this happen. Depending on the
hardware available, this can come from the same timer or a different timer.
For example on x86 systems with a local apic we use the apic timer to
generate this interrupt. It triggers either a tasklet for UP or SMP with
out per cpu timers or a soft irq for SMP systems with per cpu timers.
What this means is that, for timers near but just after a jiffie, the
run_timer list being late can make the HR timer late.
Thanks for explaining that. So basically catching up with jiffies after
skipping ticks could easily delay the HRT timer.
Any due in the "skipped time" would be late, as would any normal timers due
during that time.
If jiffies was calculated from hw timer, updating time after skipping
jiffies would be fast, and then this problem would go away, right?
No, you are still pulling the timers out of the timer list long after they
should have expired.
This code on on sourceforge if you want a closer look...
I'll take a look at it.
Hmm, how about using a pool of programmable timers available on the
system for the timer interrupts and HRT? Or is one interrupt source
always enough?
Hardware heaven :), but no thanks. A reliable tick generator for the
jiffies timer and one additional timer (or one per cpu) works well in the
x86.
If you have something like the PPC where you can mess with the timer with
out loosing time, that works well also. The correct formulation would be a
"clock" that can be read quickly and a timer tied to the same "rock" that
uses the same count units as the clock. PARISC has a counter that just
counts and a compare register. When they are equal an interrupt is
generated. That is a nice set up.
Yes, many ARMs have this setup as well.
Now the X86 is bad and has little hope of being fixed for these reasons:
a.) the TSC is fast and easy to read but its not clocked at any given
frequency and, on some platforms, it changes without notifying the software.
b.) the PIT and the PMTIMER are both in I/O space and so take forever to
access.
c.) All three of these use different units (but at least the PMTIMER is
(supposed to be) related to the PIT clock.
d.) the HPET, again is in I/O space. I suspect that it uses a reasonable
"rock" but, as I understand it, it knocks out the PIT and, of course it
uses units unrelated to all the others.
The timers on x86 are quite messy...
AMEN!
Tony
--
George Anzinger george@xxxxxxxxxx
High-res-timers: http://sourceforge.net/projects/high-res-timers/
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/