forked from Minki/linux
KVM: PPC: Consistentify vcpu exit path
When getting out of __vcpu_run, let's be consistent about the state we return in. We want to always * have IRQs enabled * have called kvm_guest_exit before Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
0652eaaebe
commit
24afa37b9c
@ -868,12 +868,15 @@ program_interrupt:
|
||||
*/
|
||||
__hard_irq_disable();
|
||||
if (kvmppc_prepare_to_enter(vcpu)) {
|
||||
/* local_irq_enable(); */
|
||||
run->exit_reason = KVM_EXIT_INTR;
|
||||
r = -EINTR;
|
||||
} else {
|
||||
/* Going back to guest */
|
||||
kvm_guest_enter();
|
||||
}
|
||||
}
|
||||
|
||||
kvm_guest_enter();
|
||||
trace_kvm_book3s_reenter(r, vcpu);
|
||||
|
||||
return r;
|
||||
@ -1123,7 +1126,8 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
|
||||
|
||||
ret = __kvmppc_vcpu_run(kvm_run, vcpu);
|
||||
|
||||
kvm_guest_exit();
|
||||
/* No need for kvm_guest_exit. It's done in handle_exit.
|
||||
We also get here with interrupts enabled. */
|
||||
|
||||
current->thread.regs->msr = ext_msr;
|
||||
|
||||
|
@ -481,6 +481,7 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
|
||||
|
||||
local_irq_disable();
|
||||
if (kvmppc_prepare_to_enter(vcpu)) {
|
||||
local_irq_enable();
|
||||
kvm_run->exit_reason = KVM_EXIT_INTR;
|
||||
ret = -EINTR;
|
||||
goto out;
|
||||
@ -512,6 +513,9 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
|
||||
|
||||
ret = __kvmppc_vcpu_run(kvm_run, vcpu);
|
||||
|
||||
/* No need for kvm_guest_exit. It's done in handle_exit.
|
||||
We also get here with interrupts enabled. */
|
||||
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
kvmppc_save_guest_fp(vcpu);
|
||||
|
||||
@ -527,12 +531,9 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
|
||||
current->thread.fpexc_mode = fpexc_mode;
|
||||
#endif
|
||||
|
||||
kvm_guest_exit();
|
||||
|
||||
out:
|
||||
vcpu->mode = OUTSIDE_GUEST_MODE;
|
||||
smp_wmb();
|
||||
local_irq_enable();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -947,14 +948,16 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
||||
if (!(r & RESUME_HOST)) {
|
||||
local_irq_disable();
|
||||
if (kvmppc_prepare_to_enter(vcpu)) {
|
||||
local_irq_enable();
|
||||
run->exit_reason = KVM_EXIT_INTR;
|
||||
r = (-EINTR << 2) | RESUME_HOST | (r & RESUME_FLAG_NV);
|
||||
kvmppc_account_exit(vcpu, SIGNAL_EXITS);
|
||||
} else {
|
||||
/* Going back to guest */
|
||||
kvm_guest_enter();
|
||||
}
|
||||
}
|
||||
|
||||
kvm_guest_enter();
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user