Skip to content

Commit 8b135c7

Browse files
sean-jcbonzini
authored andcommitted
KVM: PPC: Use kvm_faultin_pfn() to handle page faults on Book3s PR
Convert Book3S PR to __kvm_faultin_pfn()+kvm_release_faultin_page(), which are new APIs to consolidate arch code and provide consistent behavior across all KVM architectures. Signed-off-by: Sean Christopherson <[email protected]> Tested-by: Dmitry Osipenko <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> Message-ID: <[email protected]>
1 parent 2b26d6b commit 8b135c7

File tree

4 files changed

+14
-12
lines changed

4 files changed

+14
-12
lines changed

arch/powerpc/include/asm/kvm_book3s.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ extern void kvmppc_set_bat(struct kvm_vcpu *vcpu, struct kvmppc_bat *bat,
235235
extern void kvmppc_giveup_ext(struct kvm_vcpu *vcpu, ulong msr);
236236
extern int kvmppc_emulate_paired_single(struct kvm_vcpu *vcpu);
237237
extern kvm_pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa,
238-
bool writing, bool *writable);
238+
bool writing, bool *writable, struct page **page);
239239
extern void kvmppc_add_revmap_chain(struct kvm *kvm, struct revmap_entry *rev,
240240
unsigned long *rmap, long pte_index, int realmode);
241241
extern void kvmppc_update_dirty_map(const struct kvm_memory_slot *memslot,

arch/powerpc/kvm/book3s.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu)
422422
EXPORT_SYMBOL_GPL(kvmppc_core_prepare_to_enter);
423423

424424
kvm_pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing,
425-
bool *writable)
425+
bool *writable, struct page **page)
426426
{
427427
ulong mp_pa = vcpu->arch.magic_page_pa & KVM_PAM;
428428
gfn_t gfn = gpa >> PAGE_SHIFT;
@@ -437,13 +437,14 @@ kvm_pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing,
437437
kvm_pfn_t pfn;
438438

439439
pfn = (kvm_pfn_t)virt_to_phys((void*)shared_page) >> PAGE_SHIFT;
440-
get_page(pfn_to_page(pfn));
440+
*page = pfn_to_page(pfn);
441+
get_page(*page);
441442
if (writable)
442443
*writable = true;
443444
return pfn;
444445
}
445446

446-
return gfn_to_pfn_prot(vcpu->kvm, gfn, writing, writable);
447+
return kvm_faultin_pfn(vcpu, gfn, writing, writable, page);
447448
}
448449
EXPORT_SYMBOL_GPL(kvmppc_gpa_to_pfn);
449450

arch/powerpc/kvm/book3s_32_mmu_host.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ extern char etext[];
130130
int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte,
131131
bool iswrite)
132132
{
133+
struct page *page;
133134
kvm_pfn_t hpaddr;
134135
u64 vpn;
135136
u64 vsid;
@@ -145,7 +146,7 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte,
145146
bool writable;
146147

147148
/* Get host physical address for gpa */
148-
hpaddr = kvmppc_gpa_to_pfn(vcpu, orig_pte->raddr, iswrite, &writable);
149+
hpaddr = kvmppc_gpa_to_pfn(vcpu, orig_pte->raddr, iswrite, &writable, &page);
149150
if (is_error_noslot_pfn(hpaddr)) {
150151
printk(KERN_INFO "Couldn't get guest page for gpa %lx!\n",
151152
orig_pte->raddr);
@@ -232,7 +233,7 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte,
232233

233234
pte = kvmppc_mmu_hpte_cache_next(vcpu);
234235
if (!pte) {
235-
kvm_release_pfn_clean(hpaddr >> PAGE_SHIFT);
236+
kvm_release_page_unused(page);
236237
r = -EAGAIN;
237238
goto out;
238239
}
@@ -250,7 +251,7 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte,
250251

251252
kvmppc_mmu_hpte_cache_map(vcpu, pte);
252253

253-
kvm_release_pfn_clean(hpaddr >> PAGE_SHIFT);
254+
kvm_release_page_clean(page);
254255
out:
255256
return r;
256257
}

arch/powerpc/kvm/book3s_64_mmu_host.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,14 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte,
8888
struct hpte_cache *cpte;
8989
unsigned long gfn = orig_pte->raddr >> PAGE_SHIFT;
9090
unsigned long pfn;
91+
struct page *page;
9192

9293
/* used to check for invalidations in progress */
9394
mmu_seq = kvm->mmu_invalidate_seq;
9495
smp_rmb();
9596

9697
/* Get host physical address for gpa */
97-
pfn = kvmppc_gpa_to_pfn(vcpu, orig_pte->raddr, iswrite, &writable);
98+
pfn = kvmppc_gpa_to_pfn(vcpu, orig_pte->raddr, iswrite, &writable, &page);
9899
if (is_error_noslot_pfn(pfn)) {
99100
printk(KERN_INFO "Couldn't get guest page for gpa %lx!\n",
100101
orig_pte->raddr);
@@ -199,10 +200,9 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte,
199200
}
200201

201202
out_unlock:
202-
if (!orig_pte->may_write || !writable)
203-
kvm_release_pfn_clean(pfn);
204-
else
205-
kvm_release_pfn_dirty(pfn);
203+
/* FIXME: Don't unconditionally pass unused=false. */
204+
kvm_release_faultin_page(kvm, page, false,
205+
orig_pte->may_write && writable);
206206
spin_unlock(&kvm->mmu_lock);
207207
if (cpte)
208208
kvmppc_mmu_hpte_cache_free(cpte);

0 commit comments

Comments
 (0)