Modifies kvm_get_dirty_pages_log_range to use cpu_physical_memory_set_dirty_range() to update the row of the bit-based phys_ram_dirty bitmap at once. Signed-off-by: Yoshiaki Tamura <tamura.yoshiaki@xxxxxxxxxxxxx> Signed-off-by: OHMURA Kei <ohmura.kei@xxxxxxxxxxxxx> --- qemu-kvm.c | 19 ++++++------------- 1 files changed, 6 insertions(+), 13 deletions(-) diff --git a/qemu-kvm.c b/qemu-kvm.c index e417f21..75fa9b0 100644 --- a/qemu-kvm.c +++ b/qemu-kvm.c @@ -2305,9 +2305,8 @@ static int kvm_get_dirty_pages_log_range(unsigned long start_addr, unsigned long offset, unsigned long mem_size) { - unsigned int i, j; - unsigned long page_number, addr, addr1, c; - ram_addr_t ram_addr; + unsigned int i; + unsigned long page_number, addr, addr1; unsigned int len = ((mem_size / TARGET_PAGE_SIZE) + HOST_LONG_BITS - 1) / HOST_LONG_BITS; @@ -2317,16 +2316,10 @@ static int kvm_get_dirty_pages_log_range(unsigned long start_addr, */ for (i = 0; i < len; i++) { if (bitmap[i] != 0) { - c = leul_to_cpu(bitmap[i]); - do { - j = ffsl(c) - 1; - c &= ~(1ul << j); - page_number = i * HOST_LONG_BITS + j; - addr1 = page_number * TARGET_PAGE_SIZE; - addr = offset + addr1; - ram_addr = cpu_get_physical_page_desc(addr); - cpu_physical_memory_set_dirty(ram_addr); - } while (c != 0); + page_number = i * HOST_LONG_BITS; + addr1 = page_number * TARGET_PAGE_SIZE; + addr = offset + addr1; + cpu_physical_memory_set_dirty_range(addr, leul_to_cpu(bitmap[i])); } } return 0; -- 1.7.0.31.g1df487 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html