aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kvm/x86.c16
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))