aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/kvm_main.c
diff options
context:
space:
mode:
authorTakuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>2010-04-13 09:47:24 -0400
committerAvi Kivity <avi@redhat.com>2010-05-17 05:17:41 -0400
commit660c22c425cbe14badfb3b0a0206862577701ab7 (patch)
tree272889023481c810eebe54ab5343e634f0cd50bc /virt/kvm/kvm_main.c
parent020df0794f5764e742feaa718be88b8f1b4ce04f (diff)
KVM: limit the number of pages per memory slot
This patch limits the number of pages per memory slot to make us free from extra care about type issues. Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r--virt/kvm/kvm_main.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 55a5d4804499..d6351a34b297 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -557,6 +557,10 @@ int __kvm_set_memory_region(struct kvm *kvm,
557 base_gfn = mem->guest_phys_addr >> PAGE_SHIFT; 557 base_gfn = mem->guest_phys_addr >> PAGE_SHIFT;
558 npages = mem->memory_size >> PAGE_SHIFT; 558 npages = mem->memory_size >> PAGE_SHIFT;
559 559
560 r = -EINVAL;
561 if (npages > KVM_MEM_MAX_NR_PAGES)
562 goto out;
563
560 if (!npages) 564 if (!npages)
561 mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES; 565 mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES;
562 566
@@ -1187,13 +1191,10 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn)
1187 memslot = gfn_to_memslot_unaliased(kvm, gfn); 1191 memslot = gfn_to_memslot_unaliased(kvm, gfn);
1188 if (memslot && memslot->dirty_bitmap) { 1192 if (memslot && memslot->dirty_bitmap) {
1189 unsigned long rel_gfn = gfn - memslot->base_gfn; 1193 unsigned long rel_gfn = gfn - memslot->base_gfn;
1190 unsigned long *p = memslot->dirty_bitmap +
1191 rel_gfn / BITS_PER_LONG;
1192 int offset = rel_gfn % BITS_PER_LONG;
1193 1194
1194 /* avoid RMW */ 1195 /* avoid RMW */
1195 if (!generic_test_le_bit(offset, p)) 1196 if (!generic_test_le_bit(rel_gfn, memslot->dirty_bitmap))
1196 generic___set_le_bit(offset, p); 1197 generic___set_le_bit(rel_gfn, memslot->dirty_bitmap);
1197 } 1198 }
1198} 1199}
1199 1200