diff mbox

[v5,7/7] Use qemu_put_buffer_async for guest memory pages

Message ID 1363963683-26157-8-git-send-email-owasserm@redhat.com
State New
Headers show

Commit Message

Orit Wasserman March 22, 2013, 2:48 p.m. UTC
This will remove an unneeded copy of guest memory pages.
For the page header and device state we still copy the data to the
static buffer the other option is to allocate the memory on demand
which is more expensive.

Signed-off-by: Orit Wasserman <owasserm@redhat.com>
---
 arch_init.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Kevin Wolf April 5, 2013, 1:44 p.m. UTC | #1
Am 22.03.2013 um 15:48 hat Orit Wasserman geschrieben:
> This will remove an unneeded copy of guest memory pages.
> For the page header and device state we still copy the data to the
> static buffer the other option is to allocate the memory on demand
> which is more expensive.
> 
> Signed-off-by: Orit Wasserman <owasserm@redhat.com>

This seems to have killed savevm performance. I noticed that
qemu-iotests case 007 took forever on my test box (882 seconds instead
of something like 10 seconds). It can be reproduced by this script:

export MALLOC_PERTURB_=11
qemu-img create -f qcow2 -o compat=1.1 test.qcow2 1M
time qemu-system-x86_64 -nographic -hda $TEST_IMG -serial none -monitor stdio <<EOF
savevm test
quit
EOF

This used to take about 0.6s for me, after this patch it's around 10s.

Kevin
diff mbox

Patch

diff --git a/arch_init.c b/arch_init.c
index 98e2bc6..aa56a20 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -481,7 +481,7 @@  static int ram_save_block(QEMUFile *f, bool last_stage)
             /* XBZRLE overflow or normal page */
             if (bytes_sent == -1) {
                 bytes_sent = save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_PAGE);
-                qemu_put_buffer(f, p, TARGET_PAGE_SIZE);
+                qemu_put_buffer_async(f, p, TARGET_PAGE_SIZE);
                 bytes_sent += TARGET_PAGE_SIZE;
                 acct_info.norm_pages++;
             }