qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH/RFC] loader: enable roms, kernel and firmware files


From: Christian Borntraeger
Subject: [Qemu-devel] [PATCH/RFC] loader: enable roms, kernel and firmware files for KSM sharing
Date: Tue, 20 Sep 2016 15:48:31 +0200

Early patch for feedback.

With lots of similar small guests a big part of memory is consumed
by the ROMs that are reloaded at each start. We can reduce the
memory consumption by allowing KSM on this data.
This patches reduces the memory consumption of 200 guests with
a vmlinux as kernel + busybox ramdisk by 4GB after KSM has done
its job on s390.

A similar approach could be done in hw/i386/pc.c.

Signed-off-by: Christian Borntraeger <address@hidden>
---
 hw/core/loader.c     | 10 ++++++----
 include/hw/elf_ops.h |  2 ++
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/hw/core/loader.c b/hw/core/loader.c
index 53e0e41..def427c 100644
--- a/hw/core/loader.c
+++ b/hw/core/loader.c
@@ -867,7 +867,7 @@ int rom_add_file(const char *file, const char *fw_dir,
     }
 
     rom->datasize = rom->romsize;
-    rom->data     = g_malloc0(rom->datasize);
+    rom->data     = qemu_memalign(getpagesize(), rom->datasize);
     lseek(fd, 0, SEEK_SET);
     rc = read(fd, rom->data, rom->datasize);
     if (rc != rom->datasize) {
@@ -875,6 +875,7 @@ int rom_add_file(const char *file, const char *fw_dir,
                 rom->name, rc, rom->datasize);
         goto err;
     }
+    qemu_madvise(rom->data, rom->datasize, MADV_MERGEABLE);
     close(fd);
     rom_insert(rom);
     if (rom->fw_file && fw_cfg) {
@@ -915,7 +916,7 @@ err:
     if (fd != -1)
         close(fd);
 
-    g_free(rom->data);
+    free(rom->data);
     g_free(rom->path);
     g_free(rom->name);
     if (fw_dir) {
@@ -940,8 +941,9 @@ MemoryRegion *rom_add_blob(const char *name, const void 
*blob, size_t len,
     rom->addr     = addr;
     rom->romsize  = max_len ? max_len : len;
     rom->datasize = len;
-    rom->data     = g_malloc0(rom->datasize);
+    rom->data     = qemu_memalign(getpagesize(), rom->datasize);
     memcpy(rom->data, blob, len);
+    qemu_madvise(rom->data, rom->datasize, MADV_MERGEABLE);
     rom_insert(rom);
     if (fw_file_name && fw_cfg) {
         char devpath[100];
@@ -1013,7 +1015,7 @@ static void rom_reset(void *unused)
         }
         if (rom->isrom) {
             /* rom needs to be written only once */
-            g_free(rom->data);
+            free(rom->data);
             rom->data = NULL;
         }
         /*
diff --git a/include/hw/elf_ops.h b/include/hw/elf_ops.h
index f510e7e..aef6713 100644
--- a/include/hw/elf_ops.h
+++ b/include/hw/elf_ops.h
@@ -348,6 +348,8 @@ static int glue(load_elf, SZ)(const char *name, int fd,
             mem_size = ph->p_memsz; /* Size of the ROM */
             file_size = ph->p_filesz; /* Size of the allocated data */
             data = g_malloc0(file_size);
+            data = qemu_memalign(getpagesize(), file_size);
+            qemu_madvise(data, file_size, MADV_MERGEABLE);
             if (ph->p_filesz > 0) {
                 if (lseek(fd, ph->p_offset, SEEK_SET) < 0) {
                     goto fail;
-- 
2.5.5




reply via email to

[Prev in Thread] Current Thread [Next in Thread]