On Tue, Dec 15, 2020 at 03:19:47PM +0800, Keqian Zhu wrote: > When handle dirty log, we face qemu_real_host_page_size and > TARGET_PAGE_SIZE. The first one is the granule of KVM dirty > bitmap, and the second one is the granule of QEMU dirty bitmap. > > Generally speaking, qemu_real_host_page_size >= TARGET_PAGE_SIZE,
Not just generally speaking, but must be. We have /* * On systems where the kernel can support different base page * sizes, host page size may be different from TARGET_PAGE_SIZE, * even with KVM. TARGET_PAGE_SIZE is assumed to be the minimum * page size for the system though. */ assert(TARGET_PAGE_SIZE <= qemu_real_host_page_size); at the top of kvm_init() to enforce it. The comment also says TARGET_PAGE_SIZE is assumed to be the minimum, which is more of a requirement than assumption. And, that requirement implies that we require all memory regions and base addresses to be aligned to the maximum possible target page size (in case the target actually uses something larger). Please remove 'Generally speaking' from the commit message. It implies this change is based on an assumption rather than a rule. (It'd be nice if we had these guest memory and TARGET_PAGE_SIZE requirements better documented and in one place.) > so misuse TARGET_PAGE_SIZE to init kvmslot dirty_bmap may waste > memory. For example, when qemu_real_host_page_size is 64K and > TARGET_PAGE_SIZE is 4K, this bugfix can save 93.75% memory. > > Signed-off-by: Keqian Zhu <zhukeqi...@huawei.com> > --- > accel/kvm/kvm-all.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c > index baaa54249d..c5e06288eb 100644 > --- a/accel/kvm/kvm-all.c > +++ b/accel/kvm/kvm-all.c > @@ -620,8 +620,12 @@ static void kvm_memslot_init_dirty_bitmap(KVMSlot *mem) > * too, in most cases). > * So for now, let's align to 64 instead of HOST_LONG_BITS here, in > * a hope that sizeof(long) won't become >8 any time soon. > + * > + * Note: the granule of kvm dirty log is qemu_real_host_page_size. > + * And mem->memory_size is aligned to it (otherwise this mem can't > + * be registered to KVM). > */ > - hwaddr bitmap_size = ALIGN(((mem->memory_size) >> TARGET_PAGE_BITS), > + hwaddr bitmap_size = ALIGN(mem->memory_size / qemu_real_host_page_size, > /*HOST_LONG_BITS*/ 64) / 8; > mem->dirty_bmap = g_malloc0(bitmap_size); > } > -- > 2.23.0 > > Besides the commit message Reviewed-by: Andrew Jones <drjo...@redhat.com> Thanks, drew