|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 3/6] x86/time: streamline platform time init on plt_update()
And use to initialize platform time solely for clocksource=tsc,
as opposed to initializing platform overflow timer, which would
only fire in ~180 years (on 2.2 Ghz Broadwell processor).
Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx>
---
Cc: Jan Beulich <jbeulich@xxxxxxxx>
Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Changes since v2:
- Remove pointless intializer and replace it with the
platform_time init return.
- s/plt_init/plt_update/g
---
xen/arch/x86/time.c | 37 +++++++++++++++++++++++++++++++------
1 file changed, 31 insertions(+), 6 deletions(-)
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index b2a11a8..a03127e 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -526,17 +526,31 @@ static s_time_t __read_platform_stime(u64 platform_time)
return (stime_platform_stamp + scale_delta(diff, &plt_scale));
}
+static void __plt_update(void)
+{
+ u64 count;
+
+ ASSERT(spin_is_locked(&platform_timer_lock));
+ count = plt_src.read_counter();
+ plt_stamp64 += (count - plt_stamp) & plt_mask;
+ plt_stamp = count;
+}
+
+static void plt_update(void)
+{
+ spin_lock_irq(&platform_timer_lock);
+ __plt_update();
+ spin_unlock_irq(&platform_timer_lock);
+}
+
static void plt_overflow(void *unused)
{
int i;
- u64 count;
s_time_t now, plt_now, plt_wrap;
spin_lock_irq(&platform_timer_lock);
- count = plt_src.read_counter();
- plt_stamp64 += (count - plt_stamp) & plt_mask;
- plt_stamp = count;
+ __plt_update();
now = NOW();
plt_wrap = __read_platform_stime(plt_stamp64);
@@ -630,10 +644,21 @@ static s64 __init try_platform_timer(struct
platform_timesource *pts)
set_time_scale(&plt_scale, pts->frequency);
- plt_overflow_period = scale_delta(
- 1ull << (pts->counter_bits - 1), &plt_scale);
plt_src = *pts;
+ if ( pts == &plt_tsc )
+ {
+ plt_update();
+ }
+ else
+ {
+ plt_overflow_period = scale_delta(
+ 1ull << (pts->counter_bits - 1), &plt_scale);
+
+ printk(XENLOG_INFO "Platform timer overflow period is %lu msecs\n",
+ plt_overflow_period / MILLISECS(1));
+ }
+
return rc;
}
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |