qemu-kvm: Change the methods of get dirty pages.
PATCH 3/3 qemu-kvm: Change the methods of get dirty pages.
Get number of the dirty and non-dirty pages using cpu_physical_memory_get_{dirty|non_dirty}_range().
Signed-off-by OHMURA Kei <[email protected]>
--- vl.c | 57 ++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 38 insertions(+), 19 deletions(-)
vl.c +38 -19
@@ -2798,7 +2798,7 @@ static int ram_save_block(QEMUFile *f)static ram_addr_t current_addr =0 ;ram_addr_t saved_addr = current_addr;ram_addr_t addr =0 ; -int found =0 ; +int i, found =0 , skip =0 ;while (addr < last_ram_offset) {if (kvm_enabled () && current_addr ==0 ) {
@@ -2810,28 +2810,37 @@ static int ram_save_block(QEMUFile *f)return 0 ; } } -if (cpu_physical_memory_get_dirty (current_addr,MIGRATION_DIRTY_FLAG )) { +if ((found =cpu_physical_memory_get_dirty_range (current_addr, + last_ram_offset,MIGRATION_DIRTY_FLAG ))) {uint8_t *p; -cpu_physical_memory_reset_dirty (current_addr, - current_addr +TARGET_PAGE_SIZE , -MIGRATION_DIRTY_FLAG ); +for (i =0 ; i < found; i++) { +ram_addr_t page_addr = current_addr + (i *TARGET_PAGE_SIZE ); +cpu_physical_memory_reset_dirty (page_addr, + page_addr +TARGET_PAGE_SIZE , +MIGRATION_DIRTY_FLAG ); - p =qemu_get_ram_ptr (current_addr); + p =qemu_get_ram_ptr (page_addr); -if (is_dup_page (p, *p)) { -qemu_put_be64 (f, current_addr |RAM_SAVE_FLAG_COMPRESS ); -qemu_put_byte (f, *p); - }else { -qemu_put_be64 (f, current_addr |RAM_SAVE_FLAG_PAGE ); -qemu_put_buffer (f, p,TARGET_PAGE_SIZE ); +if (is_dup_page (p, *p)) { +qemu_put_be64 (f, (page_addr) | +RAM_SAVE_FLAG_COMPRESS ); +qemu_put_byte (f, *p); + }else { +qemu_put_be64 (f, (page_addr) | +RAM_SAVE_FLAG_PAGE ); +qemu_put_buffer (f, p,TARGET_PAGE_SIZE ); + } } - found =1 ;break ; } - addr +=TARGET_PAGE_SIZE ; - current_addr = (saved_addr + addr) % last_ram_offset; +while ((skip =cpu_physical_memory_get_non_dirty_range (current_addr, + last_ram_offset,MIGRATION_DIRTY_FLAG )) !=0 ) { + addr +=TARGET_PAGE_SIZE * skip; + current_addr = (saved_addr + addr) % last_ram_offset; +if (addr >= last_ram_offset)break ; + } }return found;
@@ -2841,12 +2850,22 @@ static uint64_t bytes_transferred;static ram_addr_t ram_save_remaining (void ) { -ram_addr_t addr; +ram_addr_t addr =0 ;ram_addr_t count =0 ; +int found =0 , skip =0 ; -for (addr =0 ; addr < last_ram_offset; addr +=TARGET_PAGE_SIZE ) { -if (cpu_physical_memory_get_dirty (addr,MIGRATION_DIRTY_FLAG )) - count++; +while (addr < last_ram_offset) { +if ((found =cpu_physical_memory_get_dirty_range (addr, + last_ram_offset,MIGRATION_DIRTY_FLAG ))) { + count += found; + addr +=TARGET_PAGE_SIZE * found; + }else { +while ((skip =cpu_physical_memory_get_non_dirty_range (addr, + last_ram_offset,MIGRATION_DIRTY_FLAG )) !=0 ) { + addr +=TARGET_PAGE_SIZE * skip; +if (addr >= last_ram_offset)break ; + } + } }return count;
Signature · 1 line
1.6.3.3