Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp8113392imu; Tue, 4 Dec 2018 03:13:51 -0800 (PST) X-Google-Smtp-Source: AFSGD/WItc/1sntSRmuPkW4xm5VnSREgtcGeoONMsBftDGhuXkl+NLWIEaJKwVy3yAkPxk3MT55o X-Received: by 2002:a17:902:bd0b:: with SMTP id p11mr211512pls.259.1543922030936; Tue, 04 Dec 2018 03:13:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543922030; cv=none; d=google.com; s=arc-20160816; b=i0y1/EB41rLavRQlGpg50s/wtCLsgAAx8sO6Rr+RABr49yPzHA7pJUXyFbahxHXifL u+31U5dJVFIJ3OpEhEfluihmOHWA0bwrxRgEsKRpBQipqTYAtT7LmYq+q3/tu/PX9Q8I Y9KZWr3p112U8dBn+F3VaXvuEr4gW8kTyrZBONjAnLggCN5dXyLa10bozAqzcgqtsZ/k c0QyrfoaJZlc+n1kcVjQcaUpQqR2ezvnoyqTCYhgiZJQwjrPzAIg3Pnza5RnoHxWsKL9 S3Ar4pgjtJRE/YBWYWWVTb24gy6fW5Mrba7CEWJlQBwFS1qO5sV6XsKjw/6MHExviUpx rcyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=NSIDeR2q+yGEjcu9Z67rf5cHFLVWPpme/3TEaWf+6/w=; b=p4G6HCzPGlcckF8i6q3BcFj2xE/obpPNwjiLU+tPDRluZO7fN3jII2IOiGfZpc1HiT KQDDD6wpQV6/81Ao7wczcbBWlVbtH2jVRZR/rQDzWQyYGgEfr7T/UoHEQLUKUIVweVwB TZ7fHrXu/CXUEsnoTkDODS/o0Gp38stfBTYlhTJBVM/Fdv4jqDtlOug0ZZ7XJ++w6jHk y/3ZtoRjsJmRUZ3suhbc/g/CCTS9TnnkMOIlHxf33GoIHbCN3kT3SPUKNSpm1vxyb864 7kUQ+82TqHzKTbWOfBP8w8zgNkFoabt0ViShLoG+19OzhG4suYwDDtACA3I3PLzPyUR8 hUJQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=aMzEhYP3; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 187si17700293pfv.238.2018.12.04.03.13.36; Tue, 04 Dec 2018 03:13:50 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=aMzEhYP3; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728566AbeLDLIF (ORCPT + 99 others); Tue, 4 Dec 2018 06:08:05 -0500 Received: from mail.kernel.org ([198.145.29.99]:57274 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728549AbeLDLIC (ORCPT ); Tue, 4 Dec 2018 06:08:02 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 577922151B; Tue, 4 Dec 2018 11:08:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1543921681; bh=nkcHH/Rk4Xw3Qc5yXz7X8r4aAO1nOiYQK/Y15zle+ow=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aMzEhYP3b71fYs9A3Z8PsJxZQMUrvnKO/zfVevsLu2/rDWcJD/APnGnXV8sbnGace D5uHYzXzraPXoykeGx2brEn+3VpVxGIG1p5uos4EnffIppCB5X2ZL88nM5Qwj1iAm2 AUoFF9CLhQSfypi0yDVHb2QgxnYgtg2CHpyZgWWA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Junaid Shahid , Wanpeng Li , Paolo Bonzini Subject: [PATCH 4.9 19/50] kvm: mmu: Fix race in emulated page table writes Date: Tue, 4 Dec 2018 11:50:14 +0100 Message-Id: <20181204103715.498761676@linuxfoundation.org> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20181204103714.485546262@linuxfoundation.org> References: <20181204103714.485546262@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Junaid Shahid commit 0e0fee5c539b61fdd098332e0e2cc375d9073706 upstream. When a guest page table is updated via an emulated write, kvm_mmu_pte_write() is called to update the shadow PTE using the just written guest PTE value. But if two emulated guest PTE writes happened concurrently, it is possible that the guest PTE and the shadow PTE end up being out of sync. Emulated writes do not mark the shadow page as unsync-ed, so this inconsistency will not be resolved even by a guest TLB flush (unless the page was marked as unsync-ed at some other point). This is fixed by re-reading the current value of the guest PTE after the MMU lock has been acquired instead of just using the value that was written prior to calling kvm_mmu_pte_write(). Signed-off-by: Junaid Shahid Reviewed-by: Wanpeng Li Cc: stable@vger.kernel.org Signed-off-by: Paolo Bonzini Signed-off-by: Greg Kroah-Hartman --- arch/x86/kvm/mmu.c | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -4297,9 +4297,9 @@ static bool need_remote_flush(u64 old, u } static u64 mmu_pte_write_fetch_gpte(struct kvm_vcpu *vcpu, gpa_t *gpa, - const u8 *new, int *bytes) + int *bytes) { - u64 gentry; + u64 gentry = 0; int r; /* @@ -4311,22 +4311,12 @@ static u64 mmu_pte_write_fetch_gpte(stru /* Handle a 32-bit guest writing two halves of a 64-bit gpte */ *gpa &= ~(gpa_t)7; *bytes = 8; - r = kvm_vcpu_read_guest(vcpu, *gpa, &gentry, 8); - if (r) - gentry = 0; - new = (const u8 *)&gentry; } - switch (*bytes) { - case 4: - gentry = *(const u32 *)new; - break; - case 8: - gentry = *(const u64 *)new; - break; - default: - gentry = 0; - break; + if (*bytes == 4 || *bytes == 8) { + r = kvm_vcpu_read_guest_atomic(vcpu, *gpa, &gentry, *bytes); + if (r) + gentry = 0; } return gentry; @@ -4437,8 +4427,6 @@ static void kvm_mmu_pte_write(struct kvm pgprintk("%s: gpa %llx bytes %d\n", __func__, gpa, bytes); - gentry = mmu_pte_write_fetch_gpte(vcpu, &gpa, new, &bytes); - /* * No need to care whether allocation memory is successful * or not since pte prefetch is skiped if it does not have @@ -4447,6 +4435,9 @@ static void kvm_mmu_pte_write(struct kvm mmu_topup_memory_caches(vcpu); spin_lock(&vcpu->kvm->mmu_lock); + + gentry = mmu_pte_write_fetch_gpte(vcpu, &gpa, &bytes); + ++vcpu->kvm->stat.mmu_pte_write; kvm_mmu_audit(vcpu, AUDIT_PRE_PTE_WRITE);