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.
This patch set is v2 based on the following discussion. http://www.mail-archive.com/k...@vger.kernel.org/msg30722.html I also rebased to qemu.git, but it needs the folloing patch set to be applied. http://article.gmane.org/gmane.comp.emulators.qemu/66007 Yoshiaki Tamura (6): Modify DIRTY_FLAG value 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 | 95 +++++++++++++++++++++++++++++++++++++++++++++++--------- exec.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- kvm-all.c | 33 +++++++++----------- 5 files changed, 222 insertions(+), 60 deletions(-)