mirror of https://gitee.com/openkylin/linux.git
powerpc/kvm/book3s: Use kvm helpers to walk shadow or secondary table
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.kumar@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20200505071729.54912-12-aneesh.kumar@linux.ibm.com
This commit is contained in:
parent
dc891849e0
commit
6cdf30375f
|
@ -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,
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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;
|
||||
|
@ -949,8 +949,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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue