|
@@ -7481,15 +7481,19 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
|
|
|
int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
|
|
|
struct kvm_mp_state *mp_state)
|
|
|
{
|
|
|
+ int ret = -EINVAL;
|
|
|
+
|
|
|
+ vcpu_load(vcpu);
|
|
|
+
|
|
|
if (!lapic_in_kernel(vcpu) &&
|
|
|
mp_state->mp_state != KVM_MP_STATE_RUNNABLE)
|
|
|
- return -EINVAL;
|
|
|
+ goto out;
|
|
|
|
|
|
/* INITs are latched while in SMM */
|
|
|
if ((is_smm(vcpu) || vcpu->arch.smi_pending) &&
|
|
|
(mp_state->mp_state == KVM_MP_STATE_SIPI_RECEIVED ||
|
|
|
mp_state->mp_state == KVM_MP_STATE_INIT_RECEIVED))
|
|
|
- return -EINVAL;
|
|
|
+ goto out;
|
|
|
|
|
|
if (mp_state->mp_state == KVM_MP_STATE_SIPI_RECEIVED) {
|
|
|
vcpu->arch.mp_state = KVM_MP_STATE_INIT_RECEIVED;
|
|
@@ -7497,7 +7501,11 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
|
|
|
} else
|
|
|
vcpu->arch.mp_state = mp_state->mp_state;
|
|
|
kvm_make_request(KVM_REQ_EVENT, vcpu);
|
|
|
- return 0;
|
|
|
+
|
|
|
+ ret = 0;
|
|
|
+out:
|
|
|
+ vcpu_put(vcpu);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
int kvm_task_switch(struct kvm_vcpu *vcpu, u16 tss_selector, int idt_index,
|