Re: [PATCH V7 10/29] machine: memfd-alloc option
On 3/11/2022 4:42 AM, Igor Mammedov wrote: > On Thu, 10 Mar 2022 13:18:35 -0500 > Steven Sistare wrote: > >> On 3/10/2022 12:28 PM, Steven Sistare wrote: >>> On 3/10/2022 11:00 AM, Igor Mammedov wrote: On Thu, 10 Mar 2022 10:36:08 -0500 Steven Sistare wrote: > On 3/8/2022 2:20 AM, Igor Mammedov wrote: >> On Tue, 8 Mar 2022 01:50:11 -0500 >> "Michael S. Tsirkin" wrote: >> >>> On Mon, Mar 07, 2022 at 09:41:44AM -0500, Steven Sistare wrote: On 3/4/2022 5:41 AM, Igor Mammedov wrote: > On Thu, 3 Mar 2022 12:21:15 -0500 > "Michael S. Tsirkin" wrote: > >> On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: >>> Allocate anonymous memory using memfd_create if the memfd-alloc >>> machine >>> option is set. >>> >>> Signed-off-by: Steve Sistare >>> --- >>> hw/core/machine.c | 19 +++ >>> include/hw/boards.h | 1 + >>> qemu-options.hx | 6 ++ >>> softmmu/physmem.c | 47 >>> ++- >>> softmmu/vl.c| 1 + >>> trace-events| 1 + >>> util/qemu-config.c | 4 >>> 7 files changed, 70 insertions(+), 9 deletions(-) >>> >>> diff --git a/hw/core/machine.c b/hw/core/machine.c >>> index 53a99ab..7739d88 100644 >>> --- a/hw/core/machine.c >>> +++ b/hw/core/machine.c >>> @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, >>> bool value, Error **errp) >>> ms->mem_merge = value; >>> } >>> >>> +static bool machine_get_memfd_alloc(Object *obj, Error **errp) >>> +{ >>> +MachineState *ms = MACHINE(obj); >>> + >>> +return ms->memfd_alloc; >>> +} >>> + >>> +static void machine_set_memfd_alloc(Object *obj, bool value, Error >>> **errp) >>> +{ >>> +MachineState *ms = MACHINE(obj); >>> + >>> +ms->memfd_alloc = value; >>> +} >>> + >>> static bool machine_get_usb(Object *obj, Error **errp) >>> { >>> MachineState *ms = MACHINE(obj); >>> @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass >>> *oc, void *data) >>> object_class_property_set_description(oc, "mem-merge", >>> "Enable/disable memory merge support"); >>> >>> +object_class_property_add_bool(oc, "memfd-alloc", >>> +machine_get_memfd_alloc, machine_set_memfd_alloc); >>> +object_class_property_set_description(oc, "memfd-alloc", >>> +"Enable/disable allocating anonymous memory using >>> memfd_create"); >>> + >>> object_class_property_add_bool(oc, "usb", >>> machine_get_usb, machine_set_usb); >>> object_class_property_set_description(oc, "usb", >>> diff --git a/include/hw/boards.h b/include/hw/boards.h >>> index 9c1c190..a57d7a0 100644 >>> --- a/include/hw/boards.h >>> +++ b/include/hw/boards.h >>> @@ -327,6 +327,7 @@ struct MachineState { >>> char *dt_compatible; >>> bool dump_guest_core; >>> bool mem_merge; >>> +bool memfd_alloc; >>> bool usb; >>> bool usb_disabled; >>> char *firmware; >>> diff --git a/qemu-options.hx b/qemu-options.hx >>> index 7d47510..33c8173 100644 >>> --- a/qemu-options.hx >>> +++ b/qemu-options.hx >>> @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ >>> "vmport=on|off|auto controls emulation of >>> vmport (default: auto)\n" >>> "dump-guest-core=on|off include guest memory >>> in a core dump (default=on)\n" >>> "mem-merge=on|off controls memory merge >>> support (default: on)\n" >>> +"memfd-alloc=on|off controls allocating >>> anonymous guest RAM using memfd_create (default: off)\n" >> >> Question: are there any disadvantages associated with using >> memfd_create? I guess we are using up an fd, but that seems minor. >> Any >> reason not to set to on by default? maybe with a fallback option to >> disable that? Old Linux host kernels, circa 4.1, do not support huge pages for shared memory. Also, the tunable to enable huge pages for share memory is different than for anon memory, so there could be performance loss if it is not set correctly. /sys/kernel/mm/transparent_hugepage/enabled vs
Re: [PATCH V7 10/29] machine: memfd-alloc option
On 03.03.22 18:21, Michael S. Tsirkin wrote: > On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: >> Allocate anonymous memory using memfd_create if the memfd-alloc machine >> option is set. >> >> Signed-off-by: Steve Sistare >> --- >> hw/core/machine.c | 19 +++ >> include/hw/boards.h | 1 + >> qemu-options.hx | 6 ++ >> softmmu/physmem.c | 47 ++- >> softmmu/vl.c| 1 + >> trace-events| 1 + >> util/qemu-config.c | 4 >> 7 files changed, 70 insertions(+), 9 deletions(-) >> >> diff --git a/hw/core/machine.c b/hw/core/machine.c >> index 53a99ab..7739d88 100644 >> --- a/hw/core/machine.c >> +++ b/hw/core/machine.c >> @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool >> value, Error **errp) >> ms->mem_merge = value; >> } >> >> +static bool machine_get_memfd_alloc(Object *obj, Error **errp) >> +{ >> +MachineState *ms = MACHINE(obj); >> + >> +return ms->memfd_alloc; >> +} >> + >> +static void machine_set_memfd_alloc(Object *obj, bool value, Error **errp) >> +{ >> +MachineState *ms = MACHINE(obj); >> + >> +ms->memfd_alloc = value; >> +} >> + >> static bool machine_get_usb(Object *obj, Error **errp) >> { >> MachineState *ms = MACHINE(obj); >> @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, void >> *data) >> object_class_property_set_description(oc, "mem-merge", >> "Enable/disable memory merge support"); >> >> +object_class_property_add_bool(oc, "memfd-alloc", >> +machine_get_memfd_alloc, machine_set_memfd_alloc); >> +object_class_property_set_description(oc, "memfd-alloc", >> +"Enable/disable allocating anonymous memory using memfd_create"); >> + >> object_class_property_add_bool(oc, "usb", >> machine_get_usb, machine_set_usb); >> object_class_property_set_description(oc, "usb", >> diff --git a/include/hw/boards.h b/include/hw/boards.h >> index 9c1c190..a57d7a0 100644 >> --- a/include/hw/boards.h >> +++ b/include/hw/boards.h >> @@ -327,6 +327,7 @@ struct MachineState { >> char *dt_compatible; >> bool dump_guest_core; >> bool mem_merge; >> +bool memfd_alloc; >> bool usb; >> bool usb_disabled; >> char *firmware; >> diff --git a/qemu-options.hx b/qemu-options.hx >> index 7d47510..33c8173 100644 >> --- a/qemu-options.hx >> +++ b/qemu-options.hx >> @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ >> "vmport=on|off|auto controls emulation of vmport >> (default: auto)\n" >> "dump-guest-core=on|off include guest memory in a core >> dump (default=on)\n" >> "mem-merge=on|off controls memory merge support >> (default: on)\n" >> +"memfd-alloc=on|off controls allocating anonymous guest >> RAM using memfd_create (default: off)\n" > > Question: are there any disadvantages associated with using > memfd_create? I guess we are using up an fd, but that seems minor. Any > reason not to set to on by default? maybe with a fallback option to > disable that? > > I am concerned that it's actually a kind of memory backend, this flag > seems to instead be closer to the deprecated mem-prealloc. E.g. > it does not work with a mem path, does it? We had a RH-internal discssuion some time ago, here is my writeup (note the TMPFS/SHMEM discussion): --- snip --- In QEMU, we specify the type of guest RAM via * -object memory-backend-ram,... * -object memory-backend-file,... * -object memory-backend-memfd,... We can specify whether to share the memory (share=on -- MAP_SHARED), or whether to keep modifications local to QEMU (share=off -- MAP_PRIVATE). Using "share=off" (or using the default) with files/memfd can have some serious side-effects. ALERT: "share=off" is the default in QEMU for memory-backend-ram and memory-backend-file. "share=on" is the default in QEMU only for memory-backend-memfd. I. MAP_SHARED vs. MAP_PRIVATE MAP_SHARED: when reading, read file content; when writing, modify file content. MAP_PRIVATE: when reading, read file content, except if there was a local/private change. When writing, keep change local/private and don't modify file content. MAP_PRIVATE sounds like a snapshot, however, in some cases it really behaves differently -- especially with tmpfs/shmem and when QEMU discards memory (e.g., with virtio-balloon or during postcopy live migration). There is some connection between MAP_PRIVATE and NUMA bindings that I have yet to fully explore. We could have issues with some MAP_SHARED mappings and NUMA bindings (IOW: policy getting ignored). II Impact on different memory backends/types II.1. Anonymous memory: Usage: -object memory-backend-ram,... We really want "share=off" in 99.99% of all cases. Shared anonymous RAM -- i.e., sharing RAM with your child processes -- does not really apply
Re: [PATCH V7 10/29] machine: memfd-alloc option
On Mon, Mar 07, 2022 at 09:41:44AM -0500, Steven Sistare wrote: > On 3/4/2022 5:41 AM, Igor Mammedov wrote: > > On Thu, 3 Mar 2022 12:21:15 -0500 > > "Michael S. Tsirkin" wrote: > > > >> On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: > >>> Allocate anonymous memory using memfd_create if the memfd-alloc machine > >>> option is set. > >>> > >>> Signed-off-by: Steve Sistare > >>> --- > >>> hw/core/machine.c | 19 +++ > >>> include/hw/boards.h | 1 + > >>> qemu-options.hx | 6 ++ > >>> softmmu/physmem.c | 47 ++- > >>> softmmu/vl.c| 1 + > >>> trace-events| 1 + > >>> util/qemu-config.c | 4 > >>> 7 files changed, 70 insertions(+), 9 deletions(-) > >>> > >>> diff --git a/hw/core/machine.c b/hw/core/machine.c > >>> index 53a99ab..7739d88 100644 > >>> --- a/hw/core/machine.c > >>> +++ b/hw/core/machine.c > >>> @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool > >>> value, Error **errp) > >>> ms->mem_merge = value; > >>> } > >>> > >>> +static bool machine_get_memfd_alloc(Object *obj, Error **errp) > >>> +{ > >>> +MachineState *ms = MACHINE(obj); > >>> + > >>> +return ms->memfd_alloc; > >>> +} > >>> + > >>> +static void machine_set_memfd_alloc(Object *obj, bool value, Error > >>> **errp) > >>> +{ > >>> +MachineState *ms = MACHINE(obj); > >>> + > >>> +ms->memfd_alloc = value; > >>> +} > >>> + > >>> static bool machine_get_usb(Object *obj, Error **errp) > >>> { > >>> MachineState *ms = MACHINE(obj); > >>> @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, void > >>> *data) > >>> object_class_property_set_description(oc, "mem-merge", > >>> "Enable/disable memory merge support"); > >>> > >>> +object_class_property_add_bool(oc, "memfd-alloc", > >>> +machine_get_memfd_alloc, machine_set_memfd_alloc); > >>> +object_class_property_set_description(oc, "memfd-alloc", > >>> +"Enable/disable allocating anonymous memory using memfd_create"); > >>> + > >>> object_class_property_add_bool(oc, "usb", > >>> machine_get_usb, machine_set_usb); > >>> object_class_property_set_description(oc, "usb", > >>> diff --git a/include/hw/boards.h b/include/hw/boards.h > >>> index 9c1c190..a57d7a0 100644 > >>> --- a/include/hw/boards.h > >>> +++ b/include/hw/boards.h > >>> @@ -327,6 +327,7 @@ struct MachineState { > >>> char *dt_compatible; > >>> bool dump_guest_core; > >>> bool mem_merge; > >>> +bool memfd_alloc; > >>> bool usb; > >>> bool usb_disabled; > >>> char *firmware; > >>> diff --git a/qemu-options.hx b/qemu-options.hx > >>> index 7d47510..33c8173 100644 > >>> --- a/qemu-options.hx > >>> +++ b/qemu-options.hx > >>> @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > >>> "vmport=on|off|auto controls emulation of vmport > >>> (default: auto)\n" > >>> "dump-guest-core=on|off include guest memory in a > >>> core dump (default=on)\n" > >>> "mem-merge=on|off controls memory merge support > >>> (default: on)\n" > >>> +"memfd-alloc=on|off controls allocating anonymous > >>> guest RAM using memfd_create (default: off)\n" > >> > >> Question: are there any disadvantages associated with using > >> memfd_create? I guess we are using up an fd, but that seems minor. Any > >> reason not to set to on by default? maybe with a fallback option to > >> disable that? > > Old Linux host kernels, circa 4.1, do not support huge pages for shared > memory. That doesn't matter, as we don't support any distros with kernels that old https://www.qemu.org/docs/master/about/build-platforms.html We can assume something around kernel 4.18 I believe. Regards, Daniel -- |: https://berrange.com -o-https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o-https://fstop138.berrange.com :| |: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|
Re: [PATCH V7 10/29] machine: memfd-alloc option
On 22.12.21 20:05, Steve Sistare wrote: > Allocate anonymous memory using memfd_create if the memfd-alloc machine > option is set. Hi, late to the party (thanks Igor for CCing) ... in which case it's no longer anonymous memory (because it's now MAP_SHARED). So you're converting all private memory to shared memory. For example, memory ballooning will no longer work as expected. There is no shared zeropage. KSM won't work. This brings a lot of "surprises". This patch begs for a proper description why this is required and why we cannot simply let the user handle that by properly using memory-backend-memfd manually. Especially the "memfd-alloc option" doesn't even express to a user what's actually happening and what the implications are. Long story short: this patch description has to be seriously extended. > > Signed-off-by: Steve Sistare > --- > hw/core/machine.c | 19 +++ > include/hw/boards.h | 1 + > qemu-options.hx | 6 ++ > softmmu/physmem.c | 47 ++- > softmmu/vl.c| 1 + > trace-events| 1 + > util/qemu-config.c | 4 > 7 files changed, 70 insertions(+), 9 deletions(-) > > diff --git a/hw/core/machine.c b/hw/core/machine.c > index 53a99ab..7739d88 100644 > --- a/hw/core/machine.c > +++ b/hw/core/machine.c > @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool > value, Error **errp) > ms->mem_merge = value; > } > > +static bool machine_get_memfd_alloc(Object *obj, Error **errp) > +{ > +MachineState *ms = MACHINE(obj); > + > +return ms->memfd_alloc; > +} > + > +static void machine_set_memfd_alloc(Object *obj, bool value, Error **errp) > +{ > +MachineState *ms = MACHINE(obj); > + > +ms->memfd_alloc = value; > +} > + > static bool machine_get_usb(Object *obj, Error **errp) > { > MachineState *ms = MACHINE(obj); > @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, void > *data) > object_class_property_set_description(oc, "mem-merge", > "Enable/disable memory merge support"); > > +object_class_property_add_bool(oc, "memfd-alloc", > +machine_get_memfd_alloc, machine_set_memfd_alloc); > +object_class_property_set_description(oc, "memfd-alloc", > +"Enable/disable allocating anonymous memory using memfd_create"); > + > object_class_property_add_bool(oc, "usb", > machine_get_usb, machine_set_usb); > object_class_property_set_description(oc, "usb", > diff --git a/include/hw/boards.h b/include/hw/boards.h > index 9c1c190..a57d7a0 100644 > --- a/include/hw/boards.h > +++ b/include/hw/boards.h > @@ -327,6 +327,7 @@ struct MachineState { > char *dt_compatible; > bool dump_guest_core; > bool mem_merge; > +bool memfd_alloc; > bool usb; > bool usb_disabled; > char *firmware; > diff --git a/qemu-options.hx b/qemu-options.hx > index 7d47510..33c8173 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > "vmport=on|off|auto controls emulation of vmport > (default: auto)\n" > "dump-guest-core=on|off include guest memory in a core > dump (default=on)\n" > "mem-merge=on|off controls memory merge support > (default: on)\n" > +"memfd-alloc=on|off controls allocating anonymous guest > RAM using memfd_create (default: off)\n" > "aes-key-wrap=on|off controls support for AES key > wrapping (default=on)\n" > "dea-key-wrap=on|off controls support for DEA key > wrapping (default=on)\n" > "suppress-vmdesc=on|off disables self-describing > migration (default=off)\n" > @@ -76,6 +77,11 @@ SRST > supported by the host, de-duplicates identical memory pages > among VMs instances (enabled by default). > > +``memfd-alloc=on|off`` > +Enables or disables allocation of anonymous guest RAM using > +memfd_create. Any associated memory-backend objects are created with > +share=on. The memfd-alloc default is off. > + > ``aes-key-wrap=on|off`` > Enables or disables AES key wrapping support on s390-ccw hosts. > This feature controls whether AES wrapping keys will be created > diff --git a/softmmu/physmem.c b/softmmu/physmem.c > index 3524c04..95e2b49 100644 > --- a/softmmu/physmem.c > +++ b/softmmu/physmem.c > @@ -41,6 +41,7 @@ > #include "qemu/config-file.h" > #include "qemu/error-report.h" > #include "qemu/qemu-print.h" > +#include "qemu/memfd.h" > #include "exec/memory.h" > #include "exec/ioport.h" > #include "sysemu/dma.h" > @@ -1964,35 +1965,63 @@ static void ram_block_add(RAMBlock *new_block, Error > **errp) > const bool shared = qemu_ram_is_shared(new_block); > RAMBlock *block; > RAMBlock *last_block = NULL; > +struct MemoryRegion *mr = new_block->mr; >
Re: [PATCH V7 10/29] machine: memfd-alloc option
On Thu, 10 Mar 2022 13:18:35 -0500 Steven Sistare wrote: > On 3/10/2022 12:28 PM, Steven Sistare wrote: > > On 3/10/2022 11:00 AM, Igor Mammedov wrote: > >> On Thu, 10 Mar 2022 10:36:08 -0500 > >> Steven Sistare wrote: > >> > >>> On 3/8/2022 2:20 AM, Igor Mammedov wrote: > On Tue, 8 Mar 2022 01:50:11 -0500 > "Michael S. Tsirkin" wrote: > > > On Mon, Mar 07, 2022 at 09:41:44AM -0500, Steven Sistare wrote: > >> On 3/4/2022 5:41 AM, Igor Mammedov wrote: > >>> On Thu, 3 Mar 2022 12:21:15 -0500 > >>> "Michael S. Tsirkin" wrote: > >>> > On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: > > Allocate anonymous memory using memfd_create if the memfd-alloc > > machine > > option is set. > > > > Signed-off-by: Steve Sistare > > --- > > hw/core/machine.c | 19 +++ > > include/hw/boards.h | 1 + > > qemu-options.hx | 6 ++ > > softmmu/physmem.c | 47 > > ++- > > softmmu/vl.c| 1 + > > trace-events| 1 + > > util/qemu-config.c | 4 > > 7 files changed, 70 insertions(+), 9 deletions(-) > > > > diff --git a/hw/core/machine.c b/hw/core/machine.c > > index 53a99ab..7739d88 100644 > > --- a/hw/core/machine.c > > +++ b/hw/core/machine.c > > @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, > > bool value, Error **errp) > > ms->mem_merge = value; > > } > > > > +static bool machine_get_memfd_alloc(Object *obj, Error **errp) > > +{ > > +MachineState *ms = MACHINE(obj); > > + > > +return ms->memfd_alloc; > > +} > > + > > +static void machine_set_memfd_alloc(Object *obj, bool value, Error > > **errp) > > +{ > > +MachineState *ms = MACHINE(obj); > > + > > +ms->memfd_alloc = value; > > +} > > + > > static bool machine_get_usb(Object *obj, Error **errp) > > { > > MachineState *ms = MACHINE(obj); > > @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass > > *oc, void *data) > > object_class_property_set_description(oc, "mem-merge", > > "Enable/disable memory merge support"); > > > > +object_class_property_add_bool(oc, "memfd-alloc", > > +machine_get_memfd_alloc, machine_set_memfd_alloc); > > +object_class_property_set_description(oc, "memfd-alloc", > > +"Enable/disable allocating anonymous memory using > > memfd_create"); > > + > > object_class_property_add_bool(oc, "usb", > > machine_get_usb, machine_set_usb); > > object_class_property_set_description(oc, "usb", > > diff --git a/include/hw/boards.h b/include/hw/boards.h > > index 9c1c190..a57d7a0 100644 > > --- a/include/hw/boards.h > > +++ b/include/hw/boards.h > > @@ -327,6 +327,7 @@ struct MachineState { > > char *dt_compatible; > > bool dump_guest_core; > > bool mem_merge; > > +bool memfd_alloc; > > bool usb; > > bool usb_disabled; > > char *firmware; > > diff --git a/qemu-options.hx b/qemu-options.hx > > index 7d47510..33c8173 100644 > > --- a/qemu-options.hx > > +++ b/qemu-options.hx > > @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > > "vmport=on|off|auto controls emulation of > > vmport (default: auto)\n" > > "dump-guest-core=on|off include guest memory > > in a core dump (default=on)\n" > > "mem-merge=on|off controls memory merge > > support (default: on)\n" > > +"memfd-alloc=on|off controls allocating > > anonymous guest RAM using memfd_create (default: off)\n" > > Question: are there any disadvantages associated with using > memfd_create? I guess we are using up an fd, but that seems minor. > Any > reason not to set to on by default? maybe with a fallback option to > disable that? > >> > >> Old Linux host kernels, circa 4.1, do not support huge pages for > >> shared memory. > >> Also, the tunable to enable huge pages for share memory is different > >> than for > >> anon memory, so there could be performance loss if it is not set > >> correctly. > >> /sys/kernel/mm/transparent_hugepage/enabled > >> vs > >> /sys/kernel/mm/transparent_hugepage/shmem_enabled
Re: [PATCH V7 10/29] machine: memfd-alloc option
On 3/10/2022 12:28 PM, Steven Sistare wrote: > On 3/10/2022 11:00 AM, Igor Mammedov wrote: >> On Thu, 10 Mar 2022 10:36:08 -0500 >> Steven Sistare wrote: >> >>> On 3/8/2022 2:20 AM, Igor Mammedov wrote: On Tue, 8 Mar 2022 01:50:11 -0500 "Michael S. Tsirkin" wrote: > On Mon, Mar 07, 2022 at 09:41:44AM -0500, Steven Sistare wrote: >> On 3/4/2022 5:41 AM, Igor Mammedov wrote: >>> On Thu, 3 Mar 2022 12:21:15 -0500 >>> "Michael S. Tsirkin" wrote: >>> On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: > Allocate anonymous memory using memfd_create if the memfd-alloc > machine > option is set. > > Signed-off-by: Steve Sistare > --- > hw/core/machine.c | 19 +++ > include/hw/boards.h | 1 + > qemu-options.hx | 6 ++ > softmmu/physmem.c | 47 > ++- > softmmu/vl.c| 1 + > trace-events| 1 + > util/qemu-config.c | 4 > 7 files changed, 70 insertions(+), 9 deletions(-) > > diff --git a/hw/core/machine.c b/hw/core/machine.c > index 53a99ab..7739d88 100644 > --- a/hw/core/machine.c > +++ b/hw/core/machine.c > @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, > bool value, Error **errp) > ms->mem_merge = value; > } > > +static bool machine_get_memfd_alloc(Object *obj, Error **errp) > +{ > +MachineState *ms = MACHINE(obj); > + > +return ms->memfd_alloc; > +} > + > +static void machine_set_memfd_alloc(Object *obj, bool value, Error > **errp) > +{ > +MachineState *ms = MACHINE(obj); > + > +ms->memfd_alloc = value; > +} > + > static bool machine_get_usb(Object *obj, Error **errp) > { > MachineState *ms = MACHINE(obj); > @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, > void *data) > object_class_property_set_description(oc, "mem-merge", > "Enable/disable memory merge support"); > > +object_class_property_add_bool(oc, "memfd-alloc", > +machine_get_memfd_alloc, machine_set_memfd_alloc); > +object_class_property_set_description(oc, "memfd-alloc", > +"Enable/disable allocating anonymous memory using > memfd_create"); > + > object_class_property_add_bool(oc, "usb", > machine_get_usb, machine_set_usb); > object_class_property_set_description(oc, "usb", > diff --git a/include/hw/boards.h b/include/hw/boards.h > index 9c1c190..a57d7a0 100644 > --- a/include/hw/boards.h > +++ b/include/hw/boards.h > @@ -327,6 +327,7 @@ struct MachineState { > char *dt_compatible; > bool dump_guest_core; > bool mem_merge; > +bool memfd_alloc; > bool usb; > bool usb_disabled; > char *firmware; > diff --git a/qemu-options.hx b/qemu-options.hx > index 7d47510..33c8173 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > "vmport=on|off|auto controls emulation of vmport > (default: auto)\n" > "dump-guest-core=on|off include guest memory in > a core dump (default=on)\n" > "mem-merge=on|off controls memory merge support > (default: on)\n" > +"memfd-alloc=on|off controls allocating > anonymous guest RAM using memfd_create (default: off)\n" Question: are there any disadvantages associated with using memfd_create? I guess we are using up an fd, but that seems minor. Any reason not to set to on by default? maybe with a fallback option to disable that? >> >> Old Linux host kernels, circa 4.1, do not support huge pages for shared >> memory. >> Also, the tunable to enable huge pages for share memory is different >> than for >> anon memory, so there could be performance loss if it is not set >> correctly. >> /sys/kernel/mm/transparent_hugepage/enabled >> vs >> /sys/kernel/mm/transparent_hugepage/shmem_enabled > > I guess we can test this when launching the VM, and select > a good default. > >> It might make sense to use memfd_create by default for the secondary >> segments. > > Well there's also KSM now you mention it. then another quest, is there downside to
Re: [PATCH V7 10/29] machine: memfd-alloc option
On 3/10/2022 11:00 AM, Igor Mammedov wrote: > On Thu, 10 Mar 2022 10:36:08 -0500 > Steven Sistare wrote: > >> On 3/8/2022 2:20 AM, Igor Mammedov wrote: >>> On Tue, 8 Mar 2022 01:50:11 -0500 >>> "Michael S. Tsirkin" wrote: >>> On Mon, Mar 07, 2022 at 09:41:44AM -0500, Steven Sistare wrote: > On 3/4/2022 5:41 AM, Igor Mammedov wrote: >> On Thu, 3 Mar 2022 12:21:15 -0500 >> "Michael S. Tsirkin" wrote: >> >>> On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: Allocate anonymous memory using memfd_create if the memfd-alloc machine option is set. Signed-off-by: Steve Sistare --- hw/core/machine.c | 19 +++ include/hw/boards.h | 1 + qemu-options.hx | 6 ++ softmmu/physmem.c | 47 ++- softmmu/vl.c| 1 + trace-events| 1 + util/qemu-config.c | 4 7 files changed, 70 insertions(+), 9 deletions(-) diff --git a/hw/core/machine.c b/hw/core/machine.c index 53a99ab..7739d88 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool value, Error **errp) ms->mem_merge = value; } +static bool machine_get_memfd_alloc(Object *obj, Error **errp) +{ +MachineState *ms = MACHINE(obj); + +return ms->memfd_alloc; +} + +static void machine_set_memfd_alloc(Object *obj, bool value, Error **errp) +{ +MachineState *ms = MACHINE(obj); + +ms->memfd_alloc = value; +} + static bool machine_get_usb(Object *obj, Error **errp) { MachineState *ms = MACHINE(obj); @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, void *data) object_class_property_set_description(oc, "mem-merge", "Enable/disable memory merge support"); +object_class_property_add_bool(oc, "memfd-alloc", +machine_get_memfd_alloc, machine_set_memfd_alloc); +object_class_property_set_description(oc, "memfd-alloc", +"Enable/disable allocating anonymous memory using memfd_create"); + object_class_property_add_bool(oc, "usb", machine_get_usb, machine_set_usb); object_class_property_set_description(oc, "usb", diff --git a/include/hw/boards.h b/include/hw/boards.h index 9c1c190..a57d7a0 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -327,6 +327,7 @@ struct MachineState { char *dt_compatible; bool dump_guest_core; bool mem_merge; +bool memfd_alloc; bool usb; bool usb_disabled; char *firmware; diff --git a/qemu-options.hx b/qemu-options.hx index 7d47510..33c8173 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ "vmport=on|off|auto controls emulation of vmport (default: auto)\n" "dump-guest-core=on|off include guest memory in a core dump (default=on)\n" "mem-merge=on|off controls memory merge support (default: on)\n" +"memfd-alloc=on|off controls allocating anonymous guest RAM using memfd_create (default: off)\n" >>> >>> Question: are there any disadvantages associated with using >>> memfd_create? I guess we are using up an fd, but that seems minor. Any >>> reason not to set to on by default? maybe with a fallback option to >>> disable that? > > Old Linux host kernels, circa 4.1, do not support huge pages for shared > memory. > Also, the tunable to enable huge pages for share memory is different than > for > anon memory, so there could be performance loss if it is not set > correctly. > /sys/kernel/mm/transparent_hugepage/enabled > vs > /sys/kernel/mm/transparent_hugepage/shmem_enabled I guess we can test this when launching the VM, and select a good default. > It might make sense to use memfd_create by default for the secondary > segments. Well there's also KSM now you mention it. >>> >>> then another quest, is there downside to always using memfd_create >>> without any knobs being involved? >> >> Lower performance if small pages are used (but Michael suggests qemu could >> automatically check the
Re: [PATCH V7 10/29] machine: memfd-alloc option
On Thu, 10 Mar 2022 10:36:08 -0500 Steven Sistare wrote: > On 3/8/2022 2:20 AM, Igor Mammedov wrote: > > On Tue, 8 Mar 2022 01:50:11 -0500 > > "Michael S. Tsirkin" wrote: > > > >> On Mon, Mar 07, 2022 at 09:41:44AM -0500, Steven Sistare wrote: > >>> On 3/4/2022 5:41 AM, Igor Mammedov wrote: > On Thu, 3 Mar 2022 12:21:15 -0500 > "Michael S. Tsirkin" wrote: > > > On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: > >> Allocate anonymous memory using memfd_create if the memfd-alloc machine > >> option is set. > >> > >> Signed-off-by: Steve Sistare > >> --- > >> hw/core/machine.c | 19 +++ > >> include/hw/boards.h | 1 + > >> qemu-options.hx | 6 ++ > >> softmmu/physmem.c | 47 > >> ++- > >> softmmu/vl.c| 1 + > >> trace-events| 1 + > >> util/qemu-config.c | 4 > >> 7 files changed, 70 insertions(+), 9 deletions(-) > >> > >> diff --git a/hw/core/machine.c b/hw/core/machine.c > >> index 53a99ab..7739d88 100644 > >> --- a/hw/core/machine.c > >> +++ b/hw/core/machine.c > >> @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, > >> bool value, Error **errp) > >> ms->mem_merge = value; > >> } > >> > >> +static bool machine_get_memfd_alloc(Object *obj, Error **errp) > >> +{ > >> +MachineState *ms = MACHINE(obj); > >> + > >> +return ms->memfd_alloc; > >> +} > >> + > >> +static void machine_set_memfd_alloc(Object *obj, bool value, Error > >> **errp) > >> +{ > >> +MachineState *ms = MACHINE(obj); > >> + > >> +ms->memfd_alloc = value; > >> +} > >> + > >> static bool machine_get_usb(Object *obj, Error **errp) > >> { > >> MachineState *ms = MACHINE(obj); > >> @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, > >> void *data) > >> object_class_property_set_description(oc, "mem-merge", > >> "Enable/disable memory merge support"); > >> > >> +object_class_property_add_bool(oc, "memfd-alloc", > >> +machine_get_memfd_alloc, machine_set_memfd_alloc); > >> +object_class_property_set_description(oc, "memfd-alloc", > >> +"Enable/disable allocating anonymous memory using > >> memfd_create"); > >> + > >> object_class_property_add_bool(oc, "usb", > >> machine_get_usb, machine_set_usb); > >> object_class_property_set_description(oc, "usb", > >> diff --git a/include/hw/boards.h b/include/hw/boards.h > >> index 9c1c190..a57d7a0 100644 > >> --- a/include/hw/boards.h > >> +++ b/include/hw/boards.h > >> @@ -327,6 +327,7 @@ struct MachineState { > >> char *dt_compatible; > >> bool dump_guest_core; > >> bool mem_merge; > >> +bool memfd_alloc; > >> bool usb; > >> bool usb_disabled; > >> char *firmware; > >> diff --git a/qemu-options.hx b/qemu-options.hx > >> index 7d47510..33c8173 100644 > >> --- a/qemu-options.hx > >> +++ b/qemu-options.hx > >> @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > >> "vmport=on|off|auto controls emulation of vmport > >> (default: auto)\n" > >> "dump-guest-core=on|off include guest memory in a > >> core dump (default=on)\n" > >> "mem-merge=on|off controls memory merge support > >> (default: on)\n" > >> +"memfd-alloc=on|off controls allocating anonymous > >> guest RAM using memfd_create (default: off)\n" > > > > Question: are there any disadvantages associated with using > > memfd_create? I guess we are using up an fd, but that seems minor. Any > > reason not to set to on by default? maybe with a fallback option to > > disable that? > >>> > >>> Old Linux host kernels, circa 4.1, do not support huge pages for shared > >>> memory. > >>> Also, the tunable to enable huge pages for share memory is different than > >>> for > >>> anon memory, so there could be performance loss if it is not set > >>> correctly. > >>> /sys/kernel/mm/transparent_hugepage/enabled > >>> vs > >>> /sys/kernel/mm/transparent_hugepage/shmem_enabled > >> > >> I guess we can test this when launching the VM, and select > >> a good default. > >> > >>> It might make sense to use memfd_create by default for the secondary > >>> segments. > >> > >> Well there's also KSM now you mention it. > > > > then another quest, is there downside to always using memfd_create > > without any knobs being involved? > > Lower performance if small pages are used (but Michael suggests qemu could > automatically check the tunable and use anon memory instead) > > KSM (same page
Re: [PATCH V7 10/29] machine: memfd-alloc option
On 3/8/2022 2:20 AM, Igor Mammedov wrote: > On Tue, 8 Mar 2022 01:50:11 -0500 > "Michael S. Tsirkin" wrote: > >> On Mon, Mar 07, 2022 at 09:41:44AM -0500, Steven Sistare wrote: >>> On 3/4/2022 5:41 AM, Igor Mammedov wrote: On Thu, 3 Mar 2022 12:21:15 -0500 "Michael S. Tsirkin" wrote: > On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: >> Allocate anonymous memory using memfd_create if the memfd-alloc machine >> option is set. >> >> Signed-off-by: Steve Sistare >> --- >> hw/core/machine.c | 19 +++ >> include/hw/boards.h | 1 + >> qemu-options.hx | 6 ++ >> softmmu/physmem.c | 47 ++- >> softmmu/vl.c| 1 + >> trace-events| 1 + >> util/qemu-config.c | 4 >> 7 files changed, 70 insertions(+), 9 deletions(-) >> >> diff --git a/hw/core/machine.c b/hw/core/machine.c >> index 53a99ab..7739d88 100644 >> --- a/hw/core/machine.c >> +++ b/hw/core/machine.c >> @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool >> value, Error **errp) >> ms->mem_merge = value; >> } >> >> +static bool machine_get_memfd_alloc(Object *obj, Error **errp) >> +{ >> +MachineState *ms = MACHINE(obj); >> + >> +return ms->memfd_alloc; >> +} >> + >> +static void machine_set_memfd_alloc(Object *obj, bool value, Error >> **errp) >> +{ >> +MachineState *ms = MACHINE(obj); >> + >> +ms->memfd_alloc = value; >> +} >> + >> static bool machine_get_usb(Object *obj, Error **errp) >> { >> MachineState *ms = MACHINE(obj); >> @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, >> void *data) >> object_class_property_set_description(oc, "mem-merge", >> "Enable/disable memory merge support"); >> >> +object_class_property_add_bool(oc, "memfd-alloc", >> +machine_get_memfd_alloc, machine_set_memfd_alloc); >> +object_class_property_set_description(oc, "memfd-alloc", >> +"Enable/disable allocating anonymous memory using >> memfd_create"); >> + >> object_class_property_add_bool(oc, "usb", >> machine_get_usb, machine_set_usb); >> object_class_property_set_description(oc, "usb", >> diff --git a/include/hw/boards.h b/include/hw/boards.h >> index 9c1c190..a57d7a0 100644 >> --- a/include/hw/boards.h >> +++ b/include/hw/boards.h >> @@ -327,6 +327,7 @@ struct MachineState { >> char *dt_compatible; >> bool dump_guest_core; >> bool mem_merge; >> +bool memfd_alloc; >> bool usb; >> bool usb_disabled; >> char *firmware; >> diff --git a/qemu-options.hx b/qemu-options.hx >> index 7d47510..33c8173 100644 >> --- a/qemu-options.hx >> +++ b/qemu-options.hx >> @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ >> "vmport=on|off|auto controls emulation of vmport >> (default: auto)\n" >> "dump-guest-core=on|off include guest memory in a >> core dump (default=on)\n" >> "mem-merge=on|off controls memory merge support >> (default: on)\n" >> +"memfd-alloc=on|off controls allocating anonymous >> guest RAM using memfd_create (default: off)\n" > > Question: are there any disadvantages associated with using > memfd_create? I guess we are using up an fd, but that seems minor. Any > reason not to set to on by default? maybe with a fallback option to > disable that? >>> >>> Old Linux host kernels, circa 4.1, do not support huge pages for shared >>> memory. >>> Also, the tunable to enable huge pages for share memory is different than >>> for >>> anon memory, so there could be performance loss if it is not set correctly. >>> /sys/kernel/mm/transparent_hugepage/enabled >>> vs >>> /sys/kernel/mm/transparent_hugepage/shmem_enabled >> >> I guess we can test this when launching the VM, and select >> a good default. >> >>> It might make sense to use memfd_create by default for the secondary >>> segments. >> >> Well there's also KSM now you mention it. > > then another quest, is there downside to always using memfd_create > without any knobs being involved? Lower performance if small pages are used (but Michael suggests qemu could automatically check the tunable and use anon memory instead) KSM (same page merging) is not supported for shared memory, so ram_block_add -> memory_try_enable_merging will not enable it. In both cases, I expect the degradation would be negligible if memfd_create is only automatically applied to the secondary segments, which are typically small. But, someone's secondary segment could be larger, and it is time
Re: [PATCH V7 10/29] machine: memfd-alloc option
On Tue, 8 Mar 2022 01:50:11 -0500 "Michael S. Tsirkin" wrote: > On Mon, Mar 07, 2022 at 09:41:44AM -0500, Steven Sistare wrote: > > On 3/4/2022 5:41 AM, Igor Mammedov wrote: > > > On Thu, 3 Mar 2022 12:21:15 -0500 > > > "Michael S. Tsirkin" wrote: > > > > > >> On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: > > >>> Allocate anonymous memory using memfd_create if the memfd-alloc machine > > >>> option is set. > > >>> > > >>> Signed-off-by: Steve Sistare > > >>> --- > > >>> hw/core/machine.c | 19 +++ > > >>> include/hw/boards.h | 1 + > > >>> qemu-options.hx | 6 ++ > > >>> softmmu/physmem.c | 47 > > >>> ++- > > >>> softmmu/vl.c| 1 + > > >>> trace-events| 1 + > > >>> util/qemu-config.c | 4 > > >>> 7 files changed, 70 insertions(+), 9 deletions(-) > > >>> > > >>> diff --git a/hw/core/machine.c b/hw/core/machine.c > > >>> index 53a99ab..7739d88 100644 > > >>> --- a/hw/core/machine.c > > >>> +++ b/hw/core/machine.c > > >>> @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, > > >>> bool value, Error **errp) > > >>> ms->mem_merge = value; > > >>> } > > >>> > > >>> +static bool machine_get_memfd_alloc(Object *obj, Error **errp) > > >>> +{ > > >>> +MachineState *ms = MACHINE(obj); > > >>> + > > >>> +return ms->memfd_alloc; > > >>> +} > > >>> + > > >>> +static void machine_set_memfd_alloc(Object *obj, bool value, Error > > >>> **errp) > > >>> +{ > > >>> +MachineState *ms = MACHINE(obj); > > >>> + > > >>> +ms->memfd_alloc = value; > > >>> +} > > >>> + > > >>> static bool machine_get_usb(Object *obj, Error **errp) > > >>> { > > >>> MachineState *ms = MACHINE(obj); > > >>> @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, > > >>> void *data) > > >>> object_class_property_set_description(oc, "mem-merge", > > >>> "Enable/disable memory merge support"); > > >>> > > >>> +object_class_property_add_bool(oc, "memfd-alloc", > > >>> +machine_get_memfd_alloc, machine_set_memfd_alloc); > > >>> +object_class_property_set_description(oc, "memfd-alloc", > > >>> +"Enable/disable allocating anonymous memory using > > >>> memfd_create"); > > >>> + > > >>> object_class_property_add_bool(oc, "usb", > > >>> machine_get_usb, machine_set_usb); > > >>> object_class_property_set_description(oc, "usb", > > >>> diff --git a/include/hw/boards.h b/include/hw/boards.h > > >>> index 9c1c190..a57d7a0 100644 > > >>> --- a/include/hw/boards.h > > >>> +++ b/include/hw/boards.h > > >>> @@ -327,6 +327,7 @@ struct MachineState { > > >>> char *dt_compatible; > > >>> bool dump_guest_core; > > >>> bool mem_merge; > > >>> +bool memfd_alloc; > > >>> bool usb; > > >>> bool usb_disabled; > > >>> char *firmware; > > >>> diff --git a/qemu-options.hx b/qemu-options.hx > > >>> index 7d47510..33c8173 100644 > > >>> --- a/qemu-options.hx > > >>> +++ b/qemu-options.hx > > >>> @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > > >>> "vmport=on|off|auto controls emulation of vmport > > >>> (default: auto)\n" > > >>> "dump-guest-core=on|off include guest memory in a > > >>> core dump (default=on)\n" > > >>> "mem-merge=on|off controls memory merge support > > >>> (default: on)\n" > > >>> +"memfd-alloc=on|off controls allocating anonymous > > >>> guest RAM using memfd_create (default: off)\n" > > >> > > >> Question: are there any disadvantages associated with using > > >> memfd_create? I guess we are using up an fd, but that seems minor. Any > > >> reason not to set to on by default? maybe with a fallback option to > > >> disable that? > > > > Old Linux host kernels, circa 4.1, do not support huge pages for shared > > memory. > > Also, the tunable to enable huge pages for share memory is different than > > for > > anon memory, so there could be performance loss if it is not set correctly. > > /sys/kernel/mm/transparent_hugepage/enabled > > vs > > /sys/kernel/mm/transparent_hugepage/shmem_enabled > > I guess we can test this when launching the VM, and select > a good default. > > > It might make sense to use memfd_create by default for the secondary > > segments. > > Well there's also KSM now you mention it. then another quest, is there downside to always using memfd_create without any knobs being involved? > > > >> I am concerned that it's actually a kind of memory backend, this flag > > >> seems to instead be closer to the deprecated mem-prealloc. E.g. > > >> it does not work with a mem path, does it? > > > > One can still define a memory backend with mempath to create the main ram > > segment, > > though it must be some form of shared to work with live update. Indeed, I > > would > > expect most users to specify an explicit memory backend
Re: [PATCH V7 10/29] machine: memfd-alloc option
On Mon, Mar 07, 2022 at 09:41:44AM -0500, Steven Sistare wrote: > On 3/4/2022 5:41 AM, Igor Mammedov wrote: > > On Thu, 3 Mar 2022 12:21:15 -0500 > > "Michael S. Tsirkin" wrote: > > > >> On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: > >>> Allocate anonymous memory using memfd_create if the memfd-alloc machine > >>> option is set. > >>> > >>> Signed-off-by: Steve Sistare > >>> --- > >>> hw/core/machine.c | 19 +++ > >>> include/hw/boards.h | 1 + > >>> qemu-options.hx | 6 ++ > >>> softmmu/physmem.c | 47 ++- > >>> softmmu/vl.c| 1 + > >>> trace-events| 1 + > >>> util/qemu-config.c | 4 > >>> 7 files changed, 70 insertions(+), 9 deletions(-) > >>> > >>> diff --git a/hw/core/machine.c b/hw/core/machine.c > >>> index 53a99ab..7739d88 100644 > >>> --- a/hw/core/machine.c > >>> +++ b/hw/core/machine.c > >>> @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool > >>> value, Error **errp) > >>> ms->mem_merge = value; > >>> } > >>> > >>> +static bool machine_get_memfd_alloc(Object *obj, Error **errp) > >>> +{ > >>> +MachineState *ms = MACHINE(obj); > >>> + > >>> +return ms->memfd_alloc; > >>> +} > >>> + > >>> +static void machine_set_memfd_alloc(Object *obj, bool value, Error > >>> **errp) > >>> +{ > >>> +MachineState *ms = MACHINE(obj); > >>> + > >>> +ms->memfd_alloc = value; > >>> +} > >>> + > >>> static bool machine_get_usb(Object *obj, Error **errp) > >>> { > >>> MachineState *ms = MACHINE(obj); > >>> @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, void > >>> *data) > >>> object_class_property_set_description(oc, "mem-merge", > >>> "Enable/disable memory merge support"); > >>> > >>> +object_class_property_add_bool(oc, "memfd-alloc", > >>> +machine_get_memfd_alloc, machine_set_memfd_alloc); > >>> +object_class_property_set_description(oc, "memfd-alloc", > >>> +"Enable/disable allocating anonymous memory using memfd_create"); > >>> + > >>> object_class_property_add_bool(oc, "usb", > >>> machine_get_usb, machine_set_usb); > >>> object_class_property_set_description(oc, "usb", > >>> diff --git a/include/hw/boards.h b/include/hw/boards.h > >>> index 9c1c190..a57d7a0 100644 > >>> --- a/include/hw/boards.h > >>> +++ b/include/hw/boards.h > >>> @@ -327,6 +327,7 @@ struct MachineState { > >>> char *dt_compatible; > >>> bool dump_guest_core; > >>> bool mem_merge; > >>> +bool memfd_alloc; > >>> bool usb; > >>> bool usb_disabled; > >>> char *firmware; > >>> diff --git a/qemu-options.hx b/qemu-options.hx > >>> index 7d47510..33c8173 100644 > >>> --- a/qemu-options.hx > >>> +++ b/qemu-options.hx > >>> @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > >>> "vmport=on|off|auto controls emulation of vmport > >>> (default: auto)\n" > >>> "dump-guest-core=on|off include guest memory in a > >>> core dump (default=on)\n" > >>> "mem-merge=on|off controls memory merge support > >>> (default: on)\n" > >>> +"memfd-alloc=on|off controls allocating anonymous > >>> guest RAM using memfd_create (default: off)\n" > >> > >> Question: are there any disadvantages associated with using > >> memfd_create? I guess we are using up an fd, but that seems minor. Any > >> reason not to set to on by default? maybe with a fallback option to > >> disable that? > > Old Linux host kernels, circa 4.1, do not support huge pages for shared > memory. > Also, the tunable to enable huge pages for share memory is different than for > anon memory, so there could be performance loss if it is not set correctly. > /sys/kernel/mm/transparent_hugepage/enabled > vs > /sys/kernel/mm/transparent_hugepage/shmem_enabled I guess we can test this when launching the VM, and select a good default. > It might make sense to use memfd_create by default for the secondary segments. Well there's also KSM now you mention it. > >> I am concerned that it's actually a kind of memory backend, this flag > >> seems to instead be closer to the deprecated mem-prealloc. E.g. > >> it does not work with a mem path, does it? > > One can still define a memory backend with mempath to create the main ram > segment, > though it must be some form of shared to work with live update. Indeed, I > would > expect most users to specify an explicit memory backend for it. The secondary > segments would still use memfd_create. > > > (mem path and mem-prealloc are transparently aliased to used memory backend > > if I recall it right.) > > > > Steve, > > > > For allocating guest RAM, we switched exclusively to using memory-backends > > including initial guest RAM (-m size option) and we have hostmem-memfd > > that uses memfd_create() and I'd rather avoid adding random knobs to machine > > for
Re: [PATCH V7 10/29] machine: memfd-alloc option
On 3/4/2022 5:41 AM, Igor Mammedov wrote: > On Thu, 3 Mar 2022 12:21:15 -0500 > "Michael S. Tsirkin" wrote: > >> On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: >>> Allocate anonymous memory using memfd_create if the memfd-alloc machine >>> option is set. >>> >>> Signed-off-by: Steve Sistare >>> --- >>> hw/core/machine.c | 19 +++ >>> include/hw/boards.h | 1 + >>> qemu-options.hx | 6 ++ >>> softmmu/physmem.c | 47 ++- >>> softmmu/vl.c| 1 + >>> trace-events| 1 + >>> util/qemu-config.c | 4 >>> 7 files changed, 70 insertions(+), 9 deletions(-) >>> >>> diff --git a/hw/core/machine.c b/hw/core/machine.c >>> index 53a99ab..7739d88 100644 >>> --- a/hw/core/machine.c >>> +++ b/hw/core/machine.c >>> @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool >>> value, Error **errp) >>> ms->mem_merge = value; >>> } >>> >>> +static bool machine_get_memfd_alloc(Object *obj, Error **errp) >>> +{ >>> +MachineState *ms = MACHINE(obj); >>> + >>> +return ms->memfd_alloc; >>> +} >>> + >>> +static void machine_set_memfd_alloc(Object *obj, bool value, Error **errp) >>> +{ >>> +MachineState *ms = MACHINE(obj); >>> + >>> +ms->memfd_alloc = value; >>> +} >>> + >>> static bool machine_get_usb(Object *obj, Error **errp) >>> { >>> MachineState *ms = MACHINE(obj); >>> @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, void >>> *data) >>> object_class_property_set_description(oc, "mem-merge", >>> "Enable/disable memory merge support"); >>> >>> +object_class_property_add_bool(oc, "memfd-alloc", >>> +machine_get_memfd_alloc, machine_set_memfd_alloc); >>> +object_class_property_set_description(oc, "memfd-alloc", >>> +"Enable/disable allocating anonymous memory using memfd_create"); >>> + >>> object_class_property_add_bool(oc, "usb", >>> machine_get_usb, machine_set_usb); >>> object_class_property_set_description(oc, "usb", >>> diff --git a/include/hw/boards.h b/include/hw/boards.h >>> index 9c1c190..a57d7a0 100644 >>> --- a/include/hw/boards.h >>> +++ b/include/hw/boards.h >>> @@ -327,6 +327,7 @@ struct MachineState { >>> char *dt_compatible; >>> bool dump_guest_core; >>> bool mem_merge; >>> +bool memfd_alloc; >>> bool usb; >>> bool usb_disabled; >>> char *firmware; >>> diff --git a/qemu-options.hx b/qemu-options.hx >>> index 7d47510..33c8173 100644 >>> --- a/qemu-options.hx >>> +++ b/qemu-options.hx >>> @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ >>> "vmport=on|off|auto controls emulation of vmport >>> (default: auto)\n" >>> "dump-guest-core=on|off include guest memory in a core >>> dump (default=on)\n" >>> "mem-merge=on|off controls memory merge support >>> (default: on)\n" >>> +"memfd-alloc=on|off controls allocating anonymous >>> guest RAM using memfd_create (default: off)\n" >> >> Question: are there any disadvantages associated with using >> memfd_create? I guess we are using up an fd, but that seems minor. Any >> reason not to set to on by default? maybe with a fallback option to >> disable that? Old Linux host kernels, circa 4.1, do not support huge pages for shared memory. Also, the tunable to enable huge pages for share memory is different than for anon memory, so there could be performance loss if it is not set correctly. /sys/kernel/mm/transparent_hugepage/enabled vs /sys/kernel/mm/transparent_hugepage/shmem_enabled It might make sense to use memfd_create by default for the secondary segments. >> I am concerned that it's actually a kind of memory backend, this flag >> seems to instead be closer to the deprecated mem-prealloc. E.g. >> it does not work with a mem path, does it? One can still define a memory backend with mempath to create the main ram segment, though it must be some form of shared to work with live update. Indeed, I would expect most users to specify an explicit memory backend for it. The secondary segments would still use memfd_create. > (mem path and mem-prealloc are transparently aliased to used memory backend > if I recall it right.) > > Steve, > > For allocating guest RAM, we switched exclusively to using memory-backends > including initial guest RAM (-m size option) and we have hostmem-memfd > that uses memfd_create() and I'd rather avoid adding random knobs to machine > for tweaking how RAM should be allocated, we have memory backends for this, > so this patch begs the question: why hostmem-memfd is not sufficient? > (patch description is rather lacking on rationale behind the patch) There is currently no way to specify memory backends for the secondary memory segments (vram, roms, etc), and IMO it would be onerous to specify a backend for each of them. On x86_64, these include pc.bios,
Re: [PATCH V7 10/29] machine: memfd-alloc option
On Thu, 3 Mar 2022 12:21:15 -0500 "Michael S. Tsirkin" wrote: > On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: > > Allocate anonymous memory using memfd_create if the memfd-alloc machine > > option is set. > > > > Signed-off-by: Steve Sistare > > --- > > hw/core/machine.c | 19 +++ > > include/hw/boards.h | 1 + > > qemu-options.hx | 6 ++ > > softmmu/physmem.c | 47 ++- > > softmmu/vl.c| 1 + > > trace-events| 1 + > > util/qemu-config.c | 4 > > 7 files changed, 70 insertions(+), 9 deletions(-) > > > > diff --git a/hw/core/machine.c b/hw/core/machine.c > > index 53a99ab..7739d88 100644 > > --- a/hw/core/machine.c > > +++ b/hw/core/machine.c > > @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool > > value, Error **errp) > > ms->mem_merge = value; > > } > > > > +static bool machine_get_memfd_alloc(Object *obj, Error **errp) > > +{ > > +MachineState *ms = MACHINE(obj); > > + > > +return ms->memfd_alloc; > > +} > > + > > +static void machine_set_memfd_alloc(Object *obj, bool value, Error **errp) > > +{ > > +MachineState *ms = MACHINE(obj); > > + > > +ms->memfd_alloc = value; > > +} > > + > > static bool machine_get_usb(Object *obj, Error **errp) > > { > > MachineState *ms = MACHINE(obj); > > @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, void > > *data) > > object_class_property_set_description(oc, "mem-merge", > > "Enable/disable memory merge support"); > > > > +object_class_property_add_bool(oc, "memfd-alloc", > > +machine_get_memfd_alloc, machine_set_memfd_alloc); > > +object_class_property_set_description(oc, "memfd-alloc", > > +"Enable/disable allocating anonymous memory using memfd_create"); > > + > > object_class_property_add_bool(oc, "usb", > > machine_get_usb, machine_set_usb); > > object_class_property_set_description(oc, "usb", > > diff --git a/include/hw/boards.h b/include/hw/boards.h > > index 9c1c190..a57d7a0 100644 > > --- a/include/hw/boards.h > > +++ b/include/hw/boards.h > > @@ -327,6 +327,7 @@ struct MachineState { > > char *dt_compatible; > > bool dump_guest_core; > > bool mem_merge; > > +bool memfd_alloc; > > bool usb; > > bool usb_disabled; > > char *firmware; > > diff --git a/qemu-options.hx b/qemu-options.hx > > index 7d47510..33c8173 100644 > > --- a/qemu-options.hx > > +++ b/qemu-options.hx > > @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > > "vmport=on|off|auto controls emulation of vmport > > (default: auto)\n" > > "dump-guest-core=on|off include guest memory in a core > > dump (default=on)\n" > > "mem-merge=on|off controls memory merge support > > (default: on)\n" > > +"memfd-alloc=on|off controls allocating anonymous > > guest RAM using memfd_create (default: off)\n" > > Question: are there any disadvantages associated with using > memfd_create? I guess we are using up an fd, but that seems minor. Any > reason not to set to on by default? maybe with a fallback option to > disable that? > > I am concerned that it's actually a kind of memory backend, this flag > seems to instead be closer to the deprecated mem-prealloc. E.g. > it does not work with a mem path, does it? (mem path and mem-prealloc are transparently aliased to used memory backend if I recall it right.) Steve, For allocating guest RAM, we switched exclusively to using memory-backends including initial guest RAM (-m size option) and we have hostmem-memfd that uses memfd_create() and I'd rather avoid adding random knobs to machine for tweaking how RAM should be allocated, we have memory backends for this, so this patch begs the question: why hostmem-memfd is not sufficient? (patch description is rather lacking on rationale behind the patch) > > > > "aes-key-wrap=on|off controls support for AES key > > wrapping (default=on)\n" > > "dea-key-wrap=on|off controls support for DEA key > > wrapping (default=on)\n" > > "suppress-vmdesc=on|off disables self-describing > > migration (default=off)\n" > > @@ -76,6 +77,11 @@ SRST > > supported by the host, de-duplicates identical memory pages > > among VMs instances (enabled by default). > > > > +``memfd-alloc=on|off`` > > +Enables or disables allocation of anonymous guest RAM using > > +memfd_create. Any associated memory-backend objects are created > > with > > +share=on. The memfd-alloc default is off. > > + > > ``aes-key-wrap=on|off`` > > Enables or disables AES key wrapping support on s390-ccw hosts. > > This feature controls whether AES wrapping keys will be created > > diff --git a/softmmu/physmem.c b/softmmu/physmem.c > > index
Re: [PATCH V7 10/29] machine: memfd-alloc option
On Wed, Dec 22, 2021 at 11:05:15AM -0800, Steve Sistare wrote: > Allocate anonymous memory using memfd_create if the memfd-alloc machine > option is set. > > Signed-off-by: Steve Sistare > --- > hw/core/machine.c | 19 +++ > include/hw/boards.h | 1 + > qemu-options.hx | 6 ++ > softmmu/physmem.c | 47 ++- > softmmu/vl.c| 1 + > trace-events| 1 + > util/qemu-config.c | 4 > 7 files changed, 70 insertions(+), 9 deletions(-) > > diff --git a/hw/core/machine.c b/hw/core/machine.c > index 53a99ab..7739d88 100644 > --- a/hw/core/machine.c > +++ b/hw/core/machine.c > @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool > value, Error **errp) > ms->mem_merge = value; > } > > +static bool machine_get_memfd_alloc(Object *obj, Error **errp) > +{ > +MachineState *ms = MACHINE(obj); > + > +return ms->memfd_alloc; > +} > + > +static void machine_set_memfd_alloc(Object *obj, bool value, Error **errp) > +{ > +MachineState *ms = MACHINE(obj); > + > +ms->memfd_alloc = value; > +} > + > static bool machine_get_usb(Object *obj, Error **errp) > { > MachineState *ms = MACHINE(obj); > @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, void > *data) > object_class_property_set_description(oc, "mem-merge", > "Enable/disable memory merge support"); > > +object_class_property_add_bool(oc, "memfd-alloc", > +machine_get_memfd_alloc, machine_set_memfd_alloc); > +object_class_property_set_description(oc, "memfd-alloc", > +"Enable/disable allocating anonymous memory using memfd_create"); > + > object_class_property_add_bool(oc, "usb", > machine_get_usb, machine_set_usb); > object_class_property_set_description(oc, "usb", > diff --git a/include/hw/boards.h b/include/hw/boards.h > index 9c1c190..a57d7a0 100644 > --- a/include/hw/boards.h > +++ b/include/hw/boards.h > @@ -327,6 +327,7 @@ struct MachineState { > char *dt_compatible; > bool dump_guest_core; > bool mem_merge; > +bool memfd_alloc; > bool usb; > bool usb_disabled; > char *firmware; > diff --git a/qemu-options.hx b/qemu-options.hx > index 7d47510..33c8173 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > "vmport=on|off|auto controls emulation of vmport > (default: auto)\n" > "dump-guest-core=on|off include guest memory in a core > dump (default=on)\n" > "mem-merge=on|off controls memory merge support > (default: on)\n" > +"memfd-alloc=on|off controls allocating anonymous guest > RAM using memfd_create (default: off)\n" Question: are there any disadvantages associated with using memfd_create? I guess we are using up an fd, but that seems minor. Any reason not to set to on by default? maybe with a fallback option to disable that? I am concerned that it's actually a kind of memory backend, this flag seems to instead be closer to the deprecated mem-prealloc. E.g. it does not work with a mem path, does it? > "aes-key-wrap=on|off controls support for AES key > wrapping (default=on)\n" > "dea-key-wrap=on|off controls support for DEA key > wrapping (default=on)\n" > "suppress-vmdesc=on|off disables self-describing > migration (default=off)\n" > @@ -76,6 +77,11 @@ SRST > supported by the host, de-duplicates identical memory pages > among VMs instances (enabled by default). > > +``memfd-alloc=on|off`` > +Enables or disables allocation of anonymous guest RAM using > +memfd_create. Any associated memory-backend objects are created with > +share=on. The memfd-alloc default is off. > + > ``aes-key-wrap=on|off`` > Enables or disables AES key wrapping support on s390-ccw hosts. > This feature controls whether AES wrapping keys will be created > diff --git a/softmmu/physmem.c b/softmmu/physmem.c > index 3524c04..95e2b49 100644 > --- a/softmmu/physmem.c > +++ b/softmmu/physmem.c > @@ -41,6 +41,7 @@ > #include "qemu/config-file.h" > #include "qemu/error-report.h" > #include "qemu/qemu-print.h" > +#include "qemu/memfd.h" > #include "exec/memory.h" > #include "exec/ioport.h" > #include "sysemu/dma.h" > @@ -1964,35 +1965,63 @@ static void ram_block_add(RAMBlock *new_block, Error > **errp) > const bool shared = qemu_ram_is_shared(new_block); > RAMBlock *block; > RAMBlock *last_block = NULL; > +struct MemoryRegion *mr = new_block->mr; > ram_addr_t old_ram_size, new_ram_size; > Error *err = NULL; > +const char *name; > +void *addr = 0; > +size_t maxlen; > +MachineState *ms = MACHINE(qdev_get_machine()); > > old_ram_size = last_ram_page(); > > qemu_mutex_lock_ramlist(); > -
Re: [PATCH V7 10/29] machine: memfd-alloc option
On 2/24/2022 12:56 PM, Dr. David Alan Gilbert wrote: > * Steve Sistare (steven.sist...@oracle.com) wrote: >> Allocate anonymous memory using memfd_create if the memfd-alloc machine >> option is set. >> >> Signed-off-by: Steve Sistare > > So other than the minor error nit that Guoyi spotted, I think this is > pretty good, one other comment below: > >> --- >> hw/core/machine.c | 19 +++ >> include/hw/boards.h | 1 + >> qemu-options.hx | 6 ++ >> softmmu/physmem.c | 47 ++- >> softmmu/vl.c| 1 + >> trace-events| 1 + >> util/qemu-config.c | 4 >> 7 files changed, 70 insertions(+), 9 deletions(-) >> >> diff --git a/hw/core/machine.c b/hw/core/machine.c >> index 53a99ab..7739d88 100644 >> --- a/hw/core/machine.c >> +++ b/hw/core/machine.c >> @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool >> value, Error **errp) >> ms->mem_merge = value; >> } >> >> +static bool machine_get_memfd_alloc(Object *obj, Error **errp) >> +{ >> +MachineState *ms = MACHINE(obj); >> + >> +return ms->memfd_alloc; >> +} >> + >> +static void machine_set_memfd_alloc(Object *obj, bool value, Error **errp) >> +{ >> +MachineState *ms = MACHINE(obj); >> + >> +ms->memfd_alloc = value; >> +} >> + >> static bool machine_get_usb(Object *obj, Error **errp) >> { >> MachineState *ms = MACHINE(obj); >> @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, void >> *data) >> object_class_property_set_description(oc, "mem-merge", >> "Enable/disable memory merge support"); >> >> +object_class_property_add_bool(oc, "memfd-alloc", >> +machine_get_memfd_alloc, machine_set_memfd_alloc); >> +object_class_property_set_description(oc, "memfd-alloc", >> +"Enable/disable allocating anonymous memory using memfd_create"); >> + >> object_class_property_add_bool(oc, "usb", >> machine_get_usb, machine_set_usb); >> object_class_property_set_description(oc, "usb", >> diff --git a/include/hw/boards.h b/include/hw/boards.h >> index 9c1c190..a57d7a0 100644 >> --- a/include/hw/boards.h >> +++ b/include/hw/boards.h >> @@ -327,6 +327,7 @@ struct MachineState { >> char *dt_compatible; >> bool dump_guest_core; >> bool mem_merge; >> +bool memfd_alloc; >> bool usb; >> bool usb_disabled; >> char *firmware; >> diff --git a/qemu-options.hx b/qemu-options.hx >> index 7d47510..33c8173 100644 >> --- a/qemu-options.hx >> +++ b/qemu-options.hx >> @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ >> "vmport=on|off|auto controls emulation of vmport >> (default: auto)\n" >> "dump-guest-core=on|off include guest memory in a core >> dump (default=on)\n" >> "mem-merge=on|off controls memory merge support >> (default: on)\n" >> +"memfd-alloc=on|off controls allocating anonymous guest >> RAM using memfd_create (default: off)\n" >> "aes-key-wrap=on|off controls support for AES key >> wrapping (default=on)\n" >> "dea-key-wrap=on|off controls support for DEA key >> wrapping (default=on)\n" >> "suppress-vmdesc=on|off disables self-describing >> migration (default=off)\n" >> @@ -76,6 +77,11 @@ SRST >> supported by the host, de-duplicates identical memory pages >> among VMs instances (enabled by default). >> >> +``memfd-alloc=on|off`` >> +Enables or disables allocation of anonymous guest RAM using >> +memfd_create. Any associated memory-backend objects are created >> with >> +share=on. The memfd-alloc default is off. >> + >> ``aes-key-wrap=on|off`` >> Enables or disables AES key wrapping support on s390-ccw hosts. >> This feature controls whether AES wrapping keys will be created >> diff --git a/softmmu/physmem.c b/softmmu/physmem.c >> index 3524c04..95e2b49 100644 >> --- a/softmmu/physmem.c >> +++ b/softmmu/physmem.c >> @@ -41,6 +41,7 @@ >> #include "qemu/config-file.h" >> #include "qemu/error-report.h" >> #include "qemu/qemu-print.h" >> +#include "qemu/memfd.h" >> #include "exec/memory.h" >> #include "exec/ioport.h" >> #include "sysemu/dma.h" >> @@ -1964,35 +1965,63 @@ static void ram_block_add(RAMBlock *new_block, Error >> **errp) >> const bool shared = qemu_ram_is_shared(new_block); >> RAMBlock *block; >> RAMBlock *last_block = NULL; >> +struct MemoryRegion *mr = new_block->mr; >> ram_addr_t old_ram_size, new_ram_size; >> Error *err = NULL; >> +const char *name; >> +void *addr = 0; >> +size_t maxlen; > > You could move some of these down to the top of the block you're using > them. Will do. One question: I added this to shorten lines and make my code additions more readable: size_t maxlen; maxlen = new_block->max_length; However, I did
Re: [PATCH V7 10/29] machine: memfd-alloc option
On 2/18/2022 3:05 AM, Guoyi Tu wrote: > On Wed, 2021-12-22 at 11:05 -0800, Steve Sistare wrote: >> Allocate anonymous memory using memfd_create if the memfd-alloc >> machine >> option is set. >> >> Signed-off-by: Steve Sistare >> --- >> hw/core/machine.c | 19 +++ >> include/hw/boards.h | 1 + >> qemu-options.hx | 6 ++ >> softmmu/physmem.c | 47 ++- >> >> softmmu/vl.c| 1 + >> trace-events| 1 + >> util/qemu-config.c | 4 >> 7 files changed, 70 insertions(+), 9 deletions(-) >> >> diff --git a/hw/core/machine.c b/hw/core/machine.c >> index 53a99ab..7739d88 100644 >> --- a/hw/core/machine.c >> +++ b/hw/core/machine.c >> @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, >> bool value, Error **errp) >> ms->mem_merge = value; >> } >> >> +static bool machine_get_memfd_alloc(Object *obj, Error **errp) >> +{ >> +MachineState *ms = MACHINE(obj); >> + >> +return ms->memfd_alloc; >> +} >> + >> +static void machine_set_memfd_alloc(Object *obj, bool value, Error >> **errp) >> +{ >> +MachineState *ms = MACHINE(obj); >> + >> +ms->memfd_alloc = value; >> +} >> + >> static bool machine_get_usb(Object *obj, Error **errp) >> { >> MachineState *ms = MACHINE(obj); >> @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, >> void *data) >> object_class_property_set_description(oc, "mem-merge", >> "Enable/disable memory merge support"); >> >> +object_class_property_add_bool(oc, "memfd-alloc", >> +machine_get_memfd_alloc, machine_set_memfd_alloc); >> +object_class_property_set_description(oc, "memfd-alloc", >> +"Enable/disable allocating anonymous memory using >> memfd_create"); >> + >> object_class_property_add_bool(oc, "usb", >> machine_get_usb, machine_set_usb); >> object_class_property_set_description(oc, "usb", >> diff --git a/include/hw/boards.h b/include/hw/boards.h >> index 9c1c190..a57d7a0 100644 >> --- a/include/hw/boards.h >> +++ b/include/hw/boards.h >> @@ -327,6 +327,7 @@ struct MachineState { >> char *dt_compatible; >> bool dump_guest_core; >> bool mem_merge; >> +bool memfd_alloc; >> bool usb; >> bool usb_disabled; >> char *firmware; >> diff --git a/qemu-options.hx b/qemu-options.hx >> index 7d47510..33c8173 100644 >> --- a/qemu-options.hx >> +++ b/qemu-options.hx >> @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ >> "vmport=on|off|auto controls emulation of vmport >> (default: auto)\n" >> "dump-guest-core=on|off include guest memory in >> a core dump (default=on)\n" >> "mem-merge=on|off controls memory merge support >> (default: on)\n" >> +"memfd-alloc=on|off controls allocating >> anonymous guest RAM using memfd_create (default: off)\n" >> "aes-key-wrap=on|off controls support for AES >> key wrapping (default=on)\n" >> "dea-key-wrap=on|off controls support for DEA >> key wrapping (default=on)\n" >> "suppress-vmdesc=on|off disables self-describing >> migration (default=off)\n" >> @@ -76,6 +77,11 @@ SRST >> supported by the host, de-duplicates identical memory pages >> among VMs instances (enabled by default). >> >> +``memfd-alloc=on|off`` >> +Enables or disables allocation of anonymous guest RAM using >> +memfd_create. Any associated memory-backend objects are >> created with >> +share=on. The memfd-alloc default is off. >> + >> ``aes-key-wrap=on|off`` >> Enables or disables AES key wrapping support on s390-ccw >> hosts. >> This feature controls whether AES wrapping keys will be >> created >> diff --git a/softmmu/physmem.c b/softmmu/physmem.c >> index 3524c04..95e2b49 100644 >> --- a/softmmu/physmem.c >> +++ b/softmmu/physmem.c >> @@ -41,6 +41,7 @@ >> #include "qemu/config-file.h" >> #include "qemu/error-report.h" >> #include "qemu/qemu-print.h" >> +#include "qemu/memfd.h" >> #include "exec/memory.h" >> #include "exec/ioport.h" >> #include "sysemu/dma.h" >> @@ -1964,35 +1965,63 @@ static void ram_block_add(RAMBlock >> *new_block, Error **errp) >> const bool shared = qemu_ram_is_shared(new_block); >> RAMBlock *block; >> RAMBlock *last_block = NULL; >> +struct MemoryRegion *mr = new_block->mr; >> ram_addr_t old_ram_size, new_ram_size; >> Error *err = NULL; >> +const char *name; >> +void *addr = 0; >> +size_t maxlen; >> +MachineState *ms = MACHINE(qdev_get_machine()); >> >> old_ram_size = last_ram_page(); >> >> qemu_mutex_lock_ramlist(); >> -new_block->offset = find_ram_offset(new_block->max_length); >> +maxlen = new_block->max_length; >> +new_block->offset = find_ram_offset(maxlen); >> >> if (!new_block->host) { >> if (xen_enabled()) { >>
Re: [PATCH V7 10/29] machine: memfd-alloc option
* Steve Sistare (steven.sist...@oracle.com) wrote: > Allocate anonymous memory using memfd_create if the memfd-alloc machine > option is set. > > Signed-off-by: Steve Sistare So other than the minor error nit that Guoyi spotted, I think this is pretty good, one other comment below: > --- > hw/core/machine.c | 19 +++ > include/hw/boards.h | 1 + > qemu-options.hx | 6 ++ > softmmu/physmem.c | 47 ++- > softmmu/vl.c| 1 + > trace-events| 1 + > util/qemu-config.c | 4 > 7 files changed, 70 insertions(+), 9 deletions(-) > > diff --git a/hw/core/machine.c b/hw/core/machine.c > index 53a99ab..7739d88 100644 > --- a/hw/core/machine.c > +++ b/hw/core/machine.c > @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool > value, Error **errp) > ms->mem_merge = value; > } > > +static bool machine_get_memfd_alloc(Object *obj, Error **errp) > +{ > +MachineState *ms = MACHINE(obj); > + > +return ms->memfd_alloc; > +} > + > +static void machine_set_memfd_alloc(Object *obj, bool value, Error **errp) > +{ > +MachineState *ms = MACHINE(obj); > + > +ms->memfd_alloc = value; > +} > + > static bool machine_get_usb(Object *obj, Error **errp) > { > MachineState *ms = MACHINE(obj); > @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, void > *data) > object_class_property_set_description(oc, "mem-merge", > "Enable/disable memory merge support"); > > +object_class_property_add_bool(oc, "memfd-alloc", > +machine_get_memfd_alloc, machine_set_memfd_alloc); > +object_class_property_set_description(oc, "memfd-alloc", > +"Enable/disable allocating anonymous memory using memfd_create"); > + > object_class_property_add_bool(oc, "usb", > machine_get_usb, machine_set_usb); > object_class_property_set_description(oc, "usb", > diff --git a/include/hw/boards.h b/include/hw/boards.h > index 9c1c190..a57d7a0 100644 > --- a/include/hw/boards.h > +++ b/include/hw/boards.h > @@ -327,6 +327,7 @@ struct MachineState { > char *dt_compatible; > bool dump_guest_core; > bool mem_merge; > +bool memfd_alloc; > bool usb; > bool usb_disabled; > char *firmware; > diff --git a/qemu-options.hx b/qemu-options.hx > index 7d47510..33c8173 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > "vmport=on|off|auto controls emulation of vmport > (default: auto)\n" > "dump-guest-core=on|off include guest memory in a core > dump (default=on)\n" > "mem-merge=on|off controls memory merge support > (default: on)\n" > +"memfd-alloc=on|off controls allocating anonymous guest > RAM using memfd_create (default: off)\n" > "aes-key-wrap=on|off controls support for AES key > wrapping (default=on)\n" > "dea-key-wrap=on|off controls support for DEA key > wrapping (default=on)\n" > "suppress-vmdesc=on|off disables self-describing > migration (default=off)\n" > @@ -76,6 +77,11 @@ SRST > supported by the host, de-duplicates identical memory pages > among VMs instances (enabled by default). > > +``memfd-alloc=on|off`` > +Enables or disables allocation of anonymous guest RAM using > +memfd_create. Any associated memory-backend objects are created with > +share=on. The memfd-alloc default is off. > + > ``aes-key-wrap=on|off`` > Enables or disables AES key wrapping support on s390-ccw hosts. > This feature controls whether AES wrapping keys will be created > diff --git a/softmmu/physmem.c b/softmmu/physmem.c > index 3524c04..95e2b49 100644 > --- a/softmmu/physmem.c > +++ b/softmmu/physmem.c > @@ -41,6 +41,7 @@ > #include "qemu/config-file.h" > #include "qemu/error-report.h" > #include "qemu/qemu-print.h" > +#include "qemu/memfd.h" > #include "exec/memory.h" > #include "exec/ioport.h" > #include "sysemu/dma.h" > @@ -1964,35 +1965,63 @@ static void ram_block_add(RAMBlock *new_block, Error > **errp) > const bool shared = qemu_ram_is_shared(new_block); > RAMBlock *block; > RAMBlock *last_block = NULL; > +struct MemoryRegion *mr = new_block->mr; > ram_addr_t old_ram_size, new_ram_size; > Error *err = NULL; > +const char *name; > +void *addr = 0; > +size_t maxlen; You could move some of these down to the top of the block you're using them. > +MachineState *ms = MACHINE(qdev_get_machine()); > > old_ram_size = last_ram_page(); > > qemu_mutex_lock_ramlist(); > -new_block->offset = find_ram_offset(new_block->max_length); > +maxlen = new_block->max_length; > +new_block->offset = find_ram_offset(maxlen); > > if (!new_block->host) { > if (xen_enabled())
Re: [PATCH V7 10/29] machine: memfd-alloc option
On Wed, 2021-12-22 at 11:05 -0800, Steve Sistare wrote: > Allocate anonymous memory using memfd_create if the memfd-alloc > machine > option is set. > > Signed-off-by: Steve Sistare > --- > hw/core/machine.c | 19 +++ > include/hw/boards.h | 1 + > qemu-options.hx | 6 ++ > softmmu/physmem.c | 47 ++- > > softmmu/vl.c| 1 + > trace-events| 1 + > util/qemu-config.c | 4 > 7 files changed, 70 insertions(+), 9 deletions(-) > > diff --git a/hw/core/machine.c b/hw/core/machine.c > index 53a99ab..7739d88 100644 > --- a/hw/core/machine.c > +++ b/hw/core/machine.c > @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, > bool value, Error **errp) > ms->mem_merge = value; > } > > +static bool machine_get_memfd_alloc(Object *obj, Error **errp) > +{ > +MachineState *ms = MACHINE(obj); > + > +return ms->memfd_alloc; > +} > + > +static void machine_set_memfd_alloc(Object *obj, bool value, Error > **errp) > +{ > +MachineState *ms = MACHINE(obj); > + > +ms->memfd_alloc = value; > +} > + > static bool machine_get_usb(Object *obj, Error **errp) > { > MachineState *ms = MACHINE(obj); > @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, > void *data) > object_class_property_set_description(oc, "mem-merge", > "Enable/disable memory merge support"); > > +object_class_property_add_bool(oc, "memfd-alloc", > +machine_get_memfd_alloc, machine_set_memfd_alloc); > +object_class_property_set_description(oc, "memfd-alloc", > +"Enable/disable allocating anonymous memory using > memfd_create"); > + > object_class_property_add_bool(oc, "usb", > machine_get_usb, machine_set_usb); > object_class_property_set_description(oc, "usb", > diff --git a/include/hw/boards.h b/include/hw/boards.h > index 9c1c190..a57d7a0 100644 > --- a/include/hw/boards.h > +++ b/include/hw/boards.h > @@ -327,6 +327,7 @@ struct MachineState { > char *dt_compatible; > bool dump_guest_core; > bool mem_merge; > +bool memfd_alloc; > bool usb; > bool usb_disabled; > char *firmware; > diff --git a/qemu-options.hx b/qemu-options.hx > index 7d47510..33c8173 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ > "vmport=on|off|auto controls emulation of vmport > (default: auto)\n" > "dump-guest-core=on|off include guest memory in > a core dump (default=on)\n" > "mem-merge=on|off controls memory merge support > (default: on)\n" > +"memfd-alloc=on|off controls allocating > anonymous guest RAM using memfd_create (default: off)\n" > "aes-key-wrap=on|off controls support for AES > key wrapping (default=on)\n" > "dea-key-wrap=on|off controls support for DEA > key wrapping (default=on)\n" > "suppress-vmdesc=on|off disables self-describing > migration (default=off)\n" > @@ -76,6 +77,11 @@ SRST > supported by the host, de-duplicates identical memory pages > among VMs instances (enabled by default). > > +``memfd-alloc=on|off`` > +Enables or disables allocation of anonymous guest RAM using > +memfd_create. Any associated memory-backend objects are > created with > +share=on. The memfd-alloc default is off. > + > ``aes-key-wrap=on|off`` > Enables or disables AES key wrapping support on s390-ccw > hosts. > This feature controls whether AES wrapping keys will be > created > diff --git a/softmmu/physmem.c b/softmmu/physmem.c > index 3524c04..95e2b49 100644 > --- a/softmmu/physmem.c > +++ b/softmmu/physmem.c > @@ -41,6 +41,7 @@ > #include "qemu/config-file.h" > #include "qemu/error-report.h" > #include "qemu/qemu-print.h" > +#include "qemu/memfd.h" > #include "exec/memory.h" > #include "exec/ioport.h" > #include "sysemu/dma.h" > @@ -1964,35 +1965,63 @@ static void ram_block_add(RAMBlock > *new_block, Error **errp) > const bool shared = qemu_ram_is_shared(new_block); > RAMBlock *block; > RAMBlock *last_block = NULL; > +struct MemoryRegion *mr = new_block->mr; > ram_addr_t old_ram_size, new_ram_size; > Error *err = NULL; > +const char *name; > +void *addr = 0; > +size_t maxlen; > +MachineState *ms = MACHINE(qdev_get_machine()); > > old_ram_size = last_ram_page(); > > qemu_mutex_lock_ramlist(); > -new_block->offset = find_ram_offset(new_block->max_length); > +maxlen = new_block->max_length; > +new_block->offset = find_ram_offset(maxlen); > > if (!new_block->host) { > if (xen_enabled()) { > -xen_ram_alloc(new_block->offset, new_block->max_length, > - new_block->mr, ); > +xen_ram_alloc(new_block->offset, maxlen,
[PATCH V7 10/29] machine: memfd-alloc option
Allocate anonymous memory using memfd_create if the memfd-alloc machine option is set. Signed-off-by: Steve Sistare --- hw/core/machine.c | 19 +++ include/hw/boards.h | 1 + qemu-options.hx | 6 ++ softmmu/physmem.c | 47 ++- softmmu/vl.c| 1 + trace-events| 1 + util/qemu-config.c | 4 7 files changed, 70 insertions(+), 9 deletions(-) diff --git a/hw/core/machine.c b/hw/core/machine.c index 53a99ab..7739d88 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -392,6 +392,20 @@ static void machine_set_mem_merge(Object *obj, bool value, Error **errp) ms->mem_merge = value; } +static bool machine_get_memfd_alloc(Object *obj, Error **errp) +{ +MachineState *ms = MACHINE(obj); + +return ms->memfd_alloc; +} + +static void machine_set_memfd_alloc(Object *obj, bool value, Error **errp) +{ +MachineState *ms = MACHINE(obj); + +ms->memfd_alloc = value; +} + static bool machine_get_usb(Object *obj, Error **errp) { MachineState *ms = MACHINE(obj); @@ -829,6 +843,11 @@ static void machine_class_init(ObjectClass *oc, void *data) object_class_property_set_description(oc, "mem-merge", "Enable/disable memory merge support"); +object_class_property_add_bool(oc, "memfd-alloc", +machine_get_memfd_alloc, machine_set_memfd_alloc); +object_class_property_set_description(oc, "memfd-alloc", +"Enable/disable allocating anonymous memory using memfd_create"); + object_class_property_add_bool(oc, "usb", machine_get_usb, machine_set_usb); object_class_property_set_description(oc, "usb", diff --git a/include/hw/boards.h b/include/hw/boards.h index 9c1c190..a57d7a0 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -327,6 +327,7 @@ struct MachineState { char *dt_compatible; bool dump_guest_core; bool mem_merge; +bool memfd_alloc; bool usb; bool usb_disabled; char *firmware; diff --git a/qemu-options.hx b/qemu-options.hx index 7d47510..33c8173 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -30,6 +30,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ "vmport=on|off|auto controls emulation of vmport (default: auto)\n" "dump-guest-core=on|off include guest memory in a core dump (default=on)\n" "mem-merge=on|off controls memory merge support (default: on)\n" +"memfd-alloc=on|off controls allocating anonymous guest RAM using memfd_create (default: off)\n" "aes-key-wrap=on|off controls support for AES key wrapping (default=on)\n" "dea-key-wrap=on|off controls support for DEA key wrapping (default=on)\n" "suppress-vmdesc=on|off disables self-describing migration (default=off)\n" @@ -76,6 +77,11 @@ SRST supported by the host, de-duplicates identical memory pages among VMs instances (enabled by default). +``memfd-alloc=on|off`` +Enables or disables allocation of anonymous guest RAM using +memfd_create. Any associated memory-backend objects are created with +share=on. The memfd-alloc default is off. + ``aes-key-wrap=on|off`` Enables or disables AES key wrapping support on s390-ccw hosts. This feature controls whether AES wrapping keys will be created diff --git a/softmmu/physmem.c b/softmmu/physmem.c index 3524c04..95e2b49 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -41,6 +41,7 @@ #include "qemu/config-file.h" #include "qemu/error-report.h" #include "qemu/qemu-print.h" +#include "qemu/memfd.h" #include "exec/memory.h" #include "exec/ioport.h" #include "sysemu/dma.h" @@ -1964,35 +1965,63 @@ static void ram_block_add(RAMBlock *new_block, Error **errp) const bool shared = qemu_ram_is_shared(new_block); RAMBlock *block; RAMBlock *last_block = NULL; +struct MemoryRegion *mr = new_block->mr; ram_addr_t old_ram_size, new_ram_size; Error *err = NULL; +const char *name; +void *addr = 0; +size_t maxlen; +MachineState *ms = MACHINE(qdev_get_machine()); old_ram_size = last_ram_page(); qemu_mutex_lock_ramlist(); -new_block->offset = find_ram_offset(new_block->max_length); +maxlen = new_block->max_length; +new_block->offset = find_ram_offset(maxlen); if (!new_block->host) { if (xen_enabled()) { -xen_ram_alloc(new_block->offset, new_block->max_length, - new_block->mr, ); +xen_ram_alloc(new_block->offset, maxlen, new_block->mr, ); if (err) { error_propagate(errp, err); qemu_mutex_unlock_ramlist(); return; } } else { -new_block->host = qemu_anon_ram_alloc(new_block->max_length, -