diff options
author | Joao Martins <joao.m.martins@oracle.com> | 2017-11-08 12:19:55 -0500 |
---|---|---|
committer | Boris Ostrovsky <boris.ostrovsky@oracle.com> | 2017-11-08 16:33:14 -0500 |
commit | 9f08890ab906abaf9d4c1bad8111755cbd302260 (patch) | |
tree | b002987d2330af60099f058fbf74c9ba13ec8c6f | |
parent | 001f60e1f662a6dee1630a2915401aaf5959d479 (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.c | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/pvclock.h | 19 | ||||
-rw-r--r-- | arch/x86/kernel/kvmclock.c | 7 | ||||
-rw-r--r-- | arch/x86/kernel/pvclock.c | 14 | ||||
-rw-r--r-- | drivers/ptp/ptp_kvm.c | 2 |
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 | ||
8 | extern struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void); | ||
9 | #else | ||
10 | static 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 */ |
17 | u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src); | 8 | u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src); |
18 | u8 pvclock_read_flags(struct pvclock_vcpu_time_info *src); | 9 | u8 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 | ||
96 | void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti); | ||
97 | struct pvclock_vsyscall_time_info *pvclock_get_pvti_cpu0_va(void); | ||
98 | #else | ||
99 | static 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); | |||
47 | static struct pvclock_vsyscall_time_info *hv_clock; | 47 | static struct pvclock_vsyscall_time_info *hv_clock; |
48 | static struct pvclock_wall_clock wall_clock; | 48 | static struct pvclock_wall_clock wall_clock; |
49 | 49 | ||
50 | struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void) | ||
51 | { | ||
52 | return hv_clock; | ||
53 | } | ||
54 | EXPORT_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 | ||
29 | static u8 valid_flags __read_mostly = 0; | 30 | static u8 valid_flags __read_mostly = 0; |
31 | static struct pvclock_vsyscall_time_info *pvti_cpu0_va __read_mostly; | ||
30 | 32 | ||
31 | void pvclock_set_flags(u8 flags) | 33 | void 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 | |||
150 | void 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 | |||
156 | struct pvclock_vsyscall_time_info *pvclock_get_pvti_cpu0_va(void) | ||
157 | { | ||
158 | return pvti_cpu0_va; | ||
159 | } | ||
160 | EXPORT_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; |