update kvmppc_hv_handle_set_rc to use find_kvm_nested_guest_pte and
find_kvm_secondary_pte

Signed-off-by: Aneesh Kumar K.V <aneesh.ku...@linux.ibm.com>
---
 arch/powerpc/include/asm/kvm_book3s.h    |  2 +-
 arch/powerpc/include/asm/kvm_book3s_64.h |  3 +++
 arch/powerpc/kvm/book3s_64_mmu_radix.c   | 18 +++++++++---------
 arch/powerpc/kvm/book3s_hv_nested.c      | 13 ++++++-------
 4 files changed, 19 insertions(+), 17 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_book3s.h 
b/arch/powerpc/include/asm/kvm_book3s.h
index 506e4df2d730..37c8b50cb505 100644
--- a/arch/powerpc/include/asm/kvm_book3s.h
+++ b/arch/powerpc/include/asm/kvm_book3s.h
@@ -198,7 +198,7 @@ extern void kvmppc_unmap_pte(struct kvm *kvm, pte_t *pte, 
unsigned long gpa,
                        unsigned int shift,
                        const struct kvm_memory_slot *memslot,
                        unsigned int lpid);
-extern bool kvmppc_hv_handle_set_rc(struct kvm *kvm, pgd_t *pgtable,
+extern bool kvmppc_hv_handle_set_rc(struct kvm *kvm, bool nested,
                                    bool writing, unsigned long gpa,
                                    unsigned int lpid);
 extern int kvmppc_book3s_instantiate_page(struct kvm_vcpu *vcpu,
diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h 
b/arch/powerpc/include/asm/kvm_book3s_64.h
index 2c2635967d6e..2860521992b6 100644
--- a/arch/powerpc/include/asm/kvm_book3s_64.h
+++ b/arch/powerpc/include/asm/kvm_book3s_64.h
@@ -647,6 +647,9 @@ static inline pte_t *find_kvm_secondary_pte(struct kvm 
*kvm, unsigned long ea,
        return pte;
 }
 
+extern pte_t *find_kvm_nested_guest_pte(struct kvm *kvm, unsigned long lpid,
+                                       unsigned long ea, unsigned *hshift);
+
 #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */
 
 #endif /* __ASM_KVM_BOOK3S_64_H__ */
diff --git a/arch/powerpc/kvm/book3s_64_mmu_radix.c 
b/arch/powerpc/kvm/book3s_64_mmu_radix.c
index d769d7e31047..f0b021052e33 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_radix.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_radix.c
@@ -735,7 +735,7 @@ int kvmppc_create_pte(struct kvm *kvm, pgd_t *pgtable, 
pte_t pte,
        return ret;
 }
 
-bool kvmppc_hv_handle_set_rc(struct kvm *kvm, pgd_t *pgtable, bool writing,
+bool kvmppc_hv_handle_set_rc(struct kvm *kvm, bool nested, bool writing,
                             unsigned long gpa, unsigned int lpid)
 {
        unsigned long pgflags;
@@ -750,12 +750,12 @@ bool kvmppc_hv_handle_set_rc(struct kvm *kvm, pgd_t 
*pgtable, bool writing,
        pgflags = _PAGE_ACCESSED;
        if (writing)
                pgflags |= _PAGE_DIRTY;
-       /*
-        * We are walking the secondary (partition-scoped) page table here.
-        * We can do this without disabling irq because the Linux MM
-        * subsystem doesn't do THP splits and collapses on this tree.
-        */
-       ptep = __find_linux_pte(pgtable, gpa, NULL, &shift);
+
+       if (nested)
+               ptep = find_kvm_nested_guest_pte(kvm, lpid, gpa, &shift);
+       else
+               ptep = find_kvm_secondary_pte(kvm, gpa, &shift);
+
        if (ptep && pte_present(*ptep) && (!writing || pte_write(*ptep))) {
                kvmppc_radix_update_pte(kvm, ptep, 0, pgflags, gpa, shift);
                return true;
@@ -948,8 +948,8 @@ int kvmppc_book3s_radix_page_fault(struct kvm_run *run, 
struct kvm_vcpu *vcpu,
        /* Failed to set the reference/change bits */
        if (dsisr & DSISR_SET_RC) {
                spin_lock(&kvm->mmu_lock);
-               if (kvmppc_hv_handle_set_rc(kvm, kvm->arch.pgtable,
-                                           writing, gpa, kvm->arch.lpid))
+               if (kvmppc_hv_handle_set_rc(kvm, false, writing,
+                                           gpa, kvm->arch.lpid))
                        dsisr &= ~DSISR_SET_RC;
                spin_unlock(&kvm->mmu_lock);
 
diff --git a/arch/powerpc/kvm/book3s_hv_nested.c 
b/arch/powerpc/kvm/book3s_hv_nested.c
index b2cc3eaec618..99011f1b772a 100644
--- a/arch/powerpc/kvm/book3s_hv_nested.c
+++ b/arch/powerpc/kvm/book3s_hv_nested.c
@@ -750,8 +750,8 @@ static struct kvm_nested_guest *kvmhv_find_nested(struct 
kvm *kvm, int lpid)
        return kvm->arch.nested_guests[lpid];
 }
 
-static pte_t *find_kvm_nested_guest_pte(struct kvm *kvm, unsigned long lpid,
-                                       unsigned long ea, unsigned *hshift)
+pte_t *find_kvm_nested_guest_pte(struct kvm *kvm, unsigned long lpid,
+                                unsigned long ea, unsigned *hshift)
 {
        struct kvm_nested_guest *gp;
        pte_t *pte;
@@ -767,7 +767,6 @@ static pte_t *find_kvm_nested_guest_pte(struct kvm *kvm, 
unsigned long lpid,
        return pte;
 }
 
-
 static inline bool kvmhv_n_rmap_is_equal(u64 rmap_1, u64 rmap_2)
 {
        return !((rmap_1 ^ rmap_2) & (RMAP_NESTED_LPID_MASK |
@@ -1226,16 +1225,16 @@ static long kvmhv_handle_nested_set_rc(struct kvm_vcpu 
*vcpu,
 
        spin_lock(&kvm->mmu_lock);
        /* Set the rc bit in the pte of our (L0) pgtable for the L1 guest */
-       ret = kvmppc_hv_handle_set_rc(kvm, kvm->arch.pgtable, writing,
-                                    gpte.raddr, kvm->arch.lpid);
+       ret = kvmppc_hv_handle_set_rc(kvm, false, writing,
+                                     gpte.raddr, kvm->arch.lpid);
        if (!ret) {
                ret = -EINVAL;
                goto out_unlock;
        }
 
        /* Set the rc bit in the pte of the shadow_pgtable for the nest guest */
-       ret = kvmppc_hv_handle_set_rc(kvm, gp->shadow_pgtable, writing, n_gpa,
-                                     gp->shadow_lpid);
+       ret = kvmppc_hv_handle_set_rc(kvm, true, writing,
+                                     n_gpa, gp->shadow_lpid);
        if (!ret)
                ret = -EINVAL;
        else
-- 
2.24.1

Reply via email to