On 2012-06-27 18:49, Luiz Capitulino wrote: > Allows to disable memory merge support (KSM on Linux), which is enabled > by default otherwise. > > Signed-off-by: Luiz Capitulino <lcapitul...@redhat.com> > --- > exec.c | 19 ++++++++++++++++--- > qemu-config.c | 4 ++++ > qemu-options.hx | 5 ++++- > 3 files changed, 24 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); > } > #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..e0e7686 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,8 @@ 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 (enabled by default).
Describe it as memory deduplication? Just a suggestion. Interface looks good to me now. Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux