Commit 32f070a
KVM: do not assume PTE is writable after follow_pfn
commit bd2fae8 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 add6a0c ("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 2e2e373 ("KVM:
Handle vma regions with no backing page", 2008-07-20), as they also did
not check whether the PFN was writable.
Fixes: 2e2e373 ("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>1 parent 78c7b24 commit 32f070a
1 file changed
Lines changed: 12 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1599 | 1599 | | |
1600 | 1600 | | |
1601 | 1601 | | |
| 1602 | + | |
| 1603 | + | |
1602 | 1604 | | |
1603 | 1605 | | |
1604 | | - | |
| 1606 | + | |
1605 | 1607 | | |
1606 | 1608 | | |
1607 | 1609 | | |
| |||
1616 | 1618 | | |
1617 | 1619 | | |
1618 | 1620 | | |
1619 | | - | |
| 1621 | + | |
1620 | 1622 | | |
1621 | 1623 | | |
| 1624 | + | |
1622 | 1625 | | |
| 1626 | + | |
| 1627 | + | |
| 1628 | + | |
1623 | 1629 | | |
1624 | 1630 | | |
1625 | 1631 | | |
1626 | | - | |
| 1632 | + | |
| 1633 | + | |
1627 | 1634 | | |
1628 | 1635 | | |
1629 | 1636 | | |
| |||
1638 | 1645 | | |
1639 | 1646 | | |
1640 | 1647 | | |
| 1648 | + | |
| 1649 | + | |
1641 | 1650 | | |
1642 | 1651 | | |
1643 | 1652 | | |
| |||
0 commit comments