|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 3/6] x86/time: streamline platform time init on plt_update()
On 08/30/2016 01:31 PM, Jan Beulich wrote:
>>>> On 30.08.16 at 14:10, <joao.m.martins@xxxxxxxxxx> wrote:
>> What would be a preferred period - probably capping it to a
>> day/hour/minutes? Or
>> keeping the current calculated value? Maximum right now in current platform
>> timers
>> are few minutes depending on the HPET frequency.
>
> Ideally I would see you just use the calculated value, unless that
> causes problems elsewhere. Depending on such possible problems
> would be what cap to alternatively use.
While sending v4 out, I spotted some issues with platform timer overflow
handling when we get close to u64 boundary. Specific to clocksource=tsc, and
setting up the plt_overflow, one would see at boot:
"Platform timer appears to have unexpectedly wrapped 10 or more times"
The counter doesn't wrap or stop at all.
But current overflowing checking goes like:
count = plt_src.read_counter();
plt_stamp64 += (count - plt_stamp) & plt_mask;
now = NOW();
plt_wrap = __read_platform_stime(plt_stamp64);
plt_stamp = count;
for (i=0;...)
{
plt_now = plt_wrap;
plt_wrap = __read_platform_stime(plt_stamp64 + plt_mask + 1);
@@ if ( ABS(plt_wrap - now) > ABS(plt_now - now) )
break; // didn't wrap around
// did wrap
plt_stamp64 += plt_mask + 1;
}
if (i!=0)
"Platform timer appears to have unexpectedly wrapped "
Effectively the calculation in @@ doesn't handle the fact that for
clocksource=tsc, "ABS(plt_wrap - now)" would be == to "ABS(plt_now -
now)". Not that is right to be so, but TSC is a 64-bit counter and "plt_mask +
1" overflows the u64, turning the above condition into a comparison of same
value. For <= 32-bit platform timers the current math works fine, but reaching
the 64-bit boundary not so much. And then handling the wraparound further below
with "plt_stamp64 += plt_mask + 1" is effectively adding zeroes, which is
assuming that plt_stamp64/plt_stamp is alone enough to not represent any
discontinuity.
I am not sure we shouldn't handle this way at least for clocksource=tsc: we only
see issues when the delta of the two stamps overflows a u64 (computed with:
plt_stamp64 + (read_counter() - plt_stamp)). Keeping those two stamps updated
more often and we won't see issues. When the wraparound happens (in lots lots of
years away) we could not only update plt_stamp64 and plt_stamp, but also
increment stime_platform_stamp and platform_timer_stamp. This lets us compensate
when the stamps wraparound since for stime_platform_stamp (in ns) that would
only happen after STIME_MAX. Or as a simpler alternative, keeping this patch and
update plt_stamp64 (zeroing this one out) plus plt_stamp on
platform_time_calibration() as additional change.
Would that sound reasonable - am I overlooking something? To some extent this
might also applicable to the general case, although platform timer is now only
used for initial seeding so probably a non-visible issue.
Joao
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |