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

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
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -842,11 +842,7 @@ int kvm_timer_enable(struct kvm_vcpu *vcpu)
		return ret;

no_vgic:
	preempt_disable();
	timer->enabled = 1;
	kvm_timer_vcpu_load(vcpu);
	preempt_enable();

	return 0;
}

+8 −14
Original line number Diff line number Diff line
@@ -632,27 +632,22 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
	if (unlikely(!kvm_vcpu_initialized(vcpu)))
		return -ENOEXEC;

	vcpu_load(vcpu);

	ret = kvm_vcpu_first_run_init(vcpu);
	if (ret)
		goto out;
		return ret;

	if (run->exit_reason == KVM_EXIT_MMIO) {
		ret = kvm_handle_mmio_return(vcpu, vcpu->run);
		if (ret)
			goto out;
		if (kvm_arm_handle_step_debug(vcpu, vcpu->run)) {
			ret = 0;
			goto out;
			return ret;
		if (kvm_arm_handle_step_debug(vcpu, vcpu->run))
			return 0;
	}

	}
	if (run->immediate_exit)
		return -EINTR;

	if (run->immediate_exit) {
		ret = -EINTR;
		goto out;
	}
	vcpu_load(vcpu);

	kvm_sigset_activate(vcpu);

@@ -811,7 +806,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)

	kvm_sigset_deactivate(vcpu);

out:
	vcpu_put(vcpu);
	return ret;
}
+0 −11
Original line number Diff line number Diff line
@@ -302,17 +302,6 @@ int vgic_init(struct kvm *kvm)

	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:
	return ret;
}