aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/pvclock.c
diff options
context:
space:
mode:
authorMarcelo Tosatti <mtosatti@redhat.com>2012-11-27 20:28:50 -0500
committerMarcelo Tosatti <mtosatti@redhat.com>2012-11-27 20:29:06 -0500
commit42b5637d6989f75a7a0e8ea8633583564ff443ff (patch)
tree3052a7954a2a2e3ebc6fc698d580bf43082d035b /arch/x86/kernel/pvclock.c
parentb01578de45614c085be319229a52774b61ffe6fb (diff)
x86: pvclock: remove pvclock_shadow_time
Originally from Jeremy Fitzhardinge. We can copy the information directly from "struct pvclock_vcpu_time_info", remove pvclock_shadow_time. Reviewed-by: Glauber Costa <glommer@parallels.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kernel/pvclock.c')
-rw-r--r--arch/x86/kernel/pvclock.c57
1 files changed, 11 insertions, 46 deletions
diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c
index 12e47e210491..d59e60661794 100644
--- a/arch/x86/kernel/pvclock.c
+++ b/arch/x86/kernel/pvclock.c
@@ -19,21 +19,6 @@
19#include <linux/percpu.h> 19#include <linux/percpu.h>
20#include <asm/pvclock.h> 20#include <asm/pvclock.h>
21 21
22/*
23 * These are perodically updated
24 * xen: magic shared_info page
25 * kvm: gpa registered via msr
26 * and then copied here.
27 */
28struct pvclock_shadow_time {
29 u64 tsc_timestamp; /* TSC at last update of time vals. */
30 u64 system_timestamp; /* Time, in nanosecs, since boot. */
31 u32 tsc_to_nsec_mul;
32 int tsc_shift;
33 u32 version;
34 u8 flags;
35};
36
37static u8 valid_flags __read_mostly = 0; 22static u8 valid_flags __read_mostly = 0;
38 23
39void pvclock_set_flags(u8 flags) 24void pvclock_set_flags(u8 flags)
@@ -41,32 +26,11 @@ void pvclock_set_flags(u8 flags)
41 valid_flags = flags; 26 valid_flags = flags;
42} 27}
43 28
44static u64 pvclock_get_nsec_offset(struct pvclock_shadow_time *shadow) 29static u64 pvclock_get_nsec_offset(const struct pvclock_vcpu_time_info *src)
45{
46 u64 delta = native_read_tsc() - shadow->tsc_timestamp;
47 return pvclock_scale_delta(delta, shadow->tsc_to_nsec_mul,
48 shadow->tsc_shift);
49}
50
51/*
52 * Reads a consistent set of time-base values from hypervisor,
53 * into a shadow data area.
54 */
55static unsigned pvclock_get_time_values(struct pvclock_shadow_time *dst,
56 struct pvclock_vcpu_time_info *src)
57{ 30{
58 do { 31 u64 delta = native_read_tsc() - src->tsc_timestamp;
59 dst->version = src->version; 32 return pvclock_scale_delta(delta, src->tsc_to_system_mul,
60 rmb(); /* fetch version before data */ 33 src->tsc_shift);
61 dst->tsc_timestamp = src->tsc_timestamp;
62 dst->system_timestamp = src->system_time;
63 dst->tsc_to_nsec_mul = src->tsc_to_system_mul;
64 dst->tsc_shift = src->tsc_shift;
65 dst->flags = src->flags;
66 rmb(); /* test version after fetching data */
67 } while ((src->version & 1) || (dst->version != src->version));
68
69 return dst->version;
70} 34}
71 35
72unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src) 36unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src)
@@ -90,21 +54,22 @@ void pvclock_resume(void)
90 54
91cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src) 55cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
92{ 56{
93 struct pvclock_shadow_time shadow;
94 unsigned version; 57 unsigned version;
95 cycle_t ret, offset; 58 cycle_t ret, offset;
96 u64 last; 59 u64 last;
60 u8 flags;
97 61
98 do { 62 do {
99 version = pvclock_get_time_values(&shadow, src); 63 version = src->version;
100 rdtsc_barrier(); 64 rdtsc_barrier();
101 offset = pvclock_get_nsec_offset(&shadow); 65 offset = pvclock_get_nsec_offset(src);
102 ret = shadow.system_timestamp + offset; 66 ret = src->system_time + offset;
67 flags = src->flags;
103 rdtsc_barrier(); 68 rdtsc_barrier();
104 } while (version != src->version); 69 } while ((src->version & 1) || version != src->version);
105 70
106 if ((valid_flags & PVCLOCK_TSC_STABLE_BIT) && 71 if ((valid_flags & PVCLOCK_TSC_STABLE_BIT) &&
107 (shadow.flags & PVCLOCK_TSC_STABLE_BIT)) 72 (flags & PVCLOCK_TSC_STABLE_BIT))
108 return ret; 73 return ret;
109 74
110 /* 75 /*