Re: [PATCH v7 2/5] x86/pvclock: add setter for pvclock_pvti_cpu0_va
From: Joao Martins
Date: Tue Nov 07 2017 - 14:30:54 EST
On 11/06/2017 04:09 PM, Paolo Bonzini wrote:
> On 19/10/2017 15:39, Joao Martins wrote:
>> 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.
>>
>> Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx>
>> Acked-by: Andy Lutomirski <luto@xxxxxxxxxx>
>
> Acked-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
>
> IOW, the Xen folks are free to pick up the whole series. :)
>
Thank you!
I guess only x86 maintainers Ack is left - any comments?
Joao
> Paolo
>
>> ---
>> Changes since v1:
>> * Rebased: the only conflict was that I had move the export
>> pvclock_pvti_cpu0_va() symbol as it is used by kvm PTP driver.
>> * Do not initialize pvti_cpu0_va to NULL (checkpatch error)
>> ( Comments from Andy Lutomirski )
>> * Removed asm/pvclock.h 'pvclock_set_pvti_cpu0_va' definition
>> for non !PARAVIRT_CLOCK to better track screwed Kconfig stuff.
>> * Add his Acked-by (provided the previous adjustment was made)
>>
>> Changes since RFC:
>> (Comments from Andy Lutomirski)
>> * Add __init to pvclock_set_pvti_cpu0_va
>> * Add WARN_ON(vclock_was_used(VCLOCK_PVCLOCK)) to
>> pvclock_set_pvti_cpu0_va
>> ---
>> arch/x86/include/asm/pvclock.h | 19 ++++++++++---------
>> arch/x86/kernel/kvmclock.c | 7 +------
>> arch/x86/kernel/pvclock.c | 14 ++++++++++++++
>> 3 files changed, 25 insertions(+), 15 deletions(-)
>>
>> diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h
>> index 448cfe1b48cf..6f228f90cdd7 100644
>> --- a/arch/x86/include/asm/pvclock.h
>> +++ b/arch/x86/include/asm/pvclock.h
>> @@ -4,15 +4,6 @@
>> #include <linux/clocksource.h>
>> #include <asm/pvclock-abi.h>
>>
>> -#ifdef CONFIG_KVM_GUEST
>> -extern struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void);
>> -#else
>> -static inline struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void)
>> -{
>> - return NULL;
>> -}
>> -#endif
>> -
>> /* some helper functions for xen and kvm pv clock sources */
>> u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src);
>> u8 pvclock_read_flags(struct pvclock_vcpu_time_info *src);
>> @@ -101,4 +92,14 @@ struct pvclock_vsyscall_time_info {
>>
>> #define PVTI_SIZE sizeof(struct pvclock_vsyscall_time_info)
>>
>> +#ifdef CONFIG_PARAVIRT_CLOCK
>> +void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti);
>> +struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void);
>> +#else
>> +static inline struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void)
>> +{
>> + return NULL;
>> +}
>> +#endif
>> +
>> #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);
>> static struct pvclock_vsyscall_time_info *hv_clock;
>> static struct pvclock_wall_clock wall_clock;
>>
>> -struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void)
>> -{
>> - return hv_clock;
>> -}
>> -EXPORT_SYMBOL_GPL(pvclock_pvti_cpu0_va);
>> -
>> /*
>> * The wallclock is the time of day when we booted. Since then, some time may
>> * 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)
>> return 1;
>> }
>>
>> + pvclock_set_pvti_cpu0_va(hv_clock);
>> put_cpu();
>>
>> kvm_clock.archdata.vclock_mode = VCLOCK_PVCLOCK;
>> diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c
>> index 5c3f6d6a5078..cb7d6d9c9c2d 100644
>> --- a/arch/x86/kernel/pvclock.c
>> +++ b/arch/x86/kernel/pvclock.c
>> @@ -25,8 +25,10 @@
>>
>> #include <asm/fixmap.h>
>> #include <asm/pvclock.h>
>> +#include <asm/vgtod.h>
>>
>> static u8 valid_flags __read_mostly = 0;
>> +static struct pvclock_vsyscall_time_info *pvti_cpu0_va __read_mostly;
>>
>> void pvclock_set_flags(u8 flags)
>> {
>> @@ -144,3 +146,15 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock,
>>
>> set_normalized_timespec(ts, now.tv_sec, now.tv_nsec);
>> }
>> +
>> +void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti)
>> +{
>> + WARN_ON(vclock_was_used(VCLOCK_PVCLOCK));
>> + pvti_cpu0_va = pvti;
>> +}
>> +
>> +struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void)
>> +{
>> + return pvti_cpu0_va;
>> +}
>> +EXPORT_SYMBOL_GPL(pvclock_pvti_cpu0_va);
>>
>