migration: refine ram_save_compressed_page

Use qemu_put_compression_data to do the compression directly
instead of using do_compress_ram_page, avoid some data copy.
very small improvement, at the same time, add code to check
if the compression is successful.

Signed-off-by: Liang Li <liang.z.li@intel.com>
Message-Id: <1462433579-13691-6-git-send-email-liang.z.li@intel.com>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
This commit is contained in:
Liang Li 2016-05-05 15:32:55 +08:00 committed by Amit Shah
parent b3be28969b
commit fc50438ed0

View file

@ -929,24 +929,20 @@ static int ram_save_compressed_page(QEMUFile *f, PageSearchStatus *pss,
uint64_t *bytes_transferred) uint64_t *bytes_transferred)
{ {
int pages = -1; int pages = -1;
uint64_t bytes_xmit; uint64_t bytes_xmit = 0;
uint8_t *p; uint8_t *p;
int ret; int ret, blen;
RAMBlock *block = pss->block; RAMBlock *block = pss->block;
ram_addr_t offset = pss->offset; ram_addr_t offset = pss->offset;
p = block->host + offset; p = block->host + offset;
bytes_xmit = 0;
ret = ram_control_save_page(f, block->offset, ret = ram_control_save_page(f, block->offset,
offset, TARGET_PAGE_SIZE, &bytes_xmit); offset, TARGET_PAGE_SIZE, &bytes_xmit);
if (bytes_xmit) { if (bytes_xmit) {
*bytes_transferred += bytes_xmit; *bytes_transferred += bytes_xmit;
pages = 1; pages = 1;
} }
if (block == last_sent_block) {
offset |= RAM_SAVE_FLAG_CONTINUE;
}
if (ret != RAM_SAVE_CONTROL_NOT_SUPP) { if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {
if (ret != RAM_SAVE_CONTROL_DELAYED) { if (ret != RAM_SAVE_CONTROL_DELAYED) {
if (bytes_xmit > 0) { if (bytes_xmit > 0) {
@ -966,19 +962,22 @@ static int ram_save_compressed_page(QEMUFile *f, PageSearchStatus *pss,
flush_compressed_data(f); flush_compressed_data(f);
pages = save_zero_page(f, block, offset, p, bytes_transferred); pages = save_zero_page(f, block, offset, p, bytes_transferred);
if (pages == -1) { if (pages == -1) {
set_compress_params(&comp_param[0], block, offset); /* Make sure the first page is sent out before other pages */
/* Use the qemu thread to compress the data to make sure the bytes_xmit = save_page_header(f, block, offset |
* first page is sent out before other pages RAM_SAVE_FLAG_COMPRESS_PAGE);
*/ blen = qemu_put_compression_data(f, p, TARGET_PAGE_SIZE,
bytes_xmit = do_compress_ram_page(&comp_param[0]); migrate_compress_level());
if (bytes_xmit > 0) { if (blen > 0) {
*bytes_transferred += bytes_xmit + blen;
acct_info.norm_pages++; acct_info.norm_pages++;
qemu_put_qemu_file(f, comp_param[0].file);
*bytes_transferred += bytes_xmit;
pages = 1; pages = 1;
} else {
qemu_file_set_error(f, blen);
error_report("compressed data failed!");
} }
} }
} else { } else {
offset |= RAM_SAVE_FLAG_CONTINUE;
pages = save_zero_page(f, block, offset, p, bytes_transferred); pages = save_zero_page(f, block, offset, p, bytes_transferred);
if (pages == -1) { if (pages == -1) {
pages = compress_page_with_multi_thread(f, block, offset, pages = compress_page_with_multi_thread(f, block, offset,