diff options
author | Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> | 2010-04-13 09:47:24 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-05-17 05:17:41 -0400 |
commit | 660c22c425cbe14badfb3b0a0206862577701ab7 (patch) | |
tree | 272889023481c810eebe54ab5343e634f0cd50bc /virt/kvm/kvm_main.c | |
parent | 020df0794f5764e742feaa718be88b8f1b4ce04f (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.c | 11 |
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 | ||