aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoao Martins <joao.m.martins@oracle.com>2017-11-08 12:19:55 -0500
committerBoris Ostrovsky <boris.ostrovsky@oracle.com>2017-11-08 16:33:14 -0500
commit9f08890ab906abaf9d4c1bad8111755cbd302260 (patch)
treeb002987d2330af60099f058fbf74c9ba13ec8c6f
parent001f60e1f662a6dee1630a2915401aaf5959d479 (diff)
x86/pvclock: add setter for pvclock_pvti_cpu0_va
Right now there is only a pvclock_pvti_cpu0_va() which is defined on kvmclock since: commit dac16fba6fc5 ("x86/vdso: Get pvclock data from the vvar VMA instead of the fixmap") The only user of this interface so far is kvm. This commit adds a setter function for the pvti page and moves pvclock_pvti_cpu0_va to pvclock, which is a more generic place to have it; and would allow other PV clocksources to use it, such as Xen. While moving pvclock_pvti_cpu0_va into pvclock, rename also this function to pvclock_get_pvti_cpu0_va (including its call sites) to be symmetric with the setter (pvclock_set_pvti_cpu0_va). Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Acked-by: Andy Lutomirski <luto@kernel.org> Acked-by: Paolo Bonzini <pbonzini@redhat.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
-rw-r--r--arch/x86/entry/vdso/vma.c2
-rw-r--r--arch/x86/include/asm/pvclock.h19
-rw-r--r--arch/x86/kernel/kvmclock.c7
-rw-r--r--arch/x86/kernel/pvclock.c14
-rw-r--r--drivers/ptp/ptp_kvm.c2
5 files changed, 27 insertions, 17 deletions
diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
index 1911310959f8..a77fd3c8d824 100644
--- a/arch/x86/entry/vdso/vma.c
+++ b/arch/x86/entry/vdso/vma.c
@@ -112,7 +112,7 @@ static int vvar_fault(const struct vm_special_mapping *sm,
112 __pa_symbol(&__vvar_page) >> PAGE_SHIFT); 112 __pa_symbol(&__vvar_page) >> PAGE_SHIFT);
113 } else if (sym_offset == image->sym_pvclock_page) { 113 } else if (sym_offset == image->sym_pvclock_page) {
114 struct pvclock_vsyscall_time_info *pvti = 114 struct pvclock_vsyscall_time_info *pvti =
115 pvclock_pvti_cpu0_va(); 115 pvclock_get_pvti_cpu0_va();
116 if (pvti && vclock_was_used(VCLOCK_PVCLOCK)) { 116 if (pvti && vclock_was_used(VCLOCK_PVCLOCK)) {
117 ret = vm_insert_pfn( 117 ret = vm_insert_pfn(
118 vma, 118 vma,
diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h
index 448cfe1b48cf..55325f934d71 100644
--- a/arch/x86/include/asm/pvclock.h
+++ b/arch/x86/include/asm/pvclock.h
@@ -4,15 +4,6 @@
4#include <linux/clocksource.h> 4#include <linux/clocksource.h>
5#include <asm/pvclock-abi.h> 5#include <asm/pvclock-abi.h>
6 6
7#ifdef CONFIG_KVM_GUEST
8extern struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void);
9#else
10static inline struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void)
11{
12 return NULL;
13}
14#endif
15
16/* some helper functions for xen and kvm pv clock sources */ 7/* some helper functions for xen and kvm pv clock sources */
17u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src); 8u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src);
18u8 pvclock_read_flags(struct pvclock_vcpu_time_info *src); 9u8 pvclock_read_flags(struct pvclock_vcpu_time_info *src);
@@ -101,4 +92,14 @@ struct pvclock_vsyscall_time_info {
101 92
102#define PVTI_SIZE sizeof(struct pvclock_vsyscall_time_info) 93#define PVTI_SIZE sizeof(struct pvclock_vsyscall_time_info)
103 94
95#ifdef CONFIG_PARAVIRT_CLOCK
96void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti);
97struct pvclock_vsyscall_time_info *pvclock_get_pvti_cpu0_va(void);
98#else
99static inline struct pvclock_vsyscall_time_info *pvclock_get_pvti_cpu0_va(void)
100{
101 return NULL;
102}
103#endif
104
104#endif /* _ASM_X86_PVCLOCK_H */ 105#endif /* _ASM_X86_PVCLOCK_H */
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
index d88967659098..538738047ff5 100644
--- a/arch/x86/kernel/kvmclock.c
+++ b/arch/x86/kernel/kvmclock.c
@@ -47,12 +47,6 @@ early_param("no-kvmclock", parse_no_kvmclock);
47static struct pvclock_vsyscall_time_info *hv_clock; 47static struct pvclock_vsyscall_time_info *hv_clock;
48static struct pvclock_wall_clock wall_clock; 48static struct pvclock_wall_clock wall_clock;
49 49
50struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void)
51{
52 return hv_clock;
53}
54EXPORT_SYMBOL_GPL(pvclock_pvti_cpu0_va);
55
56/* 50/*
57 * The wallclock is the time of day when we booted. Since then, some time may 51 * The wallclock is the time of day when we booted. Since then, some time may
58 * have elapsed since the hypervisor wrote the data. So we try to account for 52 * have elapsed since the hypervisor wrote the data. So we try to account for
@@ -334,6 +328,7 @@ int __init kvm_setup_vsyscall_timeinfo(void)
334 return 1; 328 return 1;
335 } 329 }
336 330
331 pvclock_set_pvti_cpu0_va(hv_clock);
337 put_cpu(); 332 put_cpu();
338 333
339 kvm_clock.archdata.vclock_mode = VCLOCK_PVCLOCK; 334 kvm_clock.archdata.vclock_mode = VCLOCK_PVCLOCK;
diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c
index 5c3f6d6a5078..761f6af6efa5 100644
--- a/arch/x86/kernel/pvclock.c
+++ b/arch/x86/kernel/pvclock.c
@@ -25,8 +25,10 @@
25 25
26#include <asm/fixmap.h> 26#include <asm/fixmap.h>
27#include <asm/pvclock.h> 27#include <asm/pvclock.h>
28#include <asm/vgtod.h>
28 29
29static u8 valid_flags __read_mostly = 0; 30static u8 valid_flags __read_mostly = 0;
31static struct pvclock_vsyscall_time_info *pvti_cpu0_va __read_mostly;
30 32
31void pvclock_set_flags(u8 flags) 33void pvclock_set_flags(u8 flags)
32{ 34{
@@ -144,3 +146,15 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock,
144 146
145 set_normalized_timespec(ts, now.tv_sec, now.tv_nsec); 147 set_normalized_timespec(ts, now.tv_sec, now.tv_nsec);
146} 148}
149
150void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti)
151{
152 WARN_ON(vclock_was_used(VCLOCK_PVCLOCK));
153 pvti_cpu0_va = pvti;
154}
155
156struct pvclock_vsyscall_time_info *pvclock_get_pvti_cpu0_va(void)
157{
158 return pvti_cpu0_va;
159}
160EXPORT_SYMBOL_GPL(pvclock_get_pvti_cpu0_va);
diff --git a/drivers/ptp/ptp_kvm.c b/drivers/ptp/ptp_kvm.c
index e04d7b2ecb3a..c67dd11e08b1 100644
--- a/drivers/ptp/ptp_kvm.c
+++ b/drivers/ptp/ptp_kvm.c
@@ -182,7 +182,7 @@ static int __init ptp_kvm_init(void)
182 return -ENODEV; 182 return -ENODEV;
183 183
184 clock_pair_gpa = slow_virt_to_phys(&clock_pair); 184 clock_pair_gpa = slow_virt_to_phys(&clock_pair);
185 hv_clock = pvclock_pvti_cpu0_va(); 185 hv_clock = pvclock_get_pvti_cpu0_va();
186 186
187 if (!hv_clock) 187 if (!hv_clock)
188 return -ENODEV; 188 return -ENODEV;