| From e606b3043359417db58226f0a59a8e0723a54f8e Mon Sep 17 00:00:00 2001 |
| From: David Stevens <stevensd@chromium.org> |
| Date: Mon, 29 Nov 2021 12:43:16 +0900 |
| Subject: [PATCH] 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://patchwork.kernel.org/project/kvm/patch/20211129034317.2964790-4-stevensd@google.com/) |
| (also found at https://lore.kernel.org/r/20211129034317.2964790-4-stevensd@google.com) |
| |
| BUG=b:184929592, b:176387875 |
| TEST=tast run zork arc.VideoDecodeAccel.vp9_vm |
| |
| Change-Id: I71b8ab7189fa876841ac891a133cbe5b3133e64c |
| Disallow-Recycled-Builds: test-failures |
| Signed-off-by: Guenter Roeck <groeck@chromium.org> |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/3307494 |
| |
| [rebase66(tzungbi): |
| Revised commit message. |
| Squashed: |
| FIXUP: FROMLIST: KVM: arm64/mmu: use gfn_to_pfn_page |
| ] |
| Signed-off-by: Tzung-Bi Shih <tzungbi@chromium.org> |
| --- |
| arch/arm64/kvm/mmu.c | 24 +++++++++++++++++------- |
| 1 file changed, 17 insertions(+), 7 deletions(-) |
| |
| diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c |
| index d87c8fcc4c24f6f7b36678951634ff1ff00d6b4d..1998aad2653ecc9a0bb38d096edcace454ea5d78 100644 |
| --- a/arch/arm64/kvm/mmu.c |
| +++ b/arch/arm64/kvm/mmu.c |
| @@ -1281,7 +1281,7 @@ static bool fault_supports_stage2_huge_mapping(struct kvm_memory_slot *memslot, |
| static 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; |
| |
| @@ -1290,7 +1290,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)) { |
| int sz = get_user_mapping_size(kvm, hva); |
| |
| if (sz < 0) |
| @@ -1300,8 +1301,11 @@ transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot, |
| return PAGE_SIZE; |
| |
| *ipap &= PMD_MASK; |
| + put_page(*page); |
| pfn &= ~(PTRS_PER_PMD - 1); |
| *pfnp = pfn; |
| + *page = pfn_to_page(pfn); |
| + get_page(*page); |
| |
| return PMD_SIZE; |
| } |
| @@ -1387,6 +1391,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); |
| long vma_pagesize, fault_granule; |
| @@ -1485,8 +1490,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, |
| mmu_seq = vcpu->kvm->mmu_invalidate_seq; |
| mmap_read_unlock(current->mm); |
| |
| - pfn = __gfn_to_pfn_memslot(memslot, gfn, false, false, NULL, |
| - write_fault, &writable, NULL); |
| + pfn = __gfn_to_pfn_page_memslot(memslot, gfn, false, false, NULL, |
| + write_fault, &writable, NULL, &page); |
| if (pfn == KVM_PFN_ERR_HWPOISON) { |
| kvm_send_hwpoison_signal(hva, vma_shift); |
| return 0; |
| @@ -1532,7 +1537,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, |
| vma_pagesize = fault_granule; |
| else |
| vma_pagesize = transparent_hugepage_adjust(kvm, memslot, |
| - hva, &pfn, |
| + hva, |
| + &pfn, &page, |
| &fault_ipa); |
| |
| if (vma_pagesize < 0) { |
| @@ -1578,13 +1584,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: |
| read_unlock(&kvm->mmu_lock); |
| - kvm_release_pfn_clean(pfn); |
| + if (page) { |
| + kvm_set_pfn_accessed(pfn); |
| + put_page(page); |
| + } |
| return ret != -EAGAIN ? ret : 0; |
| } |
| |
| -- |
| 2.43.0.472.g3155946c3a-goog |
| |