Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754742AbbLJJK6 (ORCPT ); Thu, 10 Dec 2015 04:10:58 -0500 Received: from mail-qg0-f50.google.com ([209.85.192.50]:34688 "EHLO mail-qg0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754397AbbLJJKO (ORCPT ); Thu, 10 Dec 2015 04:10:14 -0500 Subject: Re: [PATCH 5/5] x86/vdso: Enable vdso pvclock access on all vdso variants To: Andy Lutomirski , x86@kernel.org, Marcelo Tosatti , Radim Krcmar References: Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Alexander Graf From: Paolo Bonzini Message-ID: <56694171.6000202@redhat.com> Date: Thu, 10 Dec 2015 10:10:09 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4330 Lines: 163 On 10/12/2015 00:12, Andy Lutomirski wrote: > Now that pvclock doesn't require access to the fixmap, all vdso > variants can use it. > > The kernel side isn't wired up for 32-bit kernels yet, but this > covers 32-bit and x32 userspace on 64-bit kernels. > > Signed-off-by: Andy Lutomirski > --- > arch/x86/entry/vdso/vclock_gettime.c | 91 ++++++++++++++++-------------------- > 1 file changed, 40 insertions(+), 51 deletions(-) > > diff --git a/arch/x86/entry/vdso/vclock_gettime.c b/arch/x86/entry/vdso/vclock_gettime.c > index 59a98c25bde7..8602f06c759f 100644 > --- a/arch/x86/entry/vdso/vclock_gettime.c > +++ b/arch/x86/entry/vdso/vclock_gettime.c > @@ -17,8 +17,10 @@ > #include > #include > #include > +#include > #include > #include > +#include > > #define gtod (&VVAR(vsyscall_gtod_data)) > > @@ -43,10 +45,6 @@ extern u8 pvclock_page > > #ifndef BUILD_VDSO32 > > -#include > -#include > -#include > - > notrace static long vdso_fallback_gettime(long clock, struct timespec *ts) > { > long ret; > @@ -64,8 +62,42 @@ notrace static long vdso_fallback_gtod(struct timeval *tv, struct timezone *tz) > return ret; > } > > -#ifdef CONFIG_PARAVIRT_CLOCK > > +#else > + > +notrace static long vdso_fallback_gettime(long clock, struct timespec *ts) > +{ > + long ret; > + > + asm( > + "mov %%ebx, %%edx \n" > + "mov %2, %%ebx \n" > + "call __kernel_vsyscall \n" > + "mov %%edx, %%ebx \n" > + : "=a" (ret) > + : "0" (__NR_clock_gettime), "g" (clock), "c" (ts) > + : "memory", "edx"); > + return ret; > +} > + > +notrace static long vdso_fallback_gtod(struct timeval *tv, struct timezone *tz) > +{ > + long ret; > + > + asm( > + "mov %%ebx, %%edx \n" > + "mov %2, %%ebx \n" > + "call __kernel_vsyscall \n" > + "mov %%edx, %%ebx \n" > + : "=a" (ret) > + : "0" (__NR_gettimeofday), "g" (tv), "c" (tz) > + : "memory", "edx"); > + return ret; > +} > + > +#endif > + > +#ifdef CONFIG_PARAVIRT_CLOCK > static notrace const struct pvclock_vsyscall_time_info *get_pvti0(void) > { > return (const struct pvclock_vsyscall_time_info *)&pvclock_page; > @@ -109,9 +141,9 @@ static notrace cycle_t vread_pvclock(int *mode) > do { > version = pvti->version; > > - /* This is also a read barrier, so we'll read version first. */ > - tsc = rdtsc_ordered(); > + smp_rmb(); > > + tsc = rdtsc_ordered(); > pvti_tsc_to_system_mul = pvti->tsc_to_system_mul; > pvti_tsc_shift = pvti->tsc_shift; > pvti_system_time = pvti->system_time; > @@ -126,7 +158,7 @@ static notrace cycle_t vread_pvclock(int *mode) > pvclock_scale_delta(delta, pvti_tsc_to_system_mul, > pvti_tsc_shift); > > - /* refer to tsc.c read_tsc() comment for rationale */ > + /* refer to vread_tsc() comment for rationale */ > last = gtod->cycle_last; > > if (likely(ret >= last)) > @@ -136,49 +168,6 @@ static notrace cycle_t vread_pvclock(int *mode) > } > #endif > > -#else > - > -notrace static long vdso_fallback_gettime(long clock, struct timespec *ts) > -{ > - long ret; > - > - asm( > - "mov %%ebx, %%edx \n" > - "mov %2, %%ebx \n" > - "call __kernel_vsyscall \n" > - "mov %%edx, %%ebx \n" > - : "=a" (ret) > - : "0" (__NR_clock_gettime), "g" (clock), "c" (ts) > - : "memory", "edx"); > - return ret; > -} > - > -notrace static long vdso_fallback_gtod(struct timeval *tv, struct timezone *tz) > -{ > - long ret; > - > - asm( > - "mov %%ebx, %%edx \n" > - "mov %2, %%ebx \n" > - "call __kernel_vsyscall \n" > - "mov %%edx, %%ebx \n" > - : "=a" (ret) > - : "0" (__NR_gettimeofday), "g" (tv), "c" (tz) > - : "memory", "edx"); > - return ret; > -} > - > -#ifdef CONFIG_PARAVIRT_CLOCK > - > -static notrace cycle_t vread_pvclock(int *mode) > -{ > - *mode = VCLOCK_NONE; > - return 0; > -} > -#endif > - > -#endif > - > notrace static cycle_t vread_tsc(void) > { > cycle_t ret = (cycle_t)rdtsc_ordered(); > Acked-by: Paolo Bonzini -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/