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
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)
|
static ram_addr_t ram_save_remaining(void)
|
||||||
{
|
{
|
||||||
RAMBlock *block;
|
return ram_list.dirty_pages;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t ram_bytes_remaining(void)
|
uint64_t ram_bytes_remaining(void)
|
||||||
|
|
|
@ -486,6 +486,7 @@ typedef struct RAMBlock {
|
||||||
typedef struct RAMList {
|
typedef struct RAMList {
|
||||||
uint8_t *phys_dirty;
|
uint8_t *phys_dirty;
|
||||||
QLIST_HEAD(, RAMBlock) blocks;
|
QLIST_HEAD(, RAMBlock) blocks;
|
||||||
|
uint64_t dirty_pages;
|
||||||
} RAMList;
|
} RAMList;
|
||||||
extern RAMList ram_list;
|
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,
|
static inline int cpu_physical_memory_set_dirty_flags(ram_addr_t addr,
|
||||||
int dirty_flags)
|
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;
|
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;
|
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;
|
return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] &= mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue