diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 20:16:21 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 20:16:21 -0400 |
commit | 98edb6ca4174f17a64890a02f44c211c8b44fb3c (patch) | |
tree | 033bc5f7da410046d28dd1cefcd2d63cda33d25b /virt | |
parent | a8251096b427283c47e7d8f9568be6b388dd68ec (diff) | |
parent | 8fbf065d625617bbbf6b72d5f78f84ad13c8b547 (diff) |
Merge branch 'kvm-updates/2.6.35' of git://git.kernel.org/pub/scm/virt/kvm/kvm
* 'kvm-updates/2.6.35' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (269 commits)
KVM: x86: Add missing locking to arch specific vcpu ioctls
KVM: PPC: Add missing vcpu_load()/vcpu_put() in vcpu ioctls
KVM: MMU: Segregate shadow pages with different cr0.wp
KVM: x86: Check LMA bit before set_efer
KVM: Don't allow lmsw to clear cr0.pe
KVM: Add cpuid.txt file
KVM: x86: Tell the guest we'll warn it about tsc stability
x86, paravirt: don't compute pvclock adjustments if we trust the tsc
x86: KVM guest: Try using new kvm clock msrs
KVM: x86: export paravirtual cpuid flags in KVM_GET_SUPPORTED_CPUID
KVM: x86: add new KVMCLOCK cpuid feature
KVM: x86: change msr numbers for kvmclock
x86, paravirt: Add a global synchronization point for pvclock
x86, paravirt: Enable pvclock flags in vcpu_time_info structure
KVM: x86: Inject #GP with the right rip on efer writes
KVM: SVM: Don't allow nested guest to VMMCALL into host
KVM: x86: Fix exception reinjection forced to true
KVM: Fix wallclock version writing race
KVM: MMU: Don't read pdptrs with mmu spinlock held in mmu_alloc_roots
KVM: VMX: enable VMXON check with SMX enabled (Intel TXT)
...
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/assigned-dev.c | 8 | ||||
-rw-r--r-- | virt/kvm/coalesced_mmio.c | 6 | ||||
-rw-r--r-- | virt/kvm/iommu.c | 4 | ||||
-rw-r--r-- | virt/kvm/kvm_main.c | 63 |
4 files changed, 43 insertions, 38 deletions
diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c index 02ff2b19dbe2..4d10b1e047f4 100644 --- a/virt/kvm/assigned-dev.c +++ b/virt/kvm/assigned-dev.c | |||
@@ -316,12 +316,16 @@ static int assigned_device_enable_host_msix(struct kvm *kvm, | |||
316 | kvm_assigned_dev_intr, 0, | 316 | kvm_assigned_dev_intr, 0, |
317 | "kvm_assigned_msix_device", | 317 | "kvm_assigned_msix_device", |
318 | (void *)dev); | 318 | (void *)dev); |
319 | /* FIXME: free requested_irq's on failure */ | ||
320 | if (r) | 319 | if (r) |
321 | return r; | 320 | goto err; |
322 | } | 321 | } |
323 | 322 | ||
324 | return 0; | 323 | return 0; |
324 | err: | ||
325 | for (i -= 1; i >= 0; i--) | ||
326 | free_irq(dev->host_msix_entries[i].vector, (void *)dev); | ||
327 | pci_disable_msix(dev->dev); | ||
328 | return r; | ||
325 | } | 329 | } |
326 | 330 | ||
327 | #endif | 331 | #endif |
diff --git a/virt/kvm/coalesced_mmio.c b/virt/kvm/coalesced_mmio.c index 36e258029649..53850177163f 100644 --- a/virt/kvm/coalesced_mmio.c +++ b/virt/kvm/coalesced_mmio.c | |||
@@ -120,8 +120,10 @@ int kvm_coalesced_mmio_init(struct kvm *kvm) | |||
120 | return ret; | 120 | return ret; |
121 | 121 | ||
122 | out_free_dev: | 122 | out_free_dev: |
123 | kvm->coalesced_mmio_dev = NULL; | ||
123 | kfree(dev); | 124 | kfree(dev); |
124 | out_free_page: | 125 | out_free_page: |
126 | kvm->coalesced_mmio_ring = NULL; | ||
125 | __free_page(page); | 127 | __free_page(page); |
126 | out_err: | 128 | out_err: |
127 | return ret; | 129 | return ret; |
@@ -139,7 +141,7 @@ int kvm_vm_ioctl_register_coalesced_mmio(struct kvm *kvm, | |||
139 | struct kvm_coalesced_mmio_dev *dev = kvm->coalesced_mmio_dev; | 141 | struct kvm_coalesced_mmio_dev *dev = kvm->coalesced_mmio_dev; |
140 | 142 | ||
141 | if (dev == NULL) | 143 | if (dev == NULL) |
142 | return -EINVAL; | 144 | return -ENXIO; |
143 | 145 | ||
144 | mutex_lock(&kvm->slots_lock); | 146 | mutex_lock(&kvm->slots_lock); |
145 | if (dev->nb_zones >= KVM_COALESCED_MMIO_ZONE_MAX) { | 147 | if (dev->nb_zones >= KVM_COALESCED_MMIO_ZONE_MAX) { |
@@ -162,7 +164,7 @@ int kvm_vm_ioctl_unregister_coalesced_mmio(struct kvm *kvm, | |||
162 | struct kvm_coalesced_mmio_zone *z; | 164 | struct kvm_coalesced_mmio_zone *z; |
163 | 165 | ||
164 | if (dev == NULL) | 166 | if (dev == NULL) |
165 | return -EINVAL; | 167 | return -ENXIO; |
166 | 168 | ||
167 | mutex_lock(&kvm->slots_lock); | 169 | mutex_lock(&kvm->slots_lock); |
168 | 170 | ||
diff --git a/virt/kvm/iommu.c b/virt/kvm/iommu.c index 11692b9e8830..d2f06be63354 100644 --- a/virt/kvm/iommu.c +++ b/virt/kvm/iommu.c | |||
@@ -127,7 +127,7 @@ static int kvm_iommu_map_memslots(struct kvm *kvm) | |||
127 | int i, r = 0; | 127 | int i, r = 0; |
128 | struct kvm_memslots *slots; | 128 | struct kvm_memslots *slots; |
129 | 129 | ||
130 | slots = rcu_dereference(kvm->memslots); | 130 | slots = kvm_memslots(kvm); |
131 | 131 | ||
132 | for (i = 0; i < slots->nmemslots; i++) { | 132 | for (i = 0; i < slots->nmemslots; i++) { |
133 | r = kvm_iommu_map_pages(kvm, &slots->memslots[i]); | 133 | r = kvm_iommu_map_pages(kvm, &slots->memslots[i]); |
@@ -286,7 +286,7 @@ static int kvm_iommu_unmap_memslots(struct kvm *kvm) | |||
286 | int i; | 286 | int i; |
287 | struct kvm_memslots *slots; | 287 | struct kvm_memslots *slots; |
288 | 288 | ||
289 | slots = rcu_dereference(kvm->memslots); | 289 | slots = kvm_memslots(kvm); |
290 | 290 | ||
291 | for (i = 0; i < slots->nmemslots; i++) { | 291 | for (i = 0; i < slots->nmemslots; i++) { |
292 | kvm_iommu_put_pages(kvm, slots->memslots[i].base_gfn, | 292 | kvm_iommu_put_pages(kvm, slots->memslots[i].base_gfn, |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index c82ae2492634..f032806a212f 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -422,9 +422,6 @@ static struct kvm *kvm_create_vm(void) | |||
422 | spin_lock(&kvm_lock); | 422 | spin_lock(&kvm_lock); |
423 | list_add(&kvm->vm_list, &vm_list); | 423 | list_add(&kvm->vm_list, &vm_list); |
424 | spin_unlock(&kvm_lock); | 424 | spin_unlock(&kvm_lock); |
425 | #ifdef KVM_COALESCED_MMIO_PAGE_OFFSET | ||
426 | kvm_coalesced_mmio_init(kvm); | ||
427 | #endif | ||
428 | out: | 425 | out: |
429 | return kvm; | 426 | return kvm; |
430 | 427 | ||
@@ -560,6 +557,10 @@ int __kvm_set_memory_region(struct kvm *kvm, | |||
560 | base_gfn = mem->guest_phys_addr >> PAGE_SHIFT; | 557 | base_gfn = mem->guest_phys_addr >> PAGE_SHIFT; |
561 | npages = mem->memory_size >> PAGE_SHIFT; | 558 | npages = mem->memory_size >> PAGE_SHIFT; |
562 | 559 | ||
560 | r = -EINVAL; | ||
561 | if (npages > KVM_MEM_MAX_NR_PAGES) | ||
562 | goto out; | ||
563 | |||
563 | if (!npages) | 564 | if (!npages) |
564 | mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES; | 565 | mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES; |
565 | 566 | ||
@@ -833,7 +834,7 @@ EXPORT_SYMBOL_GPL(kvm_is_error_hva); | |||
833 | struct kvm_memory_slot *gfn_to_memslot_unaliased(struct kvm *kvm, gfn_t gfn) | 834 | struct kvm_memory_slot *gfn_to_memslot_unaliased(struct kvm *kvm, gfn_t gfn) |
834 | { | 835 | { |
835 | int i; | 836 | int i; |
836 | struct kvm_memslots *slots = rcu_dereference(kvm->memslots); | 837 | struct kvm_memslots *slots = kvm_memslots(kvm); |
837 | 838 | ||
838 | for (i = 0; i < slots->nmemslots; ++i) { | 839 | for (i = 0; i < slots->nmemslots; ++i) { |
839 | struct kvm_memory_slot *memslot = &slots->memslots[i]; | 840 | struct kvm_memory_slot *memslot = &slots->memslots[i]; |
@@ -855,7 +856,7 @@ struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn) | |||
855 | int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn) | 856 | int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn) |
856 | { | 857 | { |
857 | int i; | 858 | int i; |
858 | struct kvm_memslots *slots = rcu_dereference(kvm->memslots); | 859 | struct kvm_memslots *slots = kvm_memslots(kvm); |
859 | 860 | ||
860 | gfn = unalias_gfn_instantiation(kvm, gfn); | 861 | gfn = unalias_gfn_instantiation(kvm, gfn); |
861 | for (i = 0; i < KVM_MEMORY_SLOTS; ++i) { | 862 | for (i = 0; i < KVM_MEMORY_SLOTS; ++i) { |
@@ -899,7 +900,7 @@ out: | |||
899 | int memslot_id(struct kvm *kvm, gfn_t gfn) | 900 | int memslot_id(struct kvm *kvm, gfn_t gfn) |
900 | { | 901 | { |
901 | int i; | 902 | int i; |
902 | struct kvm_memslots *slots = rcu_dereference(kvm->memslots); | 903 | struct kvm_memslots *slots = kvm_memslots(kvm); |
903 | struct kvm_memory_slot *memslot = NULL; | 904 | struct kvm_memory_slot *memslot = NULL; |
904 | 905 | ||
905 | gfn = unalias_gfn(kvm, gfn); | 906 | gfn = unalias_gfn(kvm, gfn); |
@@ -914,6 +915,11 @@ int memslot_id(struct kvm *kvm, gfn_t gfn) | |||
914 | return memslot - slots->memslots; | 915 | return memslot - slots->memslots; |
915 | } | 916 | } |
916 | 917 | ||
918 | static unsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot, gfn_t gfn) | ||
919 | { | ||
920 | return slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE; | ||
921 | } | ||
922 | |||
917 | unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn) | 923 | unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn) |
918 | { | 924 | { |
919 | struct kvm_memory_slot *slot; | 925 | struct kvm_memory_slot *slot; |
@@ -922,7 +928,7 @@ unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn) | |||
922 | slot = gfn_to_memslot_unaliased(kvm, gfn); | 928 | slot = gfn_to_memslot_unaliased(kvm, gfn); |
923 | if (!slot || slot->flags & KVM_MEMSLOT_INVALID) | 929 | if (!slot || slot->flags & KVM_MEMSLOT_INVALID) |
924 | return bad_hva(); | 930 | return bad_hva(); |
925 | return (slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE); | 931 | return gfn_to_hva_memslot(slot, gfn); |
926 | } | 932 | } |
927 | EXPORT_SYMBOL_GPL(gfn_to_hva); | 933 | EXPORT_SYMBOL_GPL(gfn_to_hva); |
928 | 934 | ||
@@ -972,11 +978,6 @@ pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn) | |||
972 | } | 978 | } |
973 | EXPORT_SYMBOL_GPL(gfn_to_pfn); | 979 | EXPORT_SYMBOL_GPL(gfn_to_pfn); |
974 | 980 | ||
975 | static unsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot, gfn_t gfn) | ||
976 | { | ||
977 | return (slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE); | ||
978 | } | ||
979 | |||
980 | pfn_t gfn_to_pfn_memslot(struct kvm *kvm, | 981 | pfn_t gfn_to_pfn_memslot(struct kvm *kvm, |
981 | struct kvm_memory_slot *slot, gfn_t gfn) | 982 | struct kvm_memory_slot *slot, gfn_t gfn) |
982 | { | 983 | { |
@@ -1190,13 +1191,8 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn) | |||
1190 | memslot = gfn_to_memslot_unaliased(kvm, gfn); | 1191 | memslot = gfn_to_memslot_unaliased(kvm, gfn); |
1191 | if (memslot && memslot->dirty_bitmap) { | 1192 | if (memslot && memslot->dirty_bitmap) { |
1192 | unsigned long rel_gfn = gfn - memslot->base_gfn; | 1193 | unsigned long rel_gfn = gfn - memslot->base_gfn; |
1193 | unsigned long *p = memslot->dirty_bitmap + | ||
1194 | rel_gfn / BITS_PER_LONG; | ||
1195 | int offset = rel_gfn % BITS_PER_LONG; | ||
1196 | 1194 | ||
1197 | /* avoid RMW */ | 1195 | generic___set_le_bit(rel_gfn, memslot->dirty_bitmap); |
1198 | if (!generic_test_le_bit(offset, p)) | ||
1199 | generic___set_le_bit(offset, p); | ||
1200 | } | 1196 | } |
1201 | } | 1197 | } |
1202 | 1198 | ||
@@ -1609,7 +1605,6 @@ static long kvm_vm_ioctl(struct file *filp, | |||
1609 | r = -EFAULT; | 1605 | r = -EFAULT; |
1610 | if (copy_from_user(&zone, argp, sizeof zone)) | 1606 | if (copy_from_user(&zone, argp, sizeof zone)) |
1611 | goto out; | 1607 | goto out; |
1612 | r = -ENXIO; | ||
1613 | r = kvm_vm_ioctl_register_coalesced_mmio(kvm, &zone); | 1608 | r = kvm_vm_ioctl_register_coalesced_mmio(kvm, &zone); |
1614 | if (r) | 1609 | if (r) |
1615 | goto out; | 1610 | goto out; |
@@ -1621,7 +1616,6 @@ static long kvm_vm_ioctl(struct file *filp, | |||
1621 | r = -EFAULT; | 1616 | r = -EFAULT; |
1622 | if (copy_from_user(&zone, argp, sizeof zone)) | 1617 | if (copy_from_user(&zone, argp, sizeof zone)) |
1623 | goto out; | 1618 | goto out; |
1624 | r = -ENXIO; | ||
1625 | r = kvm_vm_ioctl_unregister_coalesced_mmio(kvm, &zone); | 1619 | r = kvm_vm_ioctl_unregister_coalesced_mmio(kvm, &zone); |
1626 | if (r) | 1620 | if (r) |
1627 | goto out; | 1621 | goto out; |
@@ -1755,12 +1749,19 @@ static struct file_operations kvm_vm_fops = { | |||
1755 | 1749 | ||
1756 | static int kvm_dev_ioctl_create_vm(void) | 1750 | static int kvm_dev_ioctl_create_vm(void) |
1757 | { | 1751 | { |
1758 | int fd; | 1752 | int fd, r; |
1759 | struct kvm *kvm; | 1753 | struct kvm *kvm; |
1760 | 1754 | ||
1761 | kvm = kvm_create_vm(); | 1755 | kvm = kvm_create_vm(); |
1762 | if (IS_ERR(kvm)) | 1756 | if (IS_ERR(kvm)) |
1763 | return PTR_ERR(kvm); | 1757 | return PTR_ERR(kvm); |
1758 | #ifdef KVM_COALESCED_MMIO_PAGE_OFFSET | ||
1759 | r = kvm_coalesced_mmio_init(kvm); | ||
1760 | if (r < 0) { | ||
1761 | kvm_put_kvm(kvm); | ||
1762 | return r; | ||
1763 | } | ||
1764 | #endif | ||
1764 | fd = anon_inode_getfd("kvm-vm", &kvm_vm_fops, kvm, O_RDWR); | 1765 | fd = anon_inode_getfd("kvm-vm", &kvm_vm_fops, kvm, O_RDWR); |
1765 | if (fd < 0) | 1766 | if (fd < 0) |
1766 | kvm_put_kvm(kvm); | 1767 | kvm_put_kvm(kvm); |
@@ -1928,11 +1929,6 @@ static int kvm_cpu_hotplug(struct notifier_block *notifier, unsigned long val, | |||
1928 | cpu); | 1929 | cpu); |
1929 | hardware_disable(NULL); | 1930 | hardware_disable(NULL); |
1930 | break; | 1931 | break; |
1931 | case CPU_UP_CANCELED: | ||
1932 | printk(KERN_INFO "kvm: disabling virtualization on CPU%d\n", | ||
1933 | cpu); | ||
1934 | smp_call_function_single(cpu, hardware_disable, NULL, 1); | ||
1935 | break; | ||
1936 | case CPU_ONLINE: | 1932 | case CPU_ONLINE: |
1937 | printk(KERN_INFO "kvm: enabling virtualization on CPU%d\n", | 1933 | printk(KERN_INFO "kvm: enabling virtualization on CPU%d\n", |
1938 | cpu); | 1934 | cpu); |
@@ -1991,7 +1987,9 @@ int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, | |||
1991 | int len, const void *val) | 1987 | int len, const void *val) |
1992 | { | 1988 | { |
1993 | int i; | 1989 | int i; |
1994 | struct kvm_io_bus *bus = rcu_dereference(kvm->buses[bus_idx]); | 1990 | struct kvm_io_bus *bus; |
1991 | |||
1992 | bus = srcu_dereference(kvm->buses[bus_idx], &kvm->srcu); | ||
1995 | for (i = 0; i < bus->dev_count; i++) | 1993 | for (i = 0; i < bus->dev_count; i++) |
1996 | if (!kvm_iodevice_write(bus->devs[i], addr, len, val)) | 1994 | if (!kvm_iodevice_write(bus->devs[i], addr, len, val)) |
1997 | return 0; | 1995 | return 0; |
@@ -2003,8 +2001,9 @@ int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, | |||
2003 | int len, void *val) | 2001 | int len, void *val) |
2004 | { | 2002 | { |
2005 | int i; | 2003 | int i; |
2006 | struct kvm_io_bus *bus = rcu_dereference(kvm->buses[bus_idx]); | 2004 | struct kvm_io_bus *bus; |
2007 | 2005 | ||
2006 | bus = srcu_dereference(kvm->buses[bus_idx], &kvm->srcu); | ||
2008 | for (i = 0; i < bus->dev_count; i++) | 2007 | for (i = 0; i < bus->dev_count; i++) |
2009 | if (!kvm_iodevice_read(bus->devs[i], addr, len, val)) | 2008 | if (!kvm_iodevice_read(bus->devs[i], addr, len, val)) |
2010 | return 0; | 2009 | return 0; |
@@ -2179,7 +2178,7 @@ static void kvm_sched_out(struct preempt_notifier *pn, | |||
2179 | kvm_arch_vcpu_put(vcpu); | 2178 | kvm_arch_vcpu_put(vcpu); |
2180 | } | 2179 | } |
2181 | 2180 | ||
2182 | int kvm_init(void *opaque, unsigned int vcpu_size, | 2181 | int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, |
2183 | struct module *module) | 2182 | struct module *module) |
2184 | { | 2183 | { |
2185 | int r; | 2184 | int r; |
@@ -2229,8 +2228,9 @@ int kvm_init(void *opaque, unsigned int vcpu_size, | |||
2229 | goto out_free_4; | 2228 | goto out_free_4; |
2230 | 2229 | ||
2231 | /* A kmem cache lets us meet the alignment requirements of fx_save. */ | 2230 | /* A kmem cache lets us meet the alignment requirements of fx_save. */ |
2232 | kvm_vcpu_cache = kmem_cache_create("kvm_vcpu", vcpu_size, | 2231 | if (!vcpu_align) |
2233 | __alignof__(struct kvm_vcpu), | 2232 | vcpu_align = __alignof__(struct kvm_vcpu); |
2233 | kvm_vcpu_cache = kmem_cache_create("kvm_vcpu", vcpu_size, vcpu_align, | ||
2234 | 0, NULL); | 2234 | 0, NULL); |
2235 | if (!kvm_vcpu_cache) { | 2235 | if (!kvm_vcpu_cache) { |
2236 | r = -ENOMEM; | 2236 | r = -ENOMEM; |
@@ -2279,7 +2279,6 @@ EXPORT_SYMBOL_GPL(kvm_init); | |||
2279 | 2279 | ||
2280 | void kvm_exit(void) | 2280 | void kvm_exit(void) |
2281 | { | 2281 | { |
2282 | tracepoint_synchronize_unregister(); | ||
2283 | kvm_exit_debug(); | 2282 | kvm_exit_debug(); |
2284 | misc_deregister(&kvm_dev); | 2283 | misc_deregister(&kvm_dev); |
2285 | kmem_cache_destroy(kvm_vcpu_cache); | 2284 | kmem_cache_destroy(kvm_vcpu_cache); |