The dirty and non-dirty pages are checked one by one. When most of the memory is not dirty, checking the dirty and non-dirty pages by multiple page size should be much faster than checking them one by one. We introduced bit-based phys_ram_dirty for VGA, CODE, MIGRATION, MASTER, and cpu_physical_memory_get_dirty_range() for this purpose.
Changes from v2 to v3 are: - Change FLAGS value to (1,2,4,8), and add IDX (0,1,2,3) - Use ffs to convert FLAGS to IDX. - Add a helper function which takes IDX. - Change the behavior of MASTER as a buffer. - Change dirty bitmap access to a loop. - Add brace after if () - Move some macros to qemu-common.h. Yoshiaki Tamura (6): Modify DIRTY_FLAG value and DIRTY_IDX introduce to use as indexes of bit-based phys_ram_dirty. Introduce bit-based phys_ram_dirty for VGA, CODE, MIGRATION and MASTER. Modifies wrapper functions for byte-based phys_ram_dirty bitmap to bit-based phys_ram_dirty bitmap. Introduce cpu_physical_memory_get_dirty_range(). Use cpu_physical_memory_set_dirty_range() to update phys_ram_dirty. Use cpu_physical_memory_get_dirty_range() to check multiple dirty pages. arch_init.c | 54 ++++++++++++++--------- bswap.h | 2 + cpu-all.h | 131 ++++++++++++++++++++++++++++++++++++++++++++++++-------- exec.c | 83 ++++++++++++++++++++++++++++++++++-- kvm-all.c | 33 +++++++-------- qemu-common.h | 3 + 6 files changed, 243 insertions(+), 63 deletions(-)