From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LBuY9-0007VI-Oj for qemu-devel@nongnu.org; Sun, 14 Dec 2008 12:14:37 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LBuY9-0007Uf-34 for qemu-devel@nongnu.org; Sun, 14 Dec 2008 12:14:37 -0500 Received: from [199.232.76.173] (port=49466 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LBuY8-0007UT-SN for qemu-devel@nongnu.org; Sun, 14 Dec 2008 12:14:36 -0500 Received: from mx2.redhat.com ([66.187.237.31]:59968) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LBuY8-0005bd-G9 for qemu-devel@nongnu.org; Sun, 14 Dec 2008 12:14:36 -0500 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id mBEHEZOg017707 for ; Sun, 14 Dec 2008 12:14:35 -0500 From: Avi Kivity Date: Sun, 14 Dec 2008 19:14:33 +0200 Message-Id: <1229274873-15218-1-git-send-email-avi@redhat.com> Subject: [Qemu-devel] [PATCH] Avoid loading ram pages that are all zeroes Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Restoring or migrating zero pages causes unnecessary allocation of memory. We can avoid this by dropping the loaded page instead of memset()ing it. Signed-off-by: Avi Kivity diff --git a/vl.c b/vl.c index 7b58605..42e97c9 100644 --- a/vl.c +++ b/vl.c @@ -3019,6 +3019,19 @@ void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque) /***********************************************************/ /* ram save/restore */ +static void drop_page(uint8_t *page) +{ + if (TARGET_PAGE_SIZE < getpagesize()) + return; +#ifdef CONFIG_KVM + if (kvm_enabled() && !kvm_has_sync_mmu()) + return; +#endif +#ifdef MADV_DONTNEED + madvise(page, TARGET_PAGE_SIZE, MADV_DONTNEED); +#endif +} + static int ram_get_page(QEMUFile *f, uint8_t *buf, int len) { int v; @@ -3032,6 +3045,8 @@ static int ram_get_page(QEMUFile *f, uint8_t *buf, int len) case 1: v = qemu_get_byte(f); memset(buf, v, len); + if (v == 0) + drop_page(buf); break; default: return -EINVAL; @@ -3289,6 +3304,8 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id) if (flags & RAM_SAVE_FLAG_COMPRESS) { uint8_t ch = qemu_get_byte(f); memset(phys_ram_base + addr, ch, TARGET_PAGE_SIZE); + if (ch == 0) + drop_page(phys_ram_base + addr); } else if (flags & RAM_SAVE_FLAG_PAGE) qemu_get_buffer(f, phys_ram_base + addr, TARGET_PAGE_SIZE); } while (!(flags & RAM_SAVE_FLAG_EOS));