Commit 829a5863 authored by Christoffer Dall's avatar Christoffer Dall Committed by Marc Zyngier

KVM: arm/arm64: Move vcpu_load call after kvm_vcpu_first_run_init

Moving the call to vcpu_load() in kvm_arch_vcpu_ioctl_run() to after
we've called kvm_vcpu_first_run_init() simplifies some of the vgic and
there is also no need to do vcpu_load() for things such as handling the
immediate_exit flag.
Reviewed-by: default avatarJulien Grall <julien.grall@arm.com>
Reviewed-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent 7a364bd5
...@@ -842,11 +842,7 @@ int kvm_timer_enable(struct kvm_vcpu *vcpu) ...@@ -842,11 +842,7 @@ int kvm_timer_enable(struct kvm_vcpu *vcpu)
return ret; return ret;
no_vgic: no_vgic:
preempt_disable();
timer->enabled = 1; timer->enabled = 1;
kvm_timer_vcpu_load(vcpu);
preempt_enable();
return 0; return 0;
} }
......
...@@ -632,27 +632,22 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) ...@@ -632,27 +632,22 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
if (unlikely(!kvm_vcpu_initialized(vcpu))) if (unlikely(!kvm_vcpu_initialized(vcpu)))
return -ENOEXEC; return -ENOEXEC;
vcpu_load(vcpu);
ret = kvm_vcpu_first_run_init(vcpu); ret = kvm_vcpu_first_run_init(vcpu);
if (ret) if (ret)
goto out; return ret;
if (run->exit_reason == KVM_EXIT_MMIO) { if (run->exit_reason == KVM_EXIT_MMIO) {
ret = kvm_handle_mmio_return(vcpu, vcpu->run); ret = kvm_handle_mmio_return(vcpu, vcpu->run);
if (ret) if (ret)
goto out; return ret;
if (kvm_arm_handle_step_debug(vcpu, vcpu->run)) { if (kvm_arm_handle_step_debug(vcpu, vcpu->run))
ret = 0; return 0;
goto out;
}
} }
if (run->immediate_exit) { if (run->immediate_exit)
ret = -EINTR; return -EINTR;
goto out;
} vcpu_load(vcpu);
kvm_sigset_activate(vcpu); kvm_sigset_activate(vcpu);
...@@ -811,7 +806,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) ...@@ -811,7 +806,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
kvm_sigset_deactivate(vcpu); kvm_sigset_deactivate(vcpu);
out:
vcpu_put(vcpu); vcpu_put(vcpu);
return ret; return ret;
} }
......
...@@ -302,17 +302,6 @@ int vgic_init(struct kvm *kvm) ...@@ -302,17 +302,6 @@ int vgic_init(struct kvm *kvm)
dist->initialized = true; dist->initialized = true;
/*
* If we're initializing GICv2 on-demand when first running the VCPU
* then we need to load the VGIC state onto the CPU. We can detect
* this easily by checking if we are in between vcpu_load and vcpu_put
* when we just initialized the VGIC.
*/
preempt_disable();
vcpu = kvm_arm_get_running_vcpu();
if (vcpu)
kvm_vgic_load(vcpu);
preempt_enable();
out: out:
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment