"Li, Liang Z" <liang.z...@intel.com> wrote: >> On Wed, Aug 10, 2016 at 10:22 AM, Li, Liang Z <liang.z...@intel.com> wrote: >> > 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. >> >> Hello, Li >> >> I might have missed something, could you tell me more? >> >> void bitmap_set(unsigned long *map, long start, long nr); I think the @start >> and @nr are both the number of the bits. >> >> thanks, >> Lai > > You are right, I have make a mistake by checking the code. Sorry for the > noise. > > BTW. Is it possible to bypass the shared block in the > 'ram_find_and_save_block'? > I mean no to check if a page is dirty for a shared block, it may make things > faster.
Nice spotted. That would make things faster. But once there we could split the bitmap by ramblock, and the migration_dirty_pages also per block, that would make all the searchs faster, and adding/removing blocks of ram much easier. If we enter optimizing that function, we could really do much better that the "again" parameter that we have right now. Later, Juan.