From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753792AbcADXOd (ORCPT ); Mon, 4 Jan 2016 18:14:33 -0500 Received: from mail.kernel.org ([198.145.29.136]:55862 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752012AbcADXOb (ORCPT ); Mon, 4 Jan 2016 18:14:31 -0500 From: Andy Lutomirski To: X86 ML , Radim Krcmar , Paolo Bonzini , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Alexander Graf Cc: Andy Lutomirski Subject: [PATCH] x86/vdso/pvclock: Protect STABLE check with the seqcount Date: Mon, 4 Jan 2016 15:14:28 -0800 Message-Id: <755dcedb17269e1d7ce12a9a713dea303835137e.1451949191.git.luto@kernel.org> X-Mailer: git-send-email 2.4.3 In-Reply-To: <20160104225904.GA4947@amt.cnet> References: <20160104225904.GA4947@amt.cnet> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If the clock becomes unstable while we're reading it, we need to bail. We can do this by simply moving the check into the seqcount loop. Reported-by: Marcelo Tosatti Signed-off-by: Andy Lutomirski --- Marcelo, how's this? arch/x86/entry/vdso/vclock_gettime.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/x86/entry/vdso/vclock_gettime.c b/arch/x86/entry/vdso/vclock_gettime.c index 8602f06c759f..1a50e09c945b 100644 --- a/arch/x86/entry/vdso/vclock_gettime.c +++ b/arch/x86/entry/vdso/vclock_gettime.c @@ -126,23 +126,23 @@ static notrace cycle_t vread_pvclock(int *mode) * * On Xen, we don't appear to have that guarantee, but Xen still * supplies a valid seqlock using the version field. - + * * We only do pvclock vdso timing at all if * PVCLOCK_TSC_STABLE_BIT is set, and we interpret that bit to * mean that all vCPUs have matching pvti and that the TSC is * synced, so we can just look at vCPU 0's pvti. */ - if (unlikely(!(pvti->flags & PVCLOCK_TSC_STABLE_BIT))) { - *mode = VCLOCK_NONE; - return 0; - } - do { version = pvti->version; smp_rmb(); + if (unlikely(!(pvti->flags & PVCLOCK_TSC_STABLE_BIT))) { + *mode = VCLOCK_NONE; + return 0; + } + tsc = rdtsc_ordered(); pvti_tsc_to_system_mul = pvti->tsc_to_system_mul; pvti_tsc_shift = pvti->tsc_shift; -- 2.4.3