diff options
author | Marcelo Tosatti <mtosatti@redhat.com> | 2012-11-27 20:28:50 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2012-11-27 20:29:06 -0500 |
commit | 42b5637d6989f75a7a0e8ea8633583564ff443ff (patch) | |
tree | 3052a7954a2a2e3ebc6fc698d580bf43082d035b /arch/x86/kernel/pvclock.c | |
parent | b01578de45614c085be319229a52774b61ffe6fb (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.c | 57 |
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 | */ | ||
28 | struct 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 | |||
37 | static u8 valid_flags __read_mostly = 0; | 22 | static u8 valid_flags __read_mostly = 0; |
38 | 23 | ||
39 | void pvclock_set_flags(u8 flags) | 24 | void 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 | ||
44 | static u64 pvclock_get_nsec_offset(struct pvclock_shadow_time *shadow) | 29 | static 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 | */ | ||
55 | static 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 | ||
72 | unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src) | 36 | unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src) |
@@ -90,21 +54,22 @@ void pvclock_resume(void) | |||
90 | 54 | ||
91 | cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src) | 55 | cycle_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 | /* |