From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58299) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V6As8-0002lK-BR for qemu-devel@nongnu.org; Sun, 04 Aug 2013 22:50:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V6Arz-0005uj-Av for qemu-devel@nongnu.org; Sun, 04 Aug 2013 22:50:12 -0400 Received: from e28smtp03.in.ibm.com ([122.248.162.3]:49754) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V6Ary-0005nC-NE for qemu-devel@nongnu.org; Sun, 04 Aug 2013 22:50:03 -0400 Received: from /spool/local by e28smtp03.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 5 Aug 2013 08:12:43 +0530 Received: from d28relay02.in.ibm.com (d28relay02.in.ibm.com [9.184.220.59]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id A25A21258052 for ; Mon, 5 Aug 2013 08:19:27 +0530 (IST) Received: from d28av02.in.ibm.com (d28av02.in.ibm.com [9.184.220.64]) by d28relay02.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r752p24339911596 for ; Mon, 5 Aug 2013 08:21:05 +0530 Received: from d28av02.in.ibm.com (loopback [127.0.0.1]) by d28av02.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r752nowf014822 for ; Mon, 5 Aug 2013 12:49:50 +1000 Message-ID: <51FF129C.7080707@linux.vnet.ibm.com> Date: Mon, 05 Aug 2013 10:49:00 +0800 From: Lei Li MIME-Version: 1.0 References: <1374783499-2550-1-git-send-email-lilei@linux.vnet.ibm.com> <1374783499-2550-5-git-send-email-lilei@linux.vnet.ibm.com> <51FC0B48.8020405@linux.vnet.ibm.com> In-Reply-To: <51FC0B48.8020405@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 04/12] arch_init: introduce ram_page_save() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Michael R. Hines" Cc: aarcange@redhat.com, aliguori@us.ibm.com, quintela@redhat.com, qemu-devel@nongnu.org, lagarcia@br.ibm.com, pbonzini@redhat.com, rcj@linux.vnet.ibm.com On 08/03/2013 03:40 AM, Michael R. Hines wrote: > On 07/25/2013 04:18 PM, Lei Li wrote: >> Signed-off-by: Lei Li >> --- >> arch_init.c | 58 >> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 files changed, 58 insertions(+), 0 deletions(-) >> >> diff --git a/arch_init.c b/arch_init.c >> index a8b91ee..a418071 100644 >> --- a/arch_init.c >> +++ b/arch_init.c >> @@ -699,6 +699,64 @@ static uint64_t ram_save_pending(QEMUFile *f, >> void *opaque, uint64_t max_size) >> return remaining_size; >> } >> >> +/* This is the last block from where we have sent data for local >> migration */ >> +static RAMBlock *last_block_local; >> +static ram_addr_t last_offset_local; >> + >> +static int ram_page_save(QEMUFile *f) >> +{ >> + RAMBlock *block = last_block_local; >> + ram_addr_t offset = last_offset_local; >> + MemoryRegion *mr = block->mr; >> + int bytes_sent = 0; >> + >> + if (!block) { >> + block = QTAILQ_FIRST(&ram_list.blocks); >> + } >> + >> + do { >> + mr = block->mr; >> + uint8_t *p; >> + int cont = (block == last_block_local) ? >> RAM_SAVE_FLAG_CONTINUE : 0; >> + >> + p = memory_region_get_ram_ptr(mr) + offset; >> + >> + if (is_zero_page(p)) { >> + qemu_put_be64(f, offset | cont | RAM_SAVE_FLAG_COMPRESS); >> + if (!cont) { >> + qemu_put_byte(f, strlen(block->idstr)); >> + qemu_put_buffer(f, (uint8_t *)block->idstr, >> + strlen(block->idstr)); >> + } >> + qemu_put_byte(f, *p); >> + bytes_sent = 1; >> + } else { >> + qemu_put_be64(f, offset | cont | RAM_SAVE_FLAG_PAGE); >> + if (!cont) { >> + qemu_put_byte(f, strlen(block->idstr)); >> + qemu_put_buffer(f, (uint8_t *)block->idstr, >> + strlen(block->idstr)); >> + } >> + qemu_put_buffer(f, p, TARGET_PAGE_SIZE); >> + bytes_sent = TARGET_PAGE_SIZE; >> + } >> + >> + offset += TARGET_PAGE_SIZE; >> + if (offset >= block->length) { >> + offset = 0; >> + block = QTAILQ_NEXT(block, next); >> + if (!block) { >> + block = QTAILQ_FIRST(&ram_list.blocks); >> + } >> + } >> + } while (block != last_block_local || offset != last_offset_local); >> + >> + last_block_local = block; >> + last_offset_local = offset; >> + >> + return bytes_sent; >> +} >> + >> static int load_xbzrle(QEMUFile *f, ram_addr_t addr, void *host) >> { >> int ret, rc = 0; > > Seems like there's a lot of duplicate code. > > We have new hooks to override the way memory is saved in arch_init.c > > See the QEMUFileOps......... save_page() / before_ram_iterate() / > after_ram_iterate() > > You might need to introduce a new "load_page()" pointer in QEMUFileOps. > > Then all this code can be private to migration-local.c Hi Michael, This implementation was based on the tree that rdma migration you added have not been merged... Yes, Paolo also suggested that reuses the rdma hooks and I am trying to figure it out. Your comments really helps, thanks for your suggestions! > > - Michael > > > -- Lei