Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26e5215f authored by Avi Kivity's avatar Avi Kivity
Browse files

KVM: Split vcpu creation to avoid vcpu_load() before preemption setup



Split kvm_arch_vcpu_create() into kvm_arch_vcpu_create() and
kvm_arch_vcpu_setup(), enabling preemption notification between the two.
This mean that we can now do vcpu_load() within kvm_arch_vcpu_setup().

Signed-off-by: default avatarAvi Kivity <avi@qumranet.com>
parent 0de10343
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -466,6 +466,7 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu);
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu);
void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu);
struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id);
int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu);
void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu);

int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu);
+4 −0
Original line number Diff line number Diff line
@@ -769,6 +769,10 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, int n)

	preempt_notifier_init(&vcpu->preempt_notifier, &kvm_preempt_ops);

	r = kvm_arch_vcpu_setup(vcpu);
	if (r)
		goto vcpu_destroy;

	mutex_lock(&kvm->lock);
	if (kvm->vcpus[n]) {
		r = -EEXIST;
+7 −9
Original line number Diff line number Diff line
@@ -2478,14 +2478,13 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu)
struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
						unsigned int id)
{
	int r;
	struct kvm_vcpu *vcpu = kvm_x86_ops->vcpu_create(kvm, id);

	if (IS_ERR(vcpu)) {
		r = -ENOMEM;
		goto fail;
	return kvm_x86_ops->vcpu_create(kvm, id);
}

int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
{
	int r;

	/* We do fxsave: this must be aligned. */
	BUG_ON((unsigned long)&vcpu->host_fx_image & 0xF);

@@ -2497,11 +2496,10 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
	if (r < 0)
		goto free_vcpu;

	return vcpu;
	return 0;
free_vcpu:
	kvm_x86_ops->vcpu_free(vcpu);
fail:
	return ERR_PTR(r);
	return r;
}

void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)