|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/5] x86/time: refactor read_platform_stime()
To fetch the last read from the clocksource which was used to
calculate system_time. In the case of clocksource=tsc we will
use it to set tsc_timestamp.
Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx>
---
Cc: Keir Fraser <keir@xxxxxxx>
Cc: Jan Beulich <jbeulich@xxxxxxxx>
Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
xen/arch/x86/time.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index 5af8902..89c35d0 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -508,6 +508,7 @@ static s_time_t stime_platform_stamp; /* System time at
below platform time */
static u64 platform_timer_stamp; /* Platform time at above system time */
static u64 plt_stamp64; /* 64-bit platform counter stamp */
static u64 plt_stamp; /* hardware-width platform counter stamp */
+static u64 plt_stamp_counter; /* last read since read_counter */
static struct timer plt_overflow_timer;
static s_time_t __read_platform_stime(u64 platform_time)
@@ -566,7 +567,7 @@ static void plt_overflow(void *unused)
set_timer(&plt_overflow_timer, NOW() + plt_overflow_period);
}
-static s_time_t read_platform_stime(void)
+static s_time_t read_platform_stime(u64 *stamp)
{
u64 count;
s_time_t stime;
@@ -574,8 +575,11 @@ static s_time_t read_platform_stime(void)
ASSERT(!local_irq_is_enabled());
spin_lock(&platform_timer_lock);
- count = plt_stamp64 + ((plt_src.read_counter() - plt_stamp) & plt_mask);
+ plt_stamp_counter = plt_src.read_counter();
+ count = plt_stamp64 + ((plt_stamp_counter - plt_stamp) & plt_mask);
stime = __read_platform_stime(count);
+ if (stamp)
+ *stamp = plt_stamp_counter;
spin_unlock(&platform_timer_lock);
return stime;
@@ -693,7 +697,7 @@ void cstate_restore_tsc(void)
if ( boot_cpu_has(X86_FEATURE_NONSTOP_TSC) )
return;
- write_tsc(stime2tsc(read_platform_stime()));
+ write_tsc(stime2tsc(read_platform_stime(NULL)));
}
/***************************************************************************
@@ -1012,7 +1016,7 @@ int cpu_frequency_change(u64 freq)
local_irq_disable();
/* Platform time /first/, as we may be delayed by platform_timer_lock. */
- t->stime_master_stamp = read_platform_stime();
+ t->stime_master_stamp = read_platform_stime(NULL);
/* TSC-extrapolated time may be bogus after frequency change. */
/*t->stime_local_stamp = get_s_time();*/
t->stime_local_stamp = t->stime_master_stamp;
@@ -1330,7 +1334,7 @@ static void time_calibration_tsc_rendezvous(void *_r)
if ( r->master_stime == 0 )
{
- r->master_stime = read_platform_stime();
+ r->master_stime = read_platform_stime(NULL);
r->master_tsc_stamp = rdtsc();
}
atomic_inc(&r->semaphore);
@@ -1422,7 +1426,7 @@ void init_percpu_time(void)
local_irq_save(flags);
t->local_tsc_stamp = rdtsc();
- now = read_platform_stime();
+ now = read_platform_stime(NULL);
local_irq_restore(flags);
t->stime_master_stamp = now;
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |