From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53402) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4PGp-000668-4S for qemu-devel@nongnu.org; Thu, 03 Dec 2015 03:29:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a4PGl-0002ZD-3e for qemu-devel@nongnu.org; Thu, 03 Dec 2015 03:29:43 -0500 Received: from szxga03-in.huawei.com ([119.145.14.66]:24987) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4PGk-0002Yj-FD for qemu-devel@nongnu.org; Thu, 03 Dec 2015 03:29:39 -0500 References: <1448357149-17572-1-git-send-email-zhang.zhanghailiang@huawei.com> <1448357149-17572-17-git-send-email-zhang.zhanghailiang@huawei.com> <20151201193618.GE31209@work-vm> From: Hailiang Zhang Message-ID: <565FFD59.1050901@huawei.com> Date: Thu, 3 Dec 2015 16:29:13 +0800 MIME-Version: 1.0 In-Reply-To: <20151201193618.GE31209@work-vm> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH COLO-Frame v11 16/39] ram/COLO: Record the dirty pages that SVM received List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Dr. David Alan Gilbert" Cc: lizhijian@cn.fujitsu.com, quintela@redhat.com, yunhong.jiang@intel.com, eddie.dong@intel.com, peter.huangpeng@huawei.com, qemu-devel@nongnu.org, arei.gonglei@huawei.com, stefanha@redhat.com, amit.shah@redhat.com, hongyang.yang@easystack.cn On 2015/12/2 3:36, Dr. David Alan Gilbert wrote: > * zhanghailiang (zhang.zhanghailiang@huawei.com) wrote: >> We record the address of the dirty pages that received, >> it will help flushing pages that cached into SVM. >> We record them by re-using migration dirty bitmap. >> >> Signed-off-by: zhanghailiang >> --- >> v11: >> - Split a new helper function from original >> host_from_stream_offset() (Dave's suggestion) >> - Only do recording work in this patch >> v10: >> - New patch split from v9's patch 13 >> - Rebase to master to use 'migration_bitmap_rcu' >> --- >> migration/ram.c | 30 ++++++++++++++++++++++++++++++ >> 1 file changed, 30 insertions(+) >> >> diff --git a/migration/ram.c b/migration/ram.c >> index 9d946a1..da6bbd6 100644 >> --- a/migration/ram.c >> +++ b/migration/ram.c >> @@ -2153,6 +2153,7 @@ static inline RAMBlock *ram_block_from_stream(QEMUFile *f, >> >> return block; >> } >> + >> len = qemu_get_byte(f); >> qemu_get_buffer(f, (uint8_t *)id, len); >> id[len] = 0; > > That blank should probably go, but other than that: > I will remove it, thanks. > Reviewed-by: Dr. David Alan Gilbert > > Dave > >> @@ -2179,10 +2180,23 @@ static inline void *host_from_ram_block_offset(RAMBlock *block, >> static inline void *colo_cache_from_block_offset(RAMBlock *block, >> ram_addr_t offset) >> { >> + unsigned long *bitmap; >> + long k; >> + >> if (!block) { >> return NULL; >> } >> >> + k = (block->mr->ram_addr + offset) >> TARGET_PAGE_BITS; >> + bitmap = atomic_rcu_read(&migration_bitmap_rcu)->bmap; >> + /* >> + * During colo checkpoint, we need bitmap of these migrated pages. >> + * It help us to decide which pages in ram cache should be flushed >> + * into VM's RAM later. >> + */ >> + if (!test_and_set_bit(k, bitmap)) { >> + migration_dirty_pages++; >> + } >> return block->colo_cache + offset; >> } >> >> @@ -2573,6 +2587,7 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id) >> int colo_init_ram_cache(void) >> { >> RAMBlock *block; >> + int64_t ram_cache_pages = last_ram_offset() >> TARGET_PAGE_BITS; >> >> rcu_read_lock(); >> QLIST_FOREACH_RCU(block, &ram_list.blocks, next) { >> @@ -2587,6 +2602,15 @@ int colo_init_ram_cache(void) >> } >> rcu_read_unlock(); >> ram_cache_enable = true; >> + /* >> + * Record the dirty pages that sent by PVM, we use this dirty bitmap together >> + * with to decide which page in cache should be flushed into SVM's RAM. Here >> + * we use the same name 'migration_bitmap_rcu' as for migration. >> + */ >> + migration_bitmap_rcu = g_new0(struct BitmapRcu, 1); >> + migration_bitmap_rcu->bmap = bitmap_new(ram_cache_pages); >> + migration_dirty_pages = 0; >> + >> return 0; >> >> out_locked: >> @@ -2604,9 +2628,15 @@ out_locked: >> void colo_release_ram_cache(void) >> { >> RAMBlock *block; >> + struct BitmapRcu *bitmap = migration_bitmap_rcu; >> >> ram_cache_enable = false; >> >> + atomic_rcu_set(&migration_bitmap_rcu, NULL); >> + if (bitmap) { >> + call_rcu(bitmap, migration_bitmap_free, rcu); >> + } >> + >> rcu_read_lock(); >> QLIST_FOREACH_RCU(block, &ram_list.blocks, next) { >> if (block->colo_cache) { >> -- >> 1.8.3.1 >> >> > -- > Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK > > . >