Hi Jiangshan, Glad to see your patch. It's a simple implementation which could provide very useful functions.
> +static void migration_bitmap_init(unsigned long *bitmap) { > + RAMBlock *block; > + > + bitmap_clear(bitmap, 0, last_ram_offset() >> TARGET_PAGE_BITS); > + rcu_read_lock(); > + QLIST_FOREACH_RCU(block, &ram_list.blocks, next) { > + if (!migrate_bypass_shared_memory() > || !qemu_ram_is_shared(block)) { > + bitmap_set(bitmap, block->offset >> TARGET_PAGE_BITS, You should use (block->offset >> TARGET_PAGE_BITS )/ BITS_PER_LONG here. > + block->used_length >> TARGET_PAGE_BITS); > + > + /* > + * Count the total number of pages used by ram blocks not > including > + * any gaps due to alignment or unplugs. > + */ > + migration_dirty_pages += block->used_length >> > TARGET_PAGE_BITS; > + } > + } > + rcu_read_unlock(); > } Liang