The periodic mode uses a reload value which is calculated during
system startup and never touched again. At this point we do not have
the full timekeeping infrastructure working and your test code uses
the working infrastructure as reference.
In high resolution timer mode we reprogramm the local apic timer for
the next hrtimer instance which is enqueued. We calculate the delta
against the system time and then convert it to the local apic counter
value.
But yes, it's surprising that the obvious calibration deviation of the
local apic timer, which results in longer times is not showing up in
one shot mode. It would be interesting to see the absolute time line
in terms of ktime_get() of those events versus the expiry value of the
hrtimer which drives the tick emulation in tick_sched_timer().
Thanks,
tglx
--