| From 8a28515d53bd0b36eb53d8a25b8f2f7f5c16bc83 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 8 Jan 2020 12:24:38 -0800 |
| Subject: KVM: Play nice with read-only memslots when querying host page size |
| |
| From: Sean Christopherson <sean.j.christopherson@intel.com> |
| |
| [ Upstream commit 42cde48b2d39772dba47e680781a32a6c4b7dc33 ] |
| |
| Avoid the "writable" check in __gfn_to_hva_many(), which will always fail |
| on read-only memslots due to gfn_to_hva() assuming writes. Functionally, |
| this allows x86 to create large mappings for read-only memslots that |
| are backed by HugeTLB mappings. |
| |
| Note, the changelog for commit 05da45583de9 ("KVM: MMU: large page |
| support") states "If the largepage contains write-protected pages, a |
| large pte is not used.", but "write-protected" refers to pages that are |
| temporarily read-only, e.g. read-only memslots didn't even exist at the |
| time. |
| |
| Fixes: 4d8b81abc47b ("KVM: introduce readonly memslot") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> |
| [Redone using kvm_vcpu_gfn_to_memslot_prot. - Paolo] |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| virt/kvm/kvm_main.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c |
| index df7ece0bfcbd3..beec19fcf8cdb 100644 |
| --- a/virt/kvm/kvm_main.c |
| +++ b/virt/kvm/kvm_main.c |
| @@ -1301,7 +1301,7 @@ unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn) |
| |
| size = PAGE_SIZE; |
| |
| - addr = kvm_vcpu_gfn_to_hva(vcpu, gfn); |
| + addr = kvm_vcpu_gfn_to_hva_prot(vcpu, gfn, NULL); |
| if (kvm_is_error_hva(addr)) |
| return PAGE_SIZE; |
| |
| -- |
| 2.20.1 |
| |