[PATCH v1] KVM:Prepare kvm_is_reserved_pfn() for PG_reserved chang=

From: David Hildenbrand
Date: Tue Oct 22 2019 - 04:26:46 EST


Right now, ZONE_DEVICE memory is always set PG_reserved. We want to
change that in the future.

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. Note that ZONE_DEVICE memory is
never online (IOW, managed by the buddy).

Switching to pfn_to_online_page() keeps the existing behavior for
PFNs without a memmap and for ZONE_DEVICE memory. They are treated as
reserved and the page is not touched (e.g., to set it dirty or accessed).

Signed-off-by: David Hildenbrand <david@xxxxxxxxxx>
---
virt/kvm/kvm_main.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 66a977472a1c..b98d5d44c2b8 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -151,9 +151,15 @@ __weak int kvm_arch_mmu_notifier_invalidate_range(stru=
ct kvm *kvm,
=20
bool kvm_is_reserved_pfn(kvm_pfn_t pfn)
{
-=09if (pfn_valid(pfn))
-=09=09return PageReserved(pfn_to_page(pfn));
+=09struct page *page =3D pfn_to_online_page(pfn);
=20
+=09/*
+=09 * We treat any pages that are not online (not managed by the buddy)
+=09 * as reserved - this includes ZONE_DEVICE pages and pages without
+=09 * a memmap (e.g.., mapped via /dev/mem).
+=09 */
+=09if (page)
+=09=09return PageReserved(pfn_to_page(pfn));
=09return true;
}
=20
--=20
2.21.0



I'd like to note that the pfn_valid() check in __kvm_map_gfn() is also bogu=
s,
but switching pfn_to_online_page() is not possible, as we would treat
ZONE_DEVICE memory differently then.

--=20

Thanks,

David / dhildenb