Message ID | 20120629110045.2d5c4db6@doriath.home |
---|---|
State | New |
Headers | show |
On 06/29/2012 09:00 AM, Luiz Capitulino wrote: > Allows to disable memory merge support (KSM on Linux), which is enabled > by default otherwise. > > Signed-off-by: Luiz Capitulino<lcapitulino@redhat.com> > --- > > o v2: improve manpage description > > 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 8244d54..24dd154 100644 > --- a/exec.c > +++ b/exec.c > @@ -2499,6 +2499,19 @@ void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev) > } > } > > +static int madvise_mergeable(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) > { > @@ -2518,7 +2531,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); > + madvise_mergeable(new_block->host, size); Just a style thing. Having a function call that may silently not do what you expect it to do is an unfriendly thing. You should at least name the function something like 'memory_try_enable_merging' Maybe that's not the best name, but you get the idea at least. Regards, Anthony Liguori > } > #else > fprintf(stderr, "-mem-path option unsupported\n"); > @@ -2545,7 +2558,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, > new_block->host = qemu_vmalloc(size); > } > #endif > - qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE); > + madvise_mergeable(new_block->host, size); > } > } > new_block->length = size; > @@ -2672,7 +2685,7 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length) > length, addr); > exit(1); > } > - qemu_madvise(vaddr, length, QEMU_MADV_MERGEABLE); > + madvise_mergeable(vaddr, length); > } > return; > } > diff --git a/qemu-config.c b/qemu-config.c > index 5c3296b..e47612e 100644 > --- a/qemu-config.c > +++ b/qemu-config.c > @@ -595,6 +595,10 @@ static QemuOptsList qemu_machine_opts = { > .name = "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 8b66264..15351a5 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 >
On Fri, 29 Jun 2012 09:18:09 -0500 Anthony Liguori <aliguori@us.ibm.com> wrote: > On 06/29/2012 09:00 AM, Luiz Capitulino wrote: > > Allows to disable memory merge support (KSM on Linux), which is enabled > > by default otherwise. > > > > Signed-off-by: Luiz Capitulino<lcapitulino@redhat.com> > > --- > > > > o v2: improve manpage description > > > > 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 8244d54..24dd154 100644 > > --- a/exec.c > > +++ b/exec.c > > @@ -2499,6 +2499,19 @@ void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev) > > } > > } > > > > +static int madvise_mergeable(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) > > { > > @@ -2518,7 +2531,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); > > + madvise_mergeable(new_block->host, size); > > Just a style thing. Having a function call that may silently not do what you > expect it to do is an unfriendly thing. > > You should at least name the function something like 'memory_try_enable_merging' > > Maybe that's not the best name, but you get the idea at least. Agreed, will rename and post v3. > > Regards, > > Anthony Liguori > > > } > > #else > > fprintf(stderr, "-mem-path option unsupported\n"); > > @@ -2545,7 +2558,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, > > new_block->host = qemu_vmalloc(size); > > } > > #endif > > - qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE); > > + madvise_mergeable(new_block->host, size); > > } > > } > > new_block->length = size; > > @@ -2672,7 +2685,7 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length) > > length, addr); > > exit(1); > > } > > - qemu_madvise(vaddr, length, QEMU_MADV_MERGEABLE); > > + madvise_mergeable(vaddr, length); > > } > > return; > > } > > diff --git a/qemu-config.c b/qemu-config.c > > index 5c3296b..e47612e 100644 > > --- a/qemu-config.c > > +++ b/qemu-config.c > > @@ -595,6 +595,10 @@ static QemuOptsList qemu_machine_opts = { > > .name = "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 8b66264..15351a5 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 > > >
diff --git a/exec.c b/exec.c index 8244d54..24dd154 100644 --- a/exec.c +++ b/exec.c @@ -2499,6 +2499,19 @@ void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev) } } +static int madvise_mergeable(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) { @@ -2518,7 +2531,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); + madvise_mergeable(new_block->host, size); } #else fprintf(stderr, "-mem-path option unsupported\n"); @@ -2545,7 +2558,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, new_block->host = qemu_vmalloc(size); } #endif - qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE); + madvise_mergeable(new_block->host, size); } } new_block->length = size; @@ -2672,7 +2685,7 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length) length, addr); exit(1); } - qemu_madvise(vaddr, length, QEMU_MADV_MERGEABLE); + madvise_mergeable(vaddr, length); } return; } diff --git a/qemu-config.c b/qemu-config.c index 5c3296b..e47612e 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -595,6 +595,10 @@ static QemuOptsList qemu_machine_opts = { .name = "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 8b66264..15351a5 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
Allows to disable memory merge support (KSM on Linux), which is enabled by default otherwise. Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> --- o v2: improve manpage description exec.c | 19 ++++++++++++++++--- qemu-config.c | 4 ++++ qemu-options.hx | 7 ++++++- 3 files changed, 26 insertions(+), 4 deletions(-)