x86/vdso: Use generic VDSO clock mode storage
Switch to the generic VDSO clock mode storage. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com> (VDSO parts) Acked-by: Juergen Gross <jgross@suse.com> (Xen parts) Acked-by: Paolo Bonzini <pbonzini@redhat.com> (KVM parts) Link: https://lkml.kernel.org/r/20200207124403.152039903@linutronix.de
This commit is contained in:
@@ -4,15 +4,10 @@
|
||||
#ifndef _ASM_X86_CLOCKSOURCE_H
|
||||
#define _ASM_X86_CLOCKSOURCE_H
|
||||
|
||||
#define VCLOCK_NONE 0 /* No vDSO clock available. */
|
||||
#define VCLOCK_TSC 1 /* vDSO should use vread_tsc. */
|
||||
#define VCLOCK_PVCLOCK 2 /* vDSO should use vread_pvclock. */
|
||||
#define VCLOCK_HVCLOCK 3 /* vDSO should use vread_hvclock. */
|
||||
#define VCLOCK_MAX 3
|
||||
|
||||
struct arch_clocksource_data {
|
||||
int vclock_mode;
|
||||
};
|
||||
#define VDSO_ARCH_CLOCKMODES \
|
||||
VDSO_CLOCKMODE_TSC, \
|
||||
VDSO_CLOCKMODE_PVCLOCK, \
|
||||
VDSO_CLOCKMODE_HVCLOCK
|
||||
|
||||
extern unsigned int vclocks_used;
|
||||
|
||||
|
@@ -46,9 +46,9 @@ typedef int (*hyperv_fill_flush_list_func)(
|
||||
#define hv_set_reference_tsc(val) \
|
||||
wrmsrl(HV_X64_MSR_REFERENCE_TSC, val)
|
||||
#define hv_set_clocksource_vdso(val) \
|
||||
((val).archdata.vclock_mode = VCLOCK_HVCLOCK)
|
||||
((val).vdso_clock_mode = VDSO_CLOCKMODE_HVCLOCK)
|
||||
#define hv_enable_vdso_clocksource() \
|
||||
vclocks_set_used(VCLOCK_HVCLOCK);
|
||||
vclocks_set_used(VDSO_CLOCKMODE_HVCLOCK);
|
||||
#define hv_get_raw_timer() rdtsc_ordered()
|
||||
|
||||
void hyperv_callback_vector(void);
|
||||
|
@@ -243,7 +243,7 @@ static u64 vread_hvclock(void)
|
||||
|
||||
static inline u64 __arch_get_hw_counter(s32 clock_mode)
|
||||
{
|
||||
if (likely(clock_mode == VCLOCK_TSC))
|
||||
if (likely(clock_mode == VDSO_CLOCKMODE_TSC))
|
||||
return (u64)rdtsc_ordered();
|
||||
/*
|
||||
* For any memory-mapped vclock type, we need to make sure that gcc
|
||||
@@ -252,13 +252,13 @@ static inline u64 __arch_get_hw_counter(s32 clock_mode)
|
||||
* question isn't enabled, which will segfault. Hence the barriers.
|
||||
*/
|
||||
#ifdef CONFIG_PARAVIRT_CLOCK
|
||||
if (clock_mode == VCLOCK_PVCLOCK) {
|
||||
if (clock_mode == VDSO_CLOCKMODE_PVCLOCK) {
|
||||
barrier();
|
||||
return vread_pvclock();
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_HYPERV_TIMER
|
||||
if (clock_mode == VCLOCK_HVCLOCK) {
|
||||
if (clock_mode == VDSO_CLOCKMODE_HVCLOCK) {
|
||||
barrier();
|
||||
return vread_hvclock();
|
||||
}
|
||||
|
@@ -21,13 +21,6 @@ struct vdso_data *__x86_get_k_vdso_data(void)
|
||||
}
|
||||
#define __arch_get_k_vdso_data __x86_get_k_vdso_data
|
||||
|
||||
static __always_inline
|
||||
int __x86_get_clock_mode(struct timekeeper *tk)
|
||||
{
|
||||
return tk->tkr_mono.clock->archdata.vclock_mode;
|
||||
}
|
||||
#define __arch_get_clock_mode __x86_get_clock_mode
|
||||
|
||||
/* The asm-generic header needs to be included after the definitions above */
|
||||
#include <asm-generic/vdso/vsyscall.h>
|
||||
|
||||
|
Reference in New Issue
Block a user