All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Roger Pau Monné" <roger.pau@citrix.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Teddy Astie <teddy.astie@vates.tech>
Subject: Re: [PATCH v2 RFC] x86/time: avoid early uses of NOW() to return zero
Date: Wed, 20 May 2026 12:02:53 +0200	[thread overview]
Message-ID: <ag2GzXm-yg12DQY5@macbook.local> (raw)
In-Reply-To: <547161b2-2fea-4576-a635-62838ffa2d33@suse.com>

On Mon, May 18, 2026 at 10:05:41AM +0200, Jan Beulich wrote:
> On 15.05.2026 15:12, Roger Pau Monné wrote:
> > On Fri, May 15, 2026 at 09:15:40AM +0200, Jan Beulich wrote:
> >> On 14.05.2026 17:56, Roger Pau Monné wrote:
> >>> On Wed, May 13, 2026 at 08:44:46AM +0200, Jan Beulich wrote:
> >>>> @@ -2623,6 +2640,21 @@ int __init init_xen_time(void)
> >>>>      return 0;
> >>>>  }
> >>>>  
> >>>> +/* BSP-only function to pre-set an approximate TSC scale. */
> >>>> +void __init preset_tsc_scale(unsigned long freq)
> >>>> +{
> >>>> +    struct cpu_time *t = &this_cpu(cpu_time);
> >>>> +
> >>>> +    /*
> >>>> +     * The incoming frequency is only approximate (nominal).  Increase it by
> >>>> +     * 1% to make NOW() output rather a little too slow than too fast, thus
> >>>> +     * avoiding a possible backwards jump once the final scale is set.
> >>>> +     */
> >>>> +    freq += DIV_ROUND_UP(freq, 100);
> >>>
> >>> To avoid such possible jump backwards, won't it safer to also update
> >>> the ->local_stime and ->local_tsc fields at the time the new scale is
> >>> set?  Updatign those ahead of setting the new scale should avoid any
> >>> backward jumps.
> >>
> >> ->stamp.local_tsc does get updated; you merely dropped that line from reply
> >> context. As to local_stime - how could we possibly set that, when we didn't
> >> get through init_platform_timer() yet? Leaving it at 0 is the correct
> >> match for setting local_tsc to boot_tsc_stamp.
> > 
> > Please bear with me, maybe I'm not understanding exactly to what the
> > code comment refers to as "possible backwards jump once the final
> > scale is set".  I assume you refer to the setting of scale
> > early_time_init()?  The ->stamp.local_tsc value also gets updated at
> > that point, so it's not possible for the timer going backwards?
> 
> It is updated there, but only to boot_tsc_stamp. I.e. no change at all
> if preset_tsc_scale() set the field already.

Couldn't we do the following in early_init_time() to ensure time
doesn't go backwards:

    if ( t->tsc_scale.mul_frac )
    {
        /*
         * Update time snapshot to ensure time doesn't go backwards as a
         * result of the scale change done below.
         */
        t->stamp.local_tsc = rdtsc_ordered();
        t->stamp.local_stime = get_s_time_fixed(t->stamp.local_tsc);
    }
    else
        t->stamp.local_tsc = boot_tsc_stamp;

    set_time_scale(&t->tsc_scale, tmp);
    init_percpu_time();

That's kind of the same logic that's used in cpu_frequency_change()
ahead of calling set_time_scale().

> > This changed with the addition of the init_percpu_time() call in
> > early_time_init(), and makes the setting of "t->stamp.local_tsc =
> > boot_tsc_stamp" pointless, as it will get overwritten by the logic in
> > init_percpu_time() a couple of lines after?
> 
> When making these changes, I first thought so too. But no, that write
> isn't pointless: In case preset_tsc_scale() wasn't called, leaving the
> field at 0 would break the use of get_s_time_fixed() out of
> init_percpu_time(). (Iirc I only noticed this because of having put
> debug printk()s there for other purposes.)

I see, yes, that would be needed.

Regards, Roger.


  reply	other threads:[~2026-05-20 10:03 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-13  6:44 [PATCH v2 RFC] x86/time: avoid early uses of NOW() to return zero Jan Beulich
2026-05-14 15:56 ` Roger Pau Monné
2026-05-15  7:15   ` Jan Beulich
2026-05-15 13:12     ` Roger Pau Monné
2026-05-18  8:05       ` Jan Beulich
2026-05-20 10:02         ` Roger Pau Monné [this message]
2026-05-20 12:30           ` Jan Beulich

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=ag2GzXm-yg12DQY5@macbook.local \
    --to=roger.pau@citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=jbeulich@suse.com \
    --cc=teddy.astie@vates.tech \
    --cc=xen-devel@lists.xenproject.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.