From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752898AbbDFU5f (ORCPT ); Mon, 6 Apr 2015 16:57:35 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35389 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751331AbbDFU5c (ORCPT ); Mon, 6 Apr 2015 16:57:32 -0400 Date: Mon, 6 Apr 2015 17:57:16 -0300 From: Marcelo Tosatti To: Radim =?utf-8?B?S3LEjW3DocWZ?= Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Paolo Bonzini , Andy Lutomirski , stable@vger.kernel.org Subject: Re: [PATCH] x86: vdso: fix pvclock races with task migration Message-ID: <20150406205716.GA1896@amt.cnet> References: <1428000263-11892-1-git-send-email-rkrcmar@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1428000263-11892-1-git-send-email-rkrcmar@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Apr 02, 2015 at 08:44:23PM +0200, Radim Krčmář wrote: > If we were migrated right after __getcpu, but before reading the > migration_count, we wouldn't notice that we read TSC of a different > VCPU, nor that KVM's bug made pvti invalid, as only migration_count > on source VCPU is increased. > > Change vdso instead of updating migration_count on destination. > > Fixes: 0a4e6be9ca17 ("x86: kvm: Revert "remove sched notifier for cross-cpu migrations"") > Cc: stable@vger.kernel.org > Signed-off-by: Radim Krčmář > --- > Because it we'll get a complete rewrite, this series does not > - remove the outdated 'TODO: We can put [...]' comment > - use a proper encapsulation for the inner do-while loop > - optimize the outer do-while loop > (no need to re-read cpu id on version mismatch) > > arch/x86/vdso/vclock_gettime.c | 20 ++++++++++++-------- > 1 file changed, 12 insertions(+), 8 deletions(-) > > diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c > index 30933760ee5f..40d2473836c9 100644 > --- a/arch/x86/vdso/vclock_gettime.c > +++ b/arch/x86/vdso/vclock_gettime.c > @@ -99,21 +99,25 @@ static notrace cycle_t vread_pvclock(int *mode) > * __getcpu() calls (Gleb). > */ > > - pvti = get_pvti(cpu); > + /* Make sure migrate_count will change if we leave the VCPU. */ > + do { > + pvti = get_pvti(cpu); > + migrate_count = pvti->migrate_count; > > - migrate_count = pvti->migrate_count; > + cpu1 = cpu; > + cpu = __getcpu() & VGETCPU_CPU_MASK; > + } while (unlikely(cpu != cpu1)); > > version = __pvclock_read_cycles(&pvti->pvti, &ret, &flags); > > /* > * Test we're still on the cpu as well as the version. > - * We could have been migrated just after the first > - * vgetcpu but before fetching the version, so we > - * wouldn't notice a version change. > + * - We must read TSC of pvti's VCPU. > + * - KVM doesn't follow the versioning protocol, so data could > + * change before version if we left the VCPU. > */ > - cpu1 = __getcpu() & VGETCPU_CPU_MASK; > - } while (unlikely(cpu != cpu1 || > - (pvti->pvti.version & 1) || > + smp_rmb(); > + } while (unlikely((pvti->pvti.version & 1) || > pvti->pvti.version != version || > pvti->migrate_count != migrate_count)); > > -- > 2.3.4 > > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Reviewed-by: Marcelo Tosatti