KVM: Fix memory leak on VCPU creation error
PATCH 1/1 KVM: Fix memory leak on VCPU creation error
From: Jan Kiszka <[email protected]>
If kvm_arch_vcpu_setup failed, we leaked the allocated VCPU structure so far.
--- virt/kvm/kvm_main.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-)
virt/kvm/kvm_main.c +6 -5
@@ -1609,18 +1609,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)]);
@@ -1630,7 +1630,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;
@@ -1644,8 +1644,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
virt/kvm/kvm_main.c static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id) · line 1613
Quoted 12 lines · Jan Kiszka
From: Jan Kiszka<[email protected]>
If
kvm_arch_vcpu_setupfailed, we leaked the allocated VCPU structure so far.virt/kvm/kvm_main.c +1
-1@@ -1609,18 +1609,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;
kvm_arch_vcpu_setup() (at least x86's) does a vcpu->free() on failure. I think the current code is correct (if confusing).
Signature · 1 line
error compiling committee.c: too many arguments to function
PATCH 1/1 KVM: Clean up error handling during VCPU creation
Quoted 9 lines · Avi Kivity
Quoted 8 lines · Jan Kiszka
From: Jan Kiszka<[email protected]>
If
kvm_arch_vcpu_setupfailed, we leaked the allocated VCPU structure so far.(quoted diff) +0
-0@@ -1609,18 +1609,18 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
Quoted 8 lines
Review static int kvm_vm_ioctl_create_vcpu(struct kvm · line 1614
Quoted 5 lines
(quoted diff) +1
-1r = kvm_arch_vcpu_setup(vcpu); if (r) - return r; + goto vcpu_destroy;
kvm_arch_vcpu_setup()(at least x86's) does avcpu->free()on failure. I think the current code is correct (if confusing).
Right. How about cleaning this inconsistency up? It looks like there is no problem calling kvm_arch_vcpu_destroy even if kvm_arch_vcpu_setup bailed out early.
Jan
------8<------
From: Jan Kiszka <[email protected]>
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.
--- 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
@@ -6002,12 +6002,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
@@ -1609,18 +1609,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)]);
@@ -1630,7 +1630,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;
@@ -1644,8 +1644,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