From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: Merging KVM live migration upstream Date: Fri, 01 May 2009 13:58:28 -0500 Message-ID: <49FB4654.6020204@codemonkey.ws> References: <49FABCF2.70909@web.de> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit Cc: Avi Kivity , Uri Lublin , kvm-devel To: Jan Kiszka Return-path: Received: from mail-qy0-f196.google.com ([209.85.221.196]:43680 "EHLO mail-qy0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751746AbZEAS6c (ORCPT ); Fri, 1 May 2009 14:58:32 -0400 Received: by qyk34 with SMTP id 34so3630288qyk.33 for ; Fri, 01 May 2009 11:58:32 -0700 (PDT) In-Reply-To: <49FABCF2.70909@web.de> Sender: kvm-owner@vger.kernel.org List-ID: Jan Kiszka wrote: > Avi or Uri, > > could you explain the first and third hunk? Why are they needed in > qemu-kvm, and will we also need something comparable upstream? They do > not look very beautiful. > This is leftovers from v1 loading. It used to be that we saved the vga buffer independently before slot tracking was as sophisticated in qemu as it is today. We don't restore v1 vga that would contain this section though so it's basically dead code. I'd just remove it personally. > The second hunk, I guess, should become a kvm hook to > cpu_physical_memory_get_dirty - or is this too costly for other users of > this inline function? > > And does anyone knows further migration-related hunks that are missing > upstream (except for the KVM hook in > cpu_physical_memory_set_dirty_tracking)? > The cpu_save/cpu_load additions. > Jan > > --- qemu/vl.c > +++ qemu-kvm/vl.c > @@ -3097,6 +3204,8 @@ static int ram_load_v1(QEMUFile *f, void > if (qemu_get_be32(f) != last_ram_offset) > return -EINVAL; > for(i = 0; i < last_ram_offset; i+= TARGET_PAGE_SIZE) { > + if (kvm_enabled() && (i>=0xa0000) && (i<0xc0000)) /* do not access video-addresses */ > + continue; > ret = ram_get_page(f, qemu_get_ram_ptr(i), TARGET_PAGE_SIZE); > if (ret) > return ret; > @@ -3183,6 +3292,15 @@ static int ram_save_block(QEMUFile *f) > int found = 0; > > while (addr < last_ram_offset) { > + if (kvm_enabled() && current_addr == 0) { > + int r; > + r = kvm_update_dirty_pages_log(); > + if (r) { > + fprintf(stderr, "%s: update dirty pages log failed %d\n", __FUNCTION__, r); > + qemu_file_set_error(f); > + return 0; > + } > + } > if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) { > uint8_t *p; > > @@ -3273,6 +3391,8 @@ static int ram_load_dead(QEMUFile *f, vo > if (ram_decompress_open(s, f) < 0) > return -EINVAL; > for(i = 0; i < last_ram_offset; i+= BDRV_HASH_BLOCK_SIZE) { > + if (kvm_enabled() && (i>=0xa0000) && (i<0xc0000)) /* do not access video-addresses */ > + continue; > if (ram_decompress_buf(s, buf, 1) < 0) { > fprintf(stderr, "Error while reading ram block header\n"); > goto error; > >