diff options
author | Avi Kivity <avi@redhat.com> | 2009-01-05 08:21:42 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-03-24 05:03:01 -0400 |
commit | 269e05e48502f1cc06802e9fba90f5100dd6bb0d (patch) | |
tree | 9b3501dc1f5e137c2dca7eacf15c0353f627be97 /arch/x86/kvm/x86.c | |
parent | a77ab5ead5c1fef2c6c5a9b3cf3765e52643a2aa (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.c | 6 |
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; |