|
@@ -3698,12 +3698,15 @@ static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn)
|
|
|
return kvm_setup_async_pf(vcpu, gva, kvm_vcpu_gfn_to_hva(vcpu, gfn), &arch);
|
|
|
}
|
|
|
|
|
|
-static bool can_do_async_pf(struct kvm_vcpu *vcpu)
|
|
|
+bool kvm_can_do_async_pf(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
if (unlikely(!lapic_in_kernel(vcpu) ||
|
|
|
kvm_event_needs_reinjection(vcpu)))
|
|
|
return false;
|
|
|
|
|
|
+ if (is_guest_mode(vcpu))
|
|
|
+ return false;
|
|
|
+
|
|
|
return kvm_x86_ops->interrupt_allowed(vcpu);
|
|
|
}
|
|
|
|
|
@@ -3719,7 +3722,7 @@ static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn,
|
|
|
if (!async)
|
|
|
return false; /* *pfn has correct page already */
|
|
|
|
|
|
- if (!prefault && can_do_async_pf(vcpu)) {
|
|
|
+ if (!prefault && kvm_can_do_async_pf(vcpu)) {
|
|
|
trace_kvm_try_async_get_page(gva, gfn);
|
|
|
if (kvm_find_async_pf_gfn(vcpu, gfn)) {
|
|
|
trace_kvm_async_pf_doublefault(gva, gfn);
|