Re: [Qemu-devel] [PATCH 05/12] arch_init: introduce ram_save_local()
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 li...@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 -- Lei
Re: [Qemu-devel] [PATCH 05/12] arch_init: introduce ram_save_local()
On 07/25/2013 04:18 PM, Lei Li wrote: Signed-off-by: Lei Li li...@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
[Qemu-devel] [PATCH 05/12] arch_init: introduce ram_save_local()
Signed-off-by: Lei Li li...@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; -- 1.7.7.6