Commit 660c22c4 authored by Takuya Yoshikawa's avatar Takuya Yoshikawa Committed by Avi Kivity
Browse files

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: default avatarTakuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent 020df079
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -105,6 +105,12 @@ struct kvm_vcpu {
	struct kvm_vcpu_arch arch;
};

/*
 * Some of the bitops functions do not support too long bitmaps.
 * This number must be determined not to exceed such limits.
 */
#define KVM_MEM_MAX_NR_PAGES ((1UL << 31) - 1)

struct kvm_memory_slot {
	gfn_t base_gfn;
	unsigned long npages;
+6 −5
Original line number Diff line number Diff line
@@ -557,6 +557,10 @@ int __kvm_set_memory_region(struct kvm *kvm,
	base_gfn = mem->guest_phys_addr >> PAGE_SHIFT;
	npages = mem->memory_size >> PAGE_SHIFT;

	r = -EINVAL;
	if (npages > KVM_MEM_MAX_NR_PAGES)
		goto out;

	if (!npages)
		mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES;

@@ -1187,13 +1191,10 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn)
	memslot = gfn_to_memslot_unaliased(kvm, gfn);
	if (memslot && memslot->dirty_bitmap) {
		unsigned long rel_gfn = gfn - memslot->base_gfn;
		unsigned long *p = memslot->dirty_bitmap +
					rel_gfn / BITS_PER_LONG;
		int offset = rel_gfn % BITS_PER_LONG;

		/* avoid RMW */
		if (!generic_test_le_bit(offset, p))
			generic___set_le_bit(offset, p);
		if (!generic_test_le_bit(rel_gfn, memslot->dirty_bitmap))
			generic___set_le_bit(rel_gfn, memslot->dirty_bitmap);
	}
}