All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, David Stevens <stevensd@google.com>,
	3pvd@google.com, Jann Horn <jannh@google.com>,
	Jason Gunthorpe <jgg@ziepe.ca>,
	Paolo Bonzini <pbonzini@redhat.com>
Subject: [PATCH 5.4 11/17] KVM: do not assume PTE is writable after follow_pfn
Date: Thu, 25 Feb 2021 10:53:56 +0100	[thread overview]
Message-ID: <20210225092515.557115543@linuxfoundation.org> (raw)
In-Reply-To: <20210225092515.001992375@linuxfoundation.org>

From: Paolo Bonzini <pbonzini@redhat.com>

commit bd2fae8da794b55bf2ac02632da3a151b10e664c upstream.

In order to convert an HVA to a PFN, KVM usually tries to use
the get_user_pages family of functinso.  This however is not
possible for VM_IO vmas; in that case, KVM instead uses follow_pfn.

In doing this however KVM loses the information on whether the
PFN is writable.  That is usually not a problem because the main
use of VM_IO vmas with KVM is for BARs in PCI device assignment,
however it is a bug.  To fix it, use follow_pte and check pte_write
while under the protection of the PTE lock.  The information can
be used to fail hva_to_pfn_remapped or passed back to the
caller via *writable.

Usage of follow_pfn was introduced in commit add6a0cd1c5b ("KVM: MMU: try to fix
up page faults before giving up", 2016-07-05); however, even older version
have the same issue, all the way back to commit 2e2e3738af33 ("KVM:
Handle vma regions with no backing page", 2008-07-20), as they also did
not check whether the PFN was writable.

Fixes: 2e2e3738af33 ("KVM: Handle vma regions with no backing page")
Reported-by: David Stevens <stevensd@google.com>
Cc: 3pvd@google.com
Cc: Jann Horn <jannh@google.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 virt/kvm/kvm_main.c |   15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1599,9 +1599,11 @@ static int hva_to_pfn_remapped(struct vm
 			       kvm_pfn_t *p_pfn)
 {
 	unsigned long pfn;
+	pte_t *ptep;
+	spinlock_t *ptl;
 	int r;
 
-	r = follow_pfn(vma, addr, &pfn);
+	r = follow_pte(vma->vm_mm, addr, NULL, &ptep, NULL, &ptl);
 	if (r) {
 		/*
 		 * get_user_pages fails for VM_IO and VM_PFNMAP vmas and does
@@ -1616,14 +1618,19 @@ static int hva_to_pfn_remapped(struct vm
 		if (r)
 			return r;
 
-		r = follow_pfn(vma, addr, &pfn);
+		r = follow_pte(vma->vm_mm, addr, NULL, &ptep, NULL, &ptl);
 		if (r)
 			return r;
+	}
 
+	if (write_fault && !pte_write(*ptep)) {
+		pfn = KVM_PFN_ERR_RO_FAULT;
+		goto out;
 	}
 
 	if (writable)
-		*writable = true;
+		*writable = pte_write(*ptep);
+	pfn = pte_pfn(*ptep);
 
 	/*
 	 * Get a reference here because callers of *hva_to_pfn* and
@@ -1638,6 +1645,8 @@ static int hva_to_pfn_remapped(struct vm
 	 */ 
 	kvm_get_pfn(pfn);
 
+out:
+	pte_unmap_unlock(ptep, ptl);
 	*p_pfn = pfn;
 	return 0;
 }



  parent reply	other threads:[~2021-02-25 10:18 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-25  9:53 [PATCH 5.4 00/17] 5.4.101-rc1 review Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 01/17] bpf: Fix truncation handling for mod32 dst reg wrt zero Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 02/17] HID: make arrays usage and value to be the same Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 03/17] USB: quirks: sort quirk entries Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 04/17] usb: quirks: add quirk to start video capture on ELMO L-12F document camera reliable Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 05/17] ntfs: check for valid standard information attribute Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 06/17] arm64: tegra: Add power-domain for Tegra210 HDA Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 07/17] scripts: use pkg-config to locate libcrypto Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 08/17] scripts: set proper OpenSSL include dir also for sign-file Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 09/17] mm: unexport follow_pte_pmd Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 10/17] mm: simplify follow_pte{,pmd} Greg Kroah-Hartman
2021-02-25  9:53 ` Greg Kroah-Hartman [this message]
2021-02-25  9:53 ` [PATCH 5.4 12/17] mm: provide a saner PTE walking API for modules Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 13/17] KVM: Use kvm_pfn_t for local PFN variable in hva_to_pfn_remapped() Greg Kroah-Hartman
2021-02-25  9:53 ` [PATCH 5.4 14/17] NET: usb: qmi_wwan: Adding support for Cinterion MV31 Greg Kroah-Hartman
2021-02-25  9:54 ` [PATCH 5.4 15/17] cxgb4: Add new T6 PCI device id 0x6092 Greg Kroah-Hartman
2021-02-25  9:54 ` [PATCH 5.4 16/17] cifs: Set CIFS_MOUNT_USE_PREFIX_PATH flag on setting cifs_sb->prepath Greg Kroah-Hartman
2021-02-25  9:54 ` [PATCH 5.4 17/17] scripts/recordmcount.pl: support big endian for ARCH sh Greg Kroah-Hartman
2021-02-25 11:47 ` [PATCH 5.4 00/17] 5.4.101-rc1 review Jon Hunter
2021-02-25 19:51 ` Guenter Roeck
2021-02-25 21:17 ` Florian Fainelli
2021-02-26  2:25 ` Shuah Khan
2021-02-26  3:38 ` Ross Schmidt
2021-02-26  9:28 ` Naresh Kamboju

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210225092515.557115543@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=3pvd@google.com \
    --cc=jannh@google.com \
    --cc=jgg@ziepe.ca \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=stable@vger.kernel.org \
    --cc=stevensd@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.