migration: introduce save_normal_page()
It directly sends the page to the stream neither checking zero nor using xbzrle or compression Reviewed-by: Peter Xu <peterx@redhat.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Xiao Guangrong <xiaoguangrong@tencent.com> Message-Id: <20180330075128.26919-10-xiaoguangrong@tencent.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
d7400a3409
commit
65dacaa04f
@ -1012,6 +1012,34 @@ static bool control_save_page(RAMState *rs, RAMBlock *block, ram_addr_t offset,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* directly send the page to the stream
|
||||||
|
*
|
||||||
|
* Returns the number of pages written.
|
||||||
|
*
|
||||||
|
* @rs: current RAM state
|
||||||
|
* @block: block that contains the page we want to send
|
||||||
|
* @offset: offset inside the block for the page
|
||||||
|
* @buf: the page to be sent
|
||||||
|
* @async: send to page asyncly
|
||||||
|
*/
|
||||||
|
static int save_normal_page(RAMState *rs, RAMBlock *block, ram_addr_t offset,
|
||||||
|
uint8_t *buf, bool async)
|
||||||
|
{
|
||||||
|
ram_counters.transferred += save_page_header(rs, rs->f, block,
|
||||||
|
offset | RAM_SAVE_FLAG_PAGE);
|
||||||
|
if (async) {
|
||||||
|
qemu_put_buffer_async(rs->f, buf, TARGET_PAGE_SIZE,
|
||||||
|
migrate_release_ram() &
|
||||||
|
migration_in_postcopy());
|
||||||
|
} else {
|
||||||
|
qemu_put_buffer(rs->f, buf, TARGET_PAGE_SIZE);
|
||||||
|
}
|
||||||
|
ram_counters.transferred += TARGET_PAGE_SIZE;
|
||||||
|
ram_counters.normal++;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ram_save_page: send the given page to the stream
|
* ram_save_page: send the given page to the stream
|
||||||
*
|
*
|
||||||
@ -1052,18 +1080,7 @@ static int ram_save_page(RAMState *rs, PageSearchStatus *pss, bool last_stage)
|
|||||||
|
|
||||||
/* XBZRLE overflow or normal page */
|
/* XBZRLE overflow or normal page */
|
||||||
if (pages == -1) {
|
if (pages == -1) {
|
||||||
ram_counters.transferred +=
|
pages = save_normal_page(rs, block, offset, p, send_async);
|
||||||
save_page_header(rs, rs->f, block, offset | RAM_SAVE_FLAG_PAGE);
|
|
||||||
if (send_async) {
|
|
||||||
qemu_put_buffer_async(rs->f, p, TARGET_PAGE_SIZE,
|
|
||||||
migrate_release_ram() &
|
|
||||||
migration_in_postcopy());
|
|
||||||
} else {
|
|
||||||
qemu_put_buffer(rs->f, p, TARGET_PAGE_SIZE);
|
|
||||||
}
|
|
||||||
ram_counters.transferred += TARGET_PAGE_SIZE;
|
|
||||||
pages = 1;
|
|
||||||
ram_counters.normal++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
XBZRLE_cache_unlock();
|
XBZRLE_cache_unlock();
|
||||||
@ -1194,14 +1211,7 @@ static int ram_save_compressed_page(RAMState *rs, PageSearchStatus *pss,
|
|||||||
* we post it as normal page as compression will take much
|
* we post it as normal page as compression will take much
|
||||||
* CPU resource.
|
* CPU resource.
|
||||||
*/
|
*/
|
||||||
ram_counters.transferred += save_page_header(rs, rs->f, block,
|
pages = save_normal_page(rs, block, offset, p, true);
|
||||||
offset | RAM_SAVE_FLAG_PAGE);
|
|
||||||
qemu_put_buffer_async(rs->f, p, TARGET_PAGE_SIZE,
|
|
||||||
migrate_release_ram() &
|
|
||||||
migration_in_postcopy());
|
|
||||||
ram_counters.transferred += TARGET_PAGE_SIZE;
|
|
||||||
ram_counters.normal++;
|
|
||||||
pages = 1;
|
|
||||||
} else {
|
} else {
|
||||||
pages = compress_page_with_multi_thread(rs, block, offset);
|
pages = compress_page_with_multi_thread(rs, block, offset);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user