| From 7c5caf0018ad219b5a00f76e9cec48a9bc787cf3 Mon Sep 17 00:00:00 2001 |
| From: David Stevens <stevensd@chromium.org> |
| Date: Fri, 25 Jun 2021 16:36:15 +0900 |
| Subject: [PATCH] BACKPORT: FROMLIST: KVM: arm64/mmu: use gfn_to_pfn_page |
| |
| Covert usages of the deprecated gfn_to_pfn functions to the new |
| gfn_to_pfn_page functions. |
| |
| Signed-off-by: David Stevens <stevensd@chromium.org> |
| (am from https://lore.kernel.org/patchwork/patch/1451587/) |
| (also found at https://lore.kernel.org/r/20210625073616.2184426-5-stevensd@google.com) |
| |
| Conflicts: |
| arch/arm64/kvm/mmu.c |
| |
| BUG=b:184929592, b:176387875 |
| TEST=tast run zork arc.VideoDecodeAccel.vp9_vm |
| |
| Change-Id: Ie0d6e030e5342baa098a4a121b9d2940ac4b4726 |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/3002594 |
| Tested-by: David Stevens <stevensd@chromium.org> |
| Reviewed-by: Suleiman Souhlal <suleiman@chromium.org> |
| Commit-Queue: David Stevens <stevensd@chromium.org> |
| --- |
| arch/arm64/kvm/mmu.c | 24 +++++++++++++++--------- |
| 1 file changed, 15 insertions(+), 9 deletions(-) |
| |
| diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c |
| --- a/arch/arm64/kvm/mmu.c |
| +++ b/arch/arm64/kvm/mmu.c |
| @@ -829,7 +829,7 @@ static bool fault_supports_stage2_huge_mapping(struct kvm_memory_slot *memslot, |
| static unsigned long |
| transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot, |
| unsigned long hva, kvm_pfn_t *pfnp, |
| - phys_addr_t *ipap) |
| + struct page **page, phys_addr_t *ipap) |
| { |
| kvm_pfn_t pfn = *pfnp; |
| |
| @@ -838,7 +838,8 @@ transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot, |
| * sure that the HVA and IPA are sufficiently aligned and that the |
| * block map is contained within the memslot. |
| */ |
| - if (fault_supports_stage2_huge_mapping(memslot, hva, PMD_SIZE) && |
| + if (*page && |
| + fault_supports_stage2_huge_mapping(memslot, hva, PMD_SIZE) && |
| get_user_mapping_size(kvm, hva) >= PMD_SIZE) { |
| /* |
| * The address we faulted on is backed by a transparent huge |
| @@ -859,10 +860,11 @@ transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot, |
| * page accordingly. |
| */ |
| *ipap &= PMD_MASK; |
| - kvm_release_pfn_clean(pfn); |
| + put_page(*page); |
| pfn &= ~(PTRS_PER_PMD - 1); |
| - get_page(pfn_to_page(pfn)); |
| *pfnp = pfn; |
| + *page = pfn_to_page(pfn); |
| + get_page(*page); |
| |
| return PMD_SIZE; |
| } |
| @@ -955,6 +957,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, |
| short vma_shift; |
| gfn_t gfn; |
| kvm_pfn_t pfn; |
| + struct page *page; |
| bool logging_active = memslot_is_logging(memslot); |
| unsigned long fault_level = kvm_vcpu_trap_get_fault_level(vcpu); |
| unsigned long vma_pagesize, fault_granule; |
| @@ -1056,9 +1059,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, |
| */ |
| smp_rmb(); |
| |
| - pfn = __gfn_to_pfn_memslot(memslot, gfn, false, NULL, |
| - write_fault, &writable, NULL); |
| + pfn = __gfn_to_pfn_mmeslot(memslot, gfn, false, NULL, |
| + write_fault, &writable, NULL, page); |
| |
| if (pfn == KVM_PFN_ERR_HWPOISON) { |
| kvm_send_hwpoison_signal(hva, vma_shift); |
| return 0; |
| @@ -1104,6 +1106,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, |
| else |
| vma_pagesize = transparent_hugepage_adjust(kvm, memslot, |
| hva, &pfn, |
| + &page, |
| &fault_ipa); |
| } |
| |
| @@ -1143,14 +1146,17 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, |
| |
| /* Mark the page dirty only if the fault is handled successfully */ |
| if (writable && !ret) { |
| - kvm_set_pfn_dirty(pfn); |
| + if (page) |
| + kvm_set_pfn_dirty(pfn); |
| mark_page_dirty_in_slot(kvm, memslot, gfn); |
| } |
| |
| out_unlock: |
| spin_unlock(&kvm->mmu_lock); |
| - kvm_set_pfn_accessed(pfn); |
| - kvm_release_pfn_clean(pfn); |
| + if (page) { |
| + kvm_set_pfn_accessed(pfn); |
| + put_page(page); |
| + } |
| return ret != -EAGAIN ? ret : 0; |
| } |
| |
| -- |
| 2.33.0.464.g1972c5931b-goog |
| |