diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kvm/x86.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index a2a785472431..35f82f2c66f6 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -3208,18 +3208,15 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
3208 | struct kvm_memslots *slots, *old_slots; | 3208 | struct kvm_memslots *slots, *old_slots; |
3209 | unsigned long *dirty_bitmap; | 3209 | unsigned long *dirty_bitmap; |
3210 | 3210 | ||
3211 | r = -ENOMEM; | 3211 | dirty_bitmap = memslot->dirty_bitmap_head; |
3212 | dirty_bitmap = vmalloc(n); | 3212 | if (memslot->dirty_bitmap == dirty_bitmap) |
3213 | if (!dirty_bitmap) | 3213 | dirty_bitmap += n / sizeof(long); |
3214 | goto out; | ||
3215 | memset(dirty_bitmap, 0, n); | 3214 | memset(dirty_bitmap, 0, n); |
3216 | 3215 | ||
3217 | r = -ENOMEM; | 3216 | r = -ENOMEM; |
3218 | slots = kzalloc(sizeof(struct kvm_memslots), GFP_KERNEL); | 3217 | slots = kzalloc(sizeof(struct kvm_memslots), GFP_KERNEL); |
3219 | if (!slots) { | 3218 | if (!slots) |
3220 | vfree(dirty_bitmap); | ||
3221 | goto out; | 3219 | goto out; |
3222 | } | ||
3223 | memcpy(slots, kvm->memslots, sizeof(struct kvm_memslots)); | 3220 | memcpy(slots, kvm->memslots, sizeof(struct kvm_memslots)); |
3224 | slots->memslots[log->slot].dirty_bitmap = dirty_bitmap; | 3221 | slots->memslots[log->slot].dirty_bitmap = dirty_bitmap; |
3225 | slots->generation++; | 3222 | slots->generation++; |
@@ -3235,11 +3232,8 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
3235 | spin_unlock(&kvm->mmu_lock); | 3232 | spin_unlock(&kvm->mmu_lock); |
3236 | 3233 | ||
3237 | r = -EFAULT; | 3234 | r = -EFAULT; |
3238 | if (copy_to_user(log->dirty_bitmap, dirty_bitmap, n)) { | 3235 | if (copy_to_user(log->dirty_bitmap, dirty_bitmap, n)) |
3239 | vfree(dirty_bitmap); | ||
3240 | goto out; | 3236 | goto out; |
3241 | } | ||
3242 | vfree(dirty_bitmap); | ||
3243 | } else { | 3237 | } else { |
3244 | r = -EFAULT; | 3238 | r = -EFAULT; |
3245 | if (clear_user(log->dirty_bitmap, n)) | 3239 | if (clear_user(log->dirty_bitmap, n)) |