|
@@ -1534,18 +1534,6 @@ static ram_addr_t find_ram_offset(ram_addr_t size)
|
|
return offset;
|
|
return offset;
|
|
}
|
|
}
|
|
|
|
|
|
-static unsigned long last_ram_page(void)
|
|
|
|
-{
|
|
|
|
- RAMBlock *block;
|
|
|
|
- ram_addr_t last = 0;
|
|
|
|
-
|
|
|
|
- RCU_READ_LOCK_GUARD();
|
|
|
|
- RAMBLOCK_FOREACH(block) {
|
|
|
|
- last = MAX(last, block->offset + block->max_length);
|
|
|
|
- }
|
|
|
|
- return last >> TARGET_PAGE_BITS;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static void qemu_ram_setup_dump(void *addr, ram_addr_t size)
|
|
static void qemu_ram_setup_dump(void *addr, ram_addr_t size)
|
|
{
|
|
{
|
|
int ret;
|
|
int ret;
|
|
@@ -1799,13 +1787,11 @@ void qemu_ram_msync(RAMBlock *block, ram_addr_t start, ram_addr_t length)
|
|
}
|
|
}
|
|
|
|
|
|
/* Called with ram_list.mutex held */
|
|
/* Called with ram_list.mutex held */
|
|
-static void dirty_memory_extend(ram_addr_t old_ram_size,
|
|
|
|
- ram_addr_t new_ram_size)
|
|
|
|
|
|
+static void dirty_memory_extend(ram_addr_t new_ram_size)
|
|
{
|
|
{
|
|
- ram_addr_t old_num_blocks = DIV_ROUND_UP(old_ram_size,
|
|
|
|
- DIRTY_MEMORY_BLOCK_SIZE);
|
|
|
|
- ram_addr_t new_num_blocks = DIV_ROUND_UP(new_ram_size,
|
|
|
|
- DIRTY_MEMORY_BLOCK_SIZE);
|
|
|
|
|
|
+ unsigned int old_num_blocks = ram_list.num_dirty_blocks;
|
|
|
|
+ unsigned int new_num_blocks = DIV_ROUND_UP(new_ram_size,
|
|
|
|
+ DIRTY_MEMORY_BLOCK_SIZE);
|
|
int i;
|
|
int i;
|
|
|
|
|
|
/* Only need to extend if block count increased */
|
|
/* Only need to extend if block count increased */
|
|
@@ -1837,6 +1823,8 @@ static void dirty_memory_extend(ram_addr_t old_ram_size,
|
|
g_free_rcu(old_blocks, rcu);
|
|
g_free_rcu(old_blocks, rcu);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ ram_list.num_dirty_blocks = new_num_blocks;
|
|
}
|
|
}
|
|
|
|
|
|
static void ram_block_add(RAMBlock *new_block, Error **errp)
|
|
static void ram_block_add(RAMBlock *new_block, Error **errp)
|
|
@@ -1846,11 +1834,9 @@ static void ram_block_add(RAMBlock *new_block, Error **errp)
|
|
RAMBlock *block;
|
|
RAMBlock *block;
|
|
RAMBlock *last_block = NULL;
|
|
RAMBlock *last_block = NULL;
|
|
bool free_on_error = false;
|
|
bool free_on_error = false;
|
|
- ram_addr_t old_ram_size, new_ram_size;
|
|
|
|
|
|
+ ram_addr_t ram_size;
|
|
Error *err = NULL;
|
|
Error *err = NULL;
|
|
|
|
|
|
- old_ram_size = last_ram_page();
|
|
|
|
-
|
|
|
|
qemu_mutex_lock_ramlist();
|
|
qemu_mutex_lock_ramlist();
|
|
new_block->offset = find_ram_offset(new_block->max_length);
|
|
new_block->offset = find_ram_offset(new_block->max_length);
|
|
|
|
|
|
@@ -1901,11 +1887,8 @@ static void ram_block_add(RAMBlock *new_block, Error **errp)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- new_ram_size = MAX(old_ram_size,
|
|
|
|
- (new_block->offset + new_block->max_length) >> TARGET_PAGE_BITS);
|
|
|
|
- if (new_ram_size > old_ram_size) {
|
|
|
|
- dirty_memory_extend(old_ram_size, new_ram_size);
|
|
|
|
- }
|
|
|
|
|
|
+ ram_size = (new_block->offset + new_block->max_length) >> TARGET_PAGE_BITS;
|
|
|
|
+ dirty_memory_extend(ram_size);
|
|
/* Keep the list sorted from biggest to smallest block. Unlike QTAILQ,
|
|
/* Keep the list sorted from biggest to smallest block. Unlike QTAILQ,
|
|
* QLIST (which has an RCU-friendly variant) does not have insertion at
|
|
* QLIST (which has an RCU-friendly variant) does not have insertion at
|
|
* tail, so save the last element in last_block.
|
|
* tail, so save the last element in last_block.
|