Change ram_save_block to return -1 if there are no more changes
It will return 0 if the page is unmodifed. Signed-off-by: Orit Wasserman <owasserm@redhat.com>
This commit is contained in:
parent
6d2fe810ed
commit
6c779f22a9
26
arch_init.c
26
arch_init.c
@ -184,11 +184,19 @@ static void save_block_hdr(QEMUFile *f, RAMBlock *block, ram_addr_t offset,
|
|||||||
static RAMBlock *last_block;
|
static RAMBlock *last_block;
|
||||||
static ram_addr_t last_offset;
|
static ram_addr_t last_offset;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ram_save_block: Writes a page of memory to the stream f
|
||||||
|
*
|
||||||
|
* Returns: 0: if the page hasn't changed
|
||||||
|
* -1: if there are no more dirty pages
|
||||||
|
* n: the amount of bytes written in other case
|
||||||
|
*/
|
||||||
|
|
||||||
static int ram_save_block(QEMUFile *f)
|
static int ram_save_block(QEMUFile *f)
|
||||||
{
|
{
|
||||||
RAMBlock *block = last_block;
|
RAMBlock *block = last_block;
|
||||||
ram_addr_t offset = last_offset;
|
ram_addr_t offset = last_offset;
|
||||||
int bytes_sent = 0;
|
int bytes_sent = -1;
|
||||||
MemoryRegion *mr;
|
MemoryRegion *mr;
|
||||||
|
|
||||||
if (!block)
|
if (!block)
|
||||||
@ -354,10 +362,11 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
|
|||||||
int bytes_sent;
|
int bytes_sent;
|
||||||
|
|
||||||
bytes_sent = ram_save_block(f);
|
bytes_sent = ram_save_block(f);
|
||||||
bytes_transferred += bytes_sent;
|
/* no more blocks to sent */
|
||||||
if (bytes_sent == 0) { /* no more blocks */
|
if (bytes_sent < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
bytes_transferred += bytes_sent;
|
||||||
/* we want to check in the 1st loop, just in case it was the 1st time
|
/* we want to check in the 1st loop, just in case it was the 1st time
|
||||||
and we had to sync the dirty bitmap.
|
and we had to sync the dirty bitmap.
|
||||||
qemu_get_clock_ns() is a bit expensive, so we only check each some
|
qemu_get_clock_ns() is a bit expensive, so we only check each some
|
||||||
@ -405,14 +414,19 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
|
|||||||
|
|
||||||
static int ram_save_complete(QEMUFile *f, void *opaque)
|
static int ram_save_complete(QEMUFile *f, void *opaque)
|
||||||
{
|
{
|
||||||
int bytes_sent;
|
|
||||||
|
|
||||||
memory_global_sync_dirty_bitmap(get_system_memory());
|
memory_global_sync_dirty_bitmap(get_system_memory());
|
||||||
|
|
||||||
/* try transferring iterative blocks of memory */
|
/* try transferring iterative blocks of memory */
|
||||||
|
|
||||||
/* flush all remaining blocks regardless of rate limiting */
|
/* flush all remaining blocks regardless of rate limiting */
|
||||||
while ((bytes_sent = ram_save_block(f)) != 0) {
|
while (true) {
|
||||||
|
int bytes_sent;
|
||||||
|
|
||||||
|
bytes_sent = ram_save_block(f);
|
||||||
|
/* no more blocks to sent */
|
||||||
|
if (bytes_sent < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
bytes_transferred += bytes_sent;
|
bytes_transferred += bytes_sent;
|
||||||
}
|
}
|
||||||
memory_global_dirty_log_stop();
|
memory_global_dirty_log_stop();
|
||||||
|
Loading…
Reference in New Issue
Block a user