xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Don Slutz <dslutz@verizon.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: Keir Fraser <keir@xen.org>, Don Slutz <dslutz@verizon.com>,
	xen-devel@lists.xen.org
Subject: Re: [PATCH 1/1] hpet: Act more like real hardware
Date: Fri, 28 Feb 2014 09:01:57 -0500	[thread overview]
Message-ID: <531096D5.7020308@terremark.com> (raw)
In-Reply-To: <53105F970200007800120205@nat28.tlf.novell.com>

On 02/28/14 04:06, Jan Beulich wrote:
>>>> On 28.02.14 at 00:56, Don Slutz <dslutz@verizon.com> wrote:
>> On 02/27/14 04:20, Jan Beulich wrote:
>>>>>> On 26.02.14 at 19:00, Don Slutz <dslutz@verizon.com> wrote:
>>>> Currently in 32 bit mode the routine hpet_set_timer() will convert a
>>>> time in the past to a time in future.  This is done by the uint32_t
>>>> cast of diff.
>>>>
>>>> Even without this issue, hpet_tick_to_ns() does not support past
>>>> times.
>>>>
>>>> Real hardware does not support past times.
>>>>
>>>> So just do the same thing in 32 bit mode as 64 bit mode.
>>> While the change looks valid at the first glance, what I'm missing
>>> is an explanation of how the problem that the introduction of this
>>> fixed (c/s 13495:e2539ab3580a "[HVM] Fix slow wallclock in x64
>>> Vista") is now being taken care of (or why this is of no concern).
>>> That's pretty relevant considering for how long this code has been
>>> there without causing (known) problems to anyone.
>> Ok, digging around (the git version):
>>
>> commit f545359b1c54f59be9d7c27112a68c51c45b06b5
>> Date:   Thu Jan 18 18:54:28 2007 +0000
>>       [HVM] Fix slow wallclock in x64 Vista. This is due to confusing a
>>
>>
>> And one that changed how it worked:
>>
>> commit 73ee2f2e11fcdc27aae4f8caa72d240c4c9ed5ac
>> Date:   Tue Jan 8 16:20:04 2008 +0000
>>      hvm: hpet: Fix overflow when converting to nanoseconds.
>>
>>
>> Is when a past time was prevented.  Which may well have caused x64 Vista to
>> have wallclock issues.
>>
>> Next:
>>
>> commit e1845bbe732b5ad5755f0f3a93fb6ea85919e8a2
>> Date:   Sat May 24 09:27:03 2008 +0100
>>       hvm: Build guest timers on monotonic system time.
>>
>>
>> Has a chance to do 2 things:
>> 1) Make the diff < 0 very unlikely
>> 2) Fixed x64 Vista wallclock issues (again)

 From your question below, my best guess is that this is just to short 
an explanation.  Here is an expanded one:

The only way that I can see the patch (c/s 13495:e2539ab3580a commit 
f545359b1c54f59be9d7c27112a68c51c45b06b5 "[HVM] Fix slow wallclock in 
x64 Vista") fixed the reported issue is by assuming that:

1) x64 Vista wallclock is using hpet in 32bit oneshot mode.
2) very offen the diff would be in the range -0.9765625 milliseconds to 
zero (0).
3) The sum of these is the amount that x64 Vista wallclock was off by.

The next change (c/s ? commit 73ee2f2e11fcdc27aae4f8caa72d240c4c9ed5ac 
"hvm: hpet: Fix overflow when converting to nanoseconds.") clearly 
breaks this by preventing hpet_tick_to_ns() to return tiny negative ns 
values.  And so this change reverted the fix for slow wallclock in x64 
Vista.

The third change (c/s ? commit e1845bbe732b5ad5755f0f3a93fb6ea85919e8a2 
"hvm: Build guest timers on monotonic system time." ) looks to me to 
have changed the rate of diff being in the range -0.9765625 milliseconds 
to zero (0) from a lot of the time to almost never.  This is based on 
the assumption that the 1st patch fixed the reported issue and the same 
issue was not reported since that time.

This is based on that fact that currently  HPET_TINY_TIME_SPAN 
(0xffff1194 4294906260) converts to 68,718,500,160 ns and -1 converts to 
18,014,398,509,481,983 ns so any number in the "tiny" range looks to me 
to mess up x64 Vista wallclock time and will also cause the linux 
MP-BIOS error message.

Hope this is clear.
     -Don Slutz



>> Looking closer at hpet_tick_to_ns() and doing some math.  I get:
>>
>>
>>       h->stime_freq = S_TO_NS;
>>       h->hpet_to_ns_scale = ((S_TO_NS * STIME_PER_HPET_TICK) << 10) /
>> h->stime_freq;
>>
>> I.E.
>>
>>       h->hpet_to_ns_scale = STIME_PER_HPET_TICK << 10;
>>
>> And so:
>>
>> #define hpet_tick_to_ns(h, tick)                        \
>>       ((s_time_t)((((tick) > (h)->hpet_to_ns_limit) ?     \
>>           ~0ULL : (tick) * (h)->hpet_to_ns_scale) >> 10))
>>
>>
>> Is really:
>>
>> #define hpet_tick_to_ns(h, tick)                        \
>>       ((s_time_t)((((tick) > (h)->hpet_to_ns_limit) ?     \
>>           (~0ULL >> 10) : (tick) * STIME_PER_HPET_TICK))
>>
>> And if you change to using a signed multiply most of the time you will be
>> fine.  If you want a complex that is "safer":
>>
>> #define hpet_tick_to_ns(tick)                                   \
>>       ((s_time_t)(tick) >= 0 ?                                    \
>>         (s_time_t)(tick) * (s_time_t)STIME_PER_HPET_TICK >= 0 ?   \
>>          (s_time_t)(tick) * (s_time_t)STIME_PER_HPET_TICK :       \
>>          (s_time_t)(~0ULL >> 10) :                                \
>>         (s_time_t)(tick) * (s_time_t)STIME_PER_HPET_TICK < 0 ?    \
>>          (s_time_t)(tick) * (s_time_t)STIME_PER_HPET_TICK :       \
>>          0)
>>
>> If the signed multiply overflows in the positive case then the old max is
>> returned.  Note: this can return larger values then the old max.
>>
>> So I can re-work the patch to use this and still provide past times.  Which
>> path should I go with?
> Did you perhaps misunderstand me? I didn't ask for the patch to be
> changed. What I asked for is clarification that the issues previously
> having caused this code to be the way it is being still taken care of
> with your change.
>
> Jan
>

  reply	other threads:[~2014-02-28 14:01 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-26 18:00 [PATCH 0/1] Prevent one cause of "MP-BIOS bug: 8254 timer"... message from linux Don Slutz
2014-02-26 18:00 ` [PATCH 1/1] hpet: Act more like real hardware Don Slutz
2014-02-27  9:20   ` Jan Beulich
2014-02-27 23:56     ` Don Slutz
2014-02-28  9:06       ` Jan Beulich
2014-02-28 14:01         ` Don Slutz [this message]
2014-03-11 19:20           ` Don Slutz
2014-03-12  8:48             ` Jan Beulich
2014-03-12 13:43               ` Slutz, Donald Christopher
2014-03-12 19:23               ` Slutz, Donald Christopher
2014-04-08 23:42                 ` Don Slutz

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=531096D5.7020308@terremark.com \
    --to=dslutz@verizon.com \
    --cc=JBeulich@suse.com \
    --cc=keir@xen.org \
    --cc=xen-devel@lists.xen.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).