All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v4] add -machine mem-merge=on|off option
@ 2012-07-18 14:31 Luiz Capitulino
  0 siblings, 0 replies; only message in thread
From: Luiz Capitulino @ 2012-07-18 14:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: jan.kiszka, Anthony Liguori, Avi Kivity

It allows to disable memory merge support (KSM on Linux), which is
enabled by default otherwise.

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---

IMPORTANT: this is on top of this series:

   http://lists.gnu.org/archive/html/qemu-devel/2012-07/msg01798.html

o v4

- rename option to mem-merge
- rebase on top of latest master
- rebase on top of the machine option rename series

 exec.c          | 19 ++++++++++++++++---
 qemu-config.c   |  4 ++++
 qemu-options.hx |  7 ++++++-
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/exec.c b/exec.c
index c9fa17d..59d29ae 100644
--- a/exec.c
+++ b/exec.c
@@ -2510,6 +2510,19 @@ void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev)
     }
 }
 
+static int memory_try_enable_merging(void *addr, size_t len)
+{
+    QemuOpts *opts;
+
+    opts = qemu_opts_find(qemu_find_opts("machine"), 0);
+    if (opts && !qemu_opt_get_bool(opts, "mem-merge", true)) {
+        /* disabled by the user */
+        return 0;
+    }
+
+    return qemu_madvise(addr, len, QEMU_MADV_MERGEABLE);
+}
+
 ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
                                    MemoryRegion *mr)
 {
@@ -2529,7 +2542,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
             new_block->host = file_ram_alloc(new_block, size, mem_path);
             if (!new_block->host) {
                 new_block->host = qemu_vmalloc(size);
-                qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
+                memory_try_enable_merging(new_block->host, size);
             }
 #else
             fprintf(stderr, "-mem-path option unsupported\n");
@@ -2544,7 +2557,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
             } else {
                 new_block->host = qemu_vmalloc(size);
             }
-            qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
+            memory_try_enable_merging(new_block->host, size);
         }
     }
     new_block->length = size;
@@ -2670,7 +2683,7 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
                             length, addr);
                     exit(1);
                 }
-                qemu_madvise(vaddr, length, QEMU_MADV_MERGEABLE);
+                memory_try_enable_merging(vaddr, length);
             }
             return;
         }
diff --git a/qemu-config.c b/qemu-config.c
index 9dac3be..3355e45 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -599,6 +599,10 @@ static QemuOptsList qemu_machine_opts = {
             .alias= "dt_compatible",
             .type = QEMU_OPT_STRING,
             .help = "Overrides the \"compatible\" property of the dt root node",
+        }, {
+            .name = "mem-merge",
+            .type = QEMU_OPT_BOOL,
+            .help = "enable/disable memory merge support",
         },
         { /* End of list */ }
     },
diff --git a/qemu-options.hx b/qemu-options.hx
index 90eab87..25ce07e 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -33,7 +33,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
     "                property accel=accel1[:accel2[:...]] selects accelerator\n"
     "                supported accelerators are kvm, xen, tcg (default: tcg)\n"
     "                kernel-irqchip=on|off controls accelerated irqchip support\n"
-    "                kvm-shadow-mem=size of KVM shadow MMU\n",
+    "                kvm-shadow-mem=size of KVM shadow MMU\n"
+    "                mem-merge=on|off controls memory merge support (default: on)\n",
     QEMU_ARCH_ALL)
 STEXI
 @item -machine [type=]@var{name}[,prop=@var{value}[,...]]
@@ -50,6 +51,10 @@ to initialize.
 Enables in-kernel irqchip support for the chosen accelerator when available.
 @item kvm-shadow-mem=size
 Defines the size of the KVM shadow MMU.
+@item mem-merge=on|off
+Enables or disables memory merge support. This feature, when supported by
+the host, de-duplicates identical memory pages among VMs instances
+(enabled by default).
 @end table
 ETEXI
 
-- 
1.7.11.1.116.g8228a23

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2012-07-18 14:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-18 14:31 [Qemu-devel] [PATCH v4] add -machine mem-merge=on|off option Luiz Capitulino

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.