[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v5 3/4] Use cpu_physical_memory_set_dirty_range() to
From: |
Yoshiaki Tamura |
Subject: |
[Qemu-devel] [PATCH v5 3/4] Use cpu_physical_memory_set_dirty_range() to update phys_ram_dirty. |
Date: |
Tue, 4 May 2010 16:41:29 +0900 |
Modifies kvm_physical_sync_dirty_bitmap 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: OHMURA Kei <address@hidden>
Signed-off-by: Yoshiaki Tamura <address@hidden>
---
kvm-all.c | 24 +++++++++---------------
1 files changed, 9 insertions(+), 15 deletions(-)
diff --git a/kvm-all.c b/kvm-all.c
index 6962b2b..5f8f1ec 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -290,8 +290,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;
+ unsigned int i;
+ unsigned long page_number, addr, addr1;
ram_addr_t ram_addr;
unsigned int len = ((mem_size / TARGET_PAGE_SIZE) + HOST_LONG_BITS - 1) /
HOST_LONG_BITS;
@@ -302,23 +302,17 @@ 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;
+ ram_addr = cpu_get_physical_page_desc(addr);
+ cpu_physical_memory_set_dirty_range(ram_addr,
+ leul_to_cpu(bitmap[i]));
}
}
return 0;
}
-#define ALIGN(x, y) (((x)+(y)-1) & ~((y)-1))
-
/**
* kvm_physical_sync_dirty_bitmap - Grab dirty bitmap from kernel space
* This function updates qemu's dirty bitmap using
cpu_physical_memory_set_dirty().
@@ -343,7 +337,7 @@ static int
kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
break;
}
- size = ALIGN(((mem->memory_size) >> TARGET_PAGE_BITS), HOST_LONG_BITS)
/ 8;
+ size = BITMAP_SIZE(mem->memory_size);
if (!d.dirty_bitmap) {
d.dirty_bitmap = qemu_malloc(size);
} else if (size > allocated_size) {
--
1.7.0.31.g1df487