From: Jan Beulich <jbeulich@suse.com>
To: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>
Cc: "Andrew Cooper" <andrew.cooper3@citrix.com>,
"Roger Pau Monné" <roger.pau@citrix.com>
Subject: [PATCH] x86/time: adjust handling of negative delta in stime2tsc()
Date: Tue, 10 Feb 2026 11:04:59 +0100 [thread overview]
Message-ID: <f97bbfb5-389c-4845-84fb-e6f07ba0ade8@suse.com> (raw)
When we cap negative values to 0 (see code comment as to why), going
through scale_delta() is pointless - it'll return 0 anyway. Therefore make
the call conditional (and then also the one to scale_reciprocal()), adding
a comment as to why there is this capping.
Modernize types used while there, and switch to usiong initializers for
the local variables.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
Adding likely() to the conditional here does make a difference. Question
is whether to do so, seeing that there looks to be a possibility (of
unknown frequency) for the delta to be non-positive.
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -1176,20 +1176,26 @@ uint64_t __init calibrate_apic_timer(voi
return elapsed * CALIBRATE_FRAC;
}
-u64 stime2tsc(s_time_t stime)
+uint64_t stime2tsc(s_time_t stime)
{
- struct cpu_time *t;
- struct time_scale sys_to_tsc;
- s_time_t stime_delta;
+ const struct cpu_time *t = &this_cpu(cpu_time);
+ s_time_t stime_delta = stime - t->stamp.local_stime;
+ int64_t delta = 0;
- t = &this_cpu(cpu_time);
- sys_to_tsc = scale_reciprocal(t->tsc_scale);
+ /*
+ * While for reprogram_timer() the capping at 0 isn't relevant (the returned
+ * value is likely in the past anyway then, by the time it is used), for
+ * cstate_restore_tsc() this is relevant: We need to avoid moving the TSC
+ * backwards (relative to when it may last have been read).
+ */
+ if ( stime_delta > 0 )
+ {
+ struct time_scale sys_to_tsc = scale_reciprocal(t->tsc_scale);
- stime_delta = stime - t->stamp.local_stime;
- if ( stime_delta < 0 )
- stime_delta = 0;
+ delta = scale_delta(stime_delta, &sys_to_tsc);
+ }
- return t->stamp.local_tsc + scale_delta(stime_delta, &sys_to_tsc);
+ return t->stamp.local_tsc + delta;
}
void cstate_restore_tsc(void)
next reply other threads:[~2026-02-10 10:05 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-10 10:04 Jan Beulich [this message]
2026-03-25 17:57 ` [PATCH] x86/time: adjust handling of negative delta in stime2tsc() Roger Pau Monné
2026-03-26 8:05 ` 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=f97bbfb5-389c-4845-84fb-e6f07ba0ade8@suse.com \
--to=jbeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=roger.pau@citrix.com \
--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.