mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
KVM: PPC: e500: Use __kvm_faultin_pfn() to handle page faults
[ Upstream commit 419cfb983ca93e75e905794521afefcfa07988bb ] Convert PPC e500 to use __kvm_faultin_pfn()+kvm_release_faultin_page(), and continue the inexorable march towards the demise of kvm_pfn_to_refcounted_page(). Signed-off-by: Sean Christopherson <seanjc@google.com> Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-ID: <20241010182427.1434605-55-seanjc@google.com> Stable-dep-of: 87ecfdbc699c ("KVM: e500: always restore irqs") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
d2004572fc
commit
deead14da7
@@ -322,6 +322,7 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|||||||
{
|
{
|
||||||
struct kvm_memory_slot *slot;
|
struct kvm_memory_slot *slot;
|
||||||
unsigned long pfn = 0; /* silence GCC warning */
|
unsigned long pfn = 0; /* silence GCC warning */
|
||||||
|
struct page *page = NULL;
|
||||||
unsigned long hva;
|
unsigned long hva;
|
||||||
int pfnmap = 0;
|
int pfnmap = 0;
|
||||||
int tsize = BOOK3E_PAGESZ_4K;
|
int tsize = BOOK3E_PAGESZ_4K;
|
||||||
@@ -443,7 +444,7 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|||||||
|
|
||||||
if (likely(!pfnmap)) {
|
if (likely(!pfnmap)) {
|
||||||
tsize_pages = 1UL << (tsize + 10 - PAGE_SHIFT);
|
tsize_pages = 1UL << (tsize + 10 - PAGE_SHIFT);
|
||||||
pfn = gfn_to_pfn_memslot(slot, gfn);
|
pfn = __kvm_faultin_pfn(slot, gfn, FOLL_WRITE, NULL, &page);
|
||||||
if (is_error_noslot_pfn(pfn)) {
|
if (is_error_noslot_pfn(pfn)) {
|
||||||
if (printk_ratelimit())
|
if (printk_ratelimit())
|
||||||
pr_err("%s: real page not found for gfn %lx\n",
|
pr_err("%s: real page not found for gfn %lx\n",
|
||||||
@@ -488,8 +489,6 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
writable = kvmppc_e500_ref_setup(ref, gtlbe, pfn, wimg);
|
writable = kvmppc_e500_ref_setup(ref, gtlbe, pfn, wimg);
|
||||||
if (writable)
|
|
||||||
kvm_set_pfn_dirty(pfn);
|
|
||||||
|
|
||||||
kvmppc_e500_setup_stlbe(&vcpu_e500->vcpu, gtlbe, tsize,
|
kvmppc_e500_setup_stlbe(&vcpu_e500->vcpu, gtlbe, tsize,
|
||||||
ref, gvaddr, stlbe);
|
ref, gvaddr, stlbe);
|
||||||
@@ -498,8 +497,7 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|||||||
kvmppc_mmu_flush_icache(pfn);
|
kvmppc_mmu_flush_icache(pfn);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Drop refcount on page, so that mmu notifiers can clear it */
|
kvm_release_faultin_page(kvm, page, !!ret, writable);
|
||||||
kvm_release_pfn_clean(pfn);
|
|
||||||
spin_unlock(&kvm->mmu_lock);
|
spin_unlock(&kvm->mmu_lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user