Re: [PATCH V7 10/29] machine: memfd-alloc option

2022-03-29 Thread Steven Sistare
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

2022-03-11 Thread David Hildenbrand
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

2022-03-11 Thread Daniel P . Berrangé
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

2022-03-11 Thread David Hildenbrand
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

2022-03-11 Thread Igor Mammedov
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

2022-03-10 Thread Steven Sistare
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

2022-03-10 Thread Steven Sistare
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

2022-03-10 Thread Igor Mammedov
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

2022-03-10 Thread Steven Sistare
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

2022-03-07 Thread Igor Mammedov
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

2022-03-07 Thread Michael S. Tsirkin
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

2022-03-07 Thread Steven Sistare
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

2022-03-04 Thread Igor Mammedov
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

2022-03-03 Thread Michael S. Tsirkin
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

2022-03-03 Thread Steven Sistare
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

2022-03-03 Thread Steven Sistare
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

2022-02-24 Thread Dr. David Alan Gilbert
* 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

2022-02-18 Thread Guoyi Tu
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

2021-12-22 Thread Steve Sistare
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,
-