[PATCH v1 04/10] vfio/type1: Prepare is_invalid_reserved_pfn() for PG_reserved changes
David Hildenbrand
david at redhat.com
Thu Oct 24 23:09:32 AEDT 2019
Right now, ZONE_DEVICE memory is always set PG_reserved. We want to
change that.
KVM has this weird use case that you can map anything from /dev/mem
into the guest. pfn_valid() is not a reliable check whether the memmap
was initialized and can be touched. pfn_to_online_page() makes sure
that we have an initialized memmap (and don't have ZONE_DEVICE memory).
Rewrite is_invalid_reserved_pfn() similar to kvm_is_reserved_pfn() to make
sure the function produces the same result once we stop setting ZONE_DEVICE
pages PG_reserved.
Cc: Alex Williamson <alex.williamson at redhat.com>
Cc: Cornelia Huck <cohuck at redhat.com>
Signed-off-by: David Hildenbrand <david at redhat.com>
---
drivers/vfio/vfio_iommu_type1.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index 2ada8e6cdb88..f8ce8c408ba8 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -299,9 +299,15 @@ static int vfio_lock_acct(struct vfio_dma *dma, long npage, bool async)
*/
static bool is_invalid_reserved_pfn(unsigned long pfn)
{
- if (pfn_valid(pfn))
- return PageReserved(pfn_to_page(pfn));
+ struct page *page = pfn_to_online_page(pfn);
+ /*
+ * We treat any pages that are not online (not managed by the buddy)
+ * as reserved - this includes ZONE_DEVICE pages and pages without
+ * a memmap (e.g., mapped via /dev/mem).
+ */
+ if (page)
+ return PageReserved(page);
return true;
}
--
2.21.0
More information about the Linuxppc-dev
mailing list