Message ID | 1374783499-2550-6-git-send-email-lilei@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
On 07/25/2013 04:18 PM, Lei Li wrote: > Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com> > --- > arch_init.c | 32 ++++++++++++++++++++++++++++++++ > 1 files changed, 32 insertions(+), 0 deletions(-) > > diff --git a/arch_init.c b/arch_init.c > index a418071..7eeb52f 100644 > --- a/arch_init.c > +++ b/arch_init.c > @@ -757,6 +757,38 @@ static int ram_page_save(QEMUFile *f) > return bytes_sent; > } > > +static int ram_save_local(QEMUFile *f, void *opaque) > +{ > + uint64_t bytes_sent = 0; > + uint64_t total_ram_bytes = ram_bytes_total(); > + > + qemu_mutex_lock_ramlist(); > + > + while (total_ram_bytes) { > + void *ram; > + MemoryRegion *mr; > + > + bytes_sent = ram_page_save(f); > + /* No more ram pages. */ > + if (bytes_sent == 0) { > + return bytes_sent; > + } > + > + mr = last_block_local->mr; > + ram = memory_region_get_ram_ptr(mr) + last_offset_local; > + > + /* DONTNEED the ram page that has already copied. */ > + qemu_madvise(ram, bytes_sent, QEMU_MADV_DONTNEED); > + total_ram_bytes -= bytes_sent; > + } > + > + qemu_mutex_unlock_ramlist(); > + > + qemu_put_be64(f, RAM_SAVE_FLAG_EOS); > + > + return bytes_sent; > +} > + > static int load_xbzrle(QEMUFile *f, ram_addr_t addr, void *host) > { > int ret, rc = 0; You need to create a new private structure "QEMUFileLocal". Then override f->save_page and point this to your own function. See migration-rdma.c for an example. - Michael
On 08/03/2013 03:42 AM, Michael R. Hines wrote: > On 07/25/2013 04:18 PM, Lei Li wrote: >> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com> >> --- >> arch_init.c | 32 ++++++++++++++++++++++++++++++++ >> 1 files changed, 32 insertions(+), 0 deletions(-) >> >> diff --git a/arch_init.c b/arch_init.c >> index a418071..7eeb52f 100644 >> --- a/arch_init.c >> +++ b/arch_init.c >> @@ -757,6 +757,38 @@ static int ram_page_save(QEMUFile *f) >> return bytes_sent; >> } >> >> +static int ram_save_local(QEMUFile *f, void *opaque) >> +{ >> + uint64_t bytes_sent = 0; >> + uint64_t total_ram_bytes = ram_bytes_total(); >> + >> + qemu_mutex_lock_ramlist(); >> + >> + while (total_ram_bytes) { >> + void *ram; >> + MemoryRegion *mr; >> + >> + bytes_sent = ram_page_save(f); >> + /* No more ram pages. */ >> + if (bytes_sent == 0) { >> + return bytes_sent; >> + } >> + >> + mr = last_block_local->mr; >> + ram = memory_region_get_ram_ptr(mr) + last_offset_local; >> + >> + /* DONTNEED the ram page that has already copied. */ >> + qemu_madvise(ram, bytes_sent, QEMU_MADV_DONTNEED); >> + total_ram_bytes -= bytes_sent; >> + } >> + >> + qemu_mutex_unlock_ramlist(); >> + >> + qemu_put_be64(f, RAM_SAVE_FLAG_EOS); >> + >> + return bytes_sent; >> +} >> + >> static int load_xbzrle(QEMUFile *f, ram_addr_t addr, void *host) >> { >> int ret, rc = 0; > > You need to create a new private structure "QEMUFileLocal". > > Then override f->save_page and point this to your own function. > > See migration-rdma.c for an example. Yes, I am looking at it. :) > > - Michael
diff --git a/arch_init.c b/arch_init.c index a418071..7eeb52f 100644 --- a/arch_init.c +++ b/arch_init.c @@ -757,6 +757,38 @@ static int ram_page_save(QEMUFile *f) return bytes_sent; } +static int ram_save_local(QEMUFile *f, void *opaque) +{ + uint64_t bytes_sent = 0; + uint64_t total_ram_bytes = ram_bytes_total(); + + qemu_mutex_lock_ramlist(); + + while (total_ram_bytes) { + void *ram; + MemoryRegion *mr; + + bytes_sent = ram_page_save(f); + /* No more ram pages. */ + if (bytes_sent == 0) { + return bytes_sent; + } + + mr = last_block_local->mr; + ram = memory_region_get_ram_ptr(mr) + last_offset_local; + + /* DONTNEED the ram page that has already copied. */ + qemu_madvise(ram, bytes_sent, QEMU_MADV_DONTNEED); + total_ram_bytes -= bytes_sent; + } + + qemu_mutex_unlock_ramlist(); + + qemu_put_be64(f, RAM_SAVE_FLAG_EOS); + + return bytes_sent; +} + static int load_xbzrle(QEMUFile *f, ram_addr_t addr, void *host) { int ret, rc = 0;
Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com> --- arch_init.c | 32 ++++++++++++++++++++++++++++++++ 1 files changed, 32 insertions(+), 0 deletions(-)