Commit 269e05e4 authored by Avi Kivity's avatar Avi Kivity
Browse files

KVM: Properly lock PIT creation



Otherwise, two threads can create a PIT in parallel and cause a memory leak.

Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent a77ab5ea
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -548,9 +548,7 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm)
	if (!pit)
		return NULL;

	mutex_lock(&kvm->lock);
	pit->irq_source_id = kvm_request_irq_source_id(kvm);
	mutex_unlock(&kvm->lock);
	if (pit->irq_source_id < 0) {
		kfree(pit);
		return NULL;
+6 −0
Original line number Diff line number Diff line
@@ -1837,10 +1837,16 @@ long kvm_arch_vm_ioctl(struct file *filp,
			goto out;
		break;
	case KVM_CREATE_PIT:
		mutex_lock(&kvm->lock);
		r = -EEXIST;
		if (kvm->arch.vpit)
			goto create_pit_unlock;
		r = -ENOMEM;
		kvm->arch.vpit = kvm_create_pit(kvm);
		if (kvm->arch.vpit)
			r = 0;
	create_pit_unlock:
		mutex_unlock(&kvm->lock);
		break;
	case KVM_IRQ_LINE: {
		struct kvm_irq_level irq_event;