aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86.c
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2009-01-05 08:21:42 -0500
committerAvi Kivity <avi@redhat.com>2009-03-24 05:03:01 -0400
commit269e05e48502f1cc06802e9fba90f5100dd6bb0d (patch)
tree9b3501dc1f5e137c2dca7eacf15c0353f627be97 /arch/x86/kvm/x86.c
parenta77ab5ead5c1fef2c6c5a9b3cf3765e52643a2aa (diff)
KVM: Properly lock PIT creation
Otherwise, two threads can create a PIT in parallel and cause a memory leak. Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r--arch/x86/kvm/x86.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index a1f14611f4b9..6fbc34603375 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1837,10 +1837,16 @@ long kvm_arch_vm_ioctl(struct file *filp,
1837 goto out; 1837 goto out;
1838 break; 1838 break;
1839 case KVM_CREATE_PIT: 1839 case KVM_CREATE_PIT:
1840 mutex_lock(&kvm->lock);
1841 r = -EEXIST;
1842 if (kvm->arch.vpit)
1843 goto create_pit_unlock;
1840 r = -ENOMEM; 1844 r = -ENOMEM;
1841 kvm->arch.vpit = kvm_create_pit(kvm); 1845 kvm->arch.vpit = kvm_create_pit(kvm);
1842 if (kvm->arch.vpit) 1846 if (kvm->arch.vpit)
1843 r = 0; 1847 r = 0;
1848 create_pit_unlock:
1849 mutex_unlock(&kvm->lock);
1844 break; 1850 break;
1845 case KVM_IRQ_LINE: { 1851 case KVM_IRQ_LINE: {
1846 struct kvm_irq_level irq_event; 1852 struct kvm_irq_level irq_event;