mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
Maintain the number of dirty pages
Calculate the number of dirty pages takes a lot on hosts with lots of memory. Just maintain how many pages are dirty. Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
1720aeee72
commit
45f33f01f3
3 changed files with 12 additions and 14 deletions
15
arch_init.c
15
arch_init.c
|
@ -238,20 +238,7 @@ static uint64_t bytes_transferred;
|
|||
|
||||
static ram_addr_t ram_save_remaining(void)
|
||||
{
|
||||
RAMBlock *block;
|
||||
ram_addr_t count = 0;
|
||||
|
||||
QLIST_FOREACH(block, &ram_list.blocks, next) {
|
||||
ram_addr_t addr;
|
||||
for (addr = 0; addr < block->length; addr += TARGET_PAGE_SIZE) {
|
||||
if (memory_region_get_dirty(block->mr, addr, TARGET_PAGE_SIZE,
|
||||
DIRTY_MEMORY_MIGRATION)) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
return ram_list.dirty_pages;
|
||||
}
|
||||
|
||||
uint64_t ram_bytes_remaining(void)
|
||||
|
|
|
@ -486,6 +486,7 @@ typedef struct RAMBlock {
|
|||
typedef struct RAMList {
|
||||
uint8_t *phys_dirty;
|
||||
QLIST_HEAD(, RAMBlock) blocks;
|
||||
uint64_t dirty_pages;
|
||||
} RAMList;
|
||||
extern RAMList ram_list;
|
||||
|
||||
|
|
|
@ -74,6 +74,11 @@ static inline int cpu_physical_memory_get_dirty(ram_addr_t start,
|
|||
static inline int cpu_physical_memory_set_dirty_flags(ram_addr_t addr,
|
||||
int dirty_flags)
|
||||
{
|
||||
if ((dirty_flags & MIGRATION_DIRTY_FLAG) &&
|
||||
!cpu_physical_memory_get_dirty(addr, TARGET_PAGE_SIZE,
|
||||
MIGRATION_DIRTY_FLAG)) {
|
||||
ram_list.dirty_pages++;
|
||||
}
|
||||
return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] |= dirty_flags;
|
||||
}
|
||||
|
||||
|
@ -87,6 +92,11 @@ static inline int cpu_physical_memory_clear_dirty_flags(ram_addr_t addr,
|
|||
{
|
||||
int mask = ~dirty_flags;
|
||||
|
||||
if ((dirty_flags & MIGRATION_DIRTY_FLAG) &&
|
||||
cpu_physical_memory_get_dirty(addr, TARGET_PAGE_SIZE,
|
||||
MIGRATION_DIRTY_FLAG)) {
|
||||
ram_list.dirty_pages--;
|
||||
}
|
||||
return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] &= mask;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue