KVM: Clean up error handling during VCPU creation
PATCH RESEND 1/1 KVM: Clean up error handling during VCPU creation
So far kvm_arch_vcpu_setup is responsible for freeing the vcpu struct if it fails. Move this confusing resonsibility back into the hands of kvm_vm_ioctl_create_vcpu. Only kvm_arch_vcpu_setup of x86 is affected, all other archs cannot fail.
Signed-off-by Jan Kiszka <[email protected]>
--- arch/x86/kvm/x86.c | 5 ----- virt/kvm/kvm_main.c | 11 ++++++----- 2 files changed, 6 insertions(+), 10 deletions(-)
arch/x86/kvm/x86.c +0 -5
@@ -6126,12 +6126,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)if (r ==0 ) r =kvm_mmu_setup (vcpu);vcpu_put (vcpu); -if (r <0 ) - goto free_vcpu; -return 0 ; -free_vcpu: - kvm_x86_ops->vcpu_free (vcpu);return r; }
virt/kvm/kvm_main.c +6 -5
@@ -1612,18 +1612,18 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id) r =kvm_arch_vcpu_setup (vcpu);if (r) -return r; + goto vcpu_destroy;mutex_lock (&kvm->lock);if (atomic_read (&kvm->online_vcpus) ==KVM_MAX_VCPUS ) { r = -EINVAL ; - goto vcpu_destroy; + goto unlock_vcpu_destroy; }kvm_for_each_vcpu (r, v, kvm)if (v->vcpu_id == id) { r = -EEXIST ; - goto vcpu_destroy; + goto unlock_vcpu_destroy; }BUG_ON (kvm->vcpus[atomic_read (&kvm->online_vcpus)]);
@@ -1633,7 +1633,7 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id) r =create_vcpu_fd (vcpu);if (r <0 ) {kvm_put_kvm (kvm); - goto vcpu_destroy; + goto unlock_vcpu_destroy; } kvm->vcpus[atomic_read (&kvm->online_vcpus)] = vcpu;
@@ -1647,8 +1647,9 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)mutex_unlock (&kvm->lock);return r; -vcpu_destroy: +unlock_vcpu_destroy:mutex_unlock (&kvm->lock); +vcpu_destroy:kvm_arch_vcpu_destroy (vcpu);return r; }
Signature · 1 line
1.7.1
Avi Kivity
AppliedQuoted 4 lines · Jan Kiszka
So far
kvm_arch_vcpu_setupis responsible for freeing the vcpu struct if it fails. Move this confusing resonsibility back into the hands ofkvm_vm_ioctl_create_vcpu. Onlykvm_arch_vcpu_setupof x86 is affected, all other archs cannot fail.
Applied, thanks.
Signature · 1 line
error compiling committee.c: too many arguments to function