All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: Stefano Garzarella <sgarzare@redhat.com>
Cc: qemu-devel@nongnu.org, "Jason Wang" <jasowang@redhat.com>,
	"Coiby Xu" <Coiby.Xu@gmail.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	qemu-block@nongnu.org, "Daniel P. Berrangé" <berrange@redhat.com>,
	"Gerd Hoffmann" <kraxel@redhat.com>,
	slp@redhat.com, "Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"Brad Smith" <brad@comstyle.com>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	"Thomas Huth" <thuth@redhat.com>,
	"Eric Blake" <eblake@redhat.com>, "Kevin Wolf" <kwolf@redhat.com>,
	"Raphael Norwitz" <raphael@enfabrica.net>,
	gmaglione@redhat.com, "Laurent Vivier" <lvivier@redhat.com>,
	stefanha@redhat.com, "David Hildenbrand" <david@redhat.com>,
	"Hanna Reitz" <hreitz@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"Igor Mammedov" <imammedo@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>
Subject: Re: [PATCH v4 10/12] hostmem: add a new memory backend based on POSIX shm_open()
Date: Wed, 08 May 2024 13:59:33 +0200	[thread overview]
Message-ID: <87y18kcy56.fsf@pond.sub.org> (raw)
In-Reply-To: <20240508074457.12367-11-sgarzare@redhat.com> (Stefano Garzarella's message of "Wed, 8 May 2024 09:44:54 +0200")

Stefano Garzarella <sgarzare@redhat.com> writes:

> shm_open() creates and opens a new POSIX shared memory object.
> A POSIX shared memory object allows creating memory backend with an
> associated file descriptor that can be shared with external processes
> (e.g. vhost-user).
>
> The new `memory-backend-shm` can be used as an alternative when
> `memory-backend-memfd` is not available (Linux only), since shm_open()
> should be provided by any POSIX-compliant operating system.
>
> This backend mimics memfd, allocating memory that is practically
> anonymous. In theory shm_open() requires a name, but this is allocated
> for a short time interval and shm_unlink() is called right after
> shm_open(). After that, only fd is shared with external processes
> (e.g., vhost-user) as if it were associated with anonymous memory.
>
> In the future we may also allow the user to specify the name to be
> passed to shm_open(), but for now we keep the backend simple, mimicking
> anonymous memory such as memfd.
>
> Acked-by: David Hildenbrand <david@redhat.com>
> Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
> ---
> v4
> - fail if we find "share=off" in shm_backend_memory_alloc() [David]
> v3
> - enriched commit message and documentation to highlight that we
>   want to mimic memfd (David)
> ---
>  docs/system/devices/vhost-user.rst |   5 +-
>  qapi/qom.json                      |  17 ++++
>  backends/hostmem-shm.c             | 123 +++++++++++++++++++++++++++++
>  backends/meson.build               |   1 +
>  qemu-options.hx                    |  13 +++
>  5 files changed, 157 insertions(+), 2 deletions(-)
>  create mode 100644 backends/hostmem-shm.c
>
> diff --git a/docs/system/devices/vhost-user.rst b/docs/system/devices/vhost-user.rst
> index 9b2da106ce..35259d8ec7 100644
> --- a/docs/system/devices/vhost-user.rst
> +++ b/docs/system/devices/vhost-user.rst
> @@ -98,8 +98,9 @@ Shared memory object
>  
>  In order for the daemon to access the VirtIO queues to process the
>  requests it needs access to the guest's address space. This is
> -achieved via the ``memory-backend-file`` or ``memory-backend-memfd``
> -objects. A reference to a file-descriptor which can access this object
> +achieved via the ``memory-backend-file``, ``memory-backend-memfd``, or
> +``memory-backend-shm`` objects.
> +A reference to a file-descriptor which can access this object
>  will be passed via the socket as part of the protocol negotiation.
>  
>  Currently the shared memory object needs to match the size of the main
> diff --git a/qapi/qom.json b/qapi/qom.json
> index 38dde6d785..52df052df8 100644
> --- a/qapi/qom.json
> +++ b/qapi/qom.json
> @@ -721,6 +721,19 @@
>              '*hugetlbsize': 'size',
>              '*seal': 'bool' } }
>  
> +##
> +# @MemoryBackendShmProperties:
> +#
> +# Properties for memory-backend-shm objects.
> +#
> +# The @share boolean option is true by default with shm.

This contradicts the doc comment for @share:

   # @share: if false, the memory is private to QEMU; if true, it is
   #     shared (default: false)

Your intention is to override that text.  But that's less than clear.
Moreover, the documentation of @share is pretty far from this override.
John Snow is working on patches that'll pull it closer.

Hmm, MemoryBackendMemfdProperties has the same override.

I think we should change the doc comment for @share to something like

   # @share: if false, the memory is private to QEMU; if true, it is
   #     shared (default depends on the backend type)

and then document the actual default with each backend type.

> +#
> +# Since: 9.1
> +##
> +{ 'struct': 'MemoryBackendShmProperties',
> +  'base': 'MemoryBackendProperties',
> +  'data': { } }

Let's add 'if': 'CONFIG_POSIX' here.

> +
>  ##
>  # @MemoryBackendEpcProperties:
>  #
> @@ -985,6 +998,8 @@
>      { 'name': 'memory-backend-memfd',
>        'if': 'CONFIG_LINUX' },
>      'memory-backend-ram',
> +    { 'name': 'memory-backend-shm',
> +      'if': 'CONFIG_POSIX' },
>      'pef-guest',
>      { 'name': 'pr-manager-helper',
>        'if': 'CONFIG_LINUX' },
> @@ -1056,6 +1071,8 @@
>        'memory-backend-memfd':       { 'type': 'MemoryBackendMemfdProperties',
>                                        'if': 'CONFIG_LINUX' },
>        'memory-backend-ram':         'MemoryBackendProperties',
> +      'memory-backend-shm':         { 'type': 'MemoryBackendShmProperties',
> +                                      'if': 'CONFIG_POSIX' },
>        'pr-manager-helper':          { 'type': 'PrManagerHelperProperties',
>                                        'if': 'CONFIG_LINUX' },
>        'qtest':                      'QtestProperties',

[...]

> diff --git a/qemu-options.hx b/qemu-options.hx
> index cf61f6b863..2226172fb0 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -5227,6 +5227,19 @@ SRST
>  
>          The ``share`` boolean option is on by default with memfd.
>  
> +    ``-object memory-backend-shm,id=id,merge=on|off,dump=on|off,share=on|off,prealloc=on|off,size=size,host-nodes=host-nodes,policy=default|preferred|bind|interleave``
> +        Creates a POSIX shared memory backend object, which allows
> +        QEMU to share the memory with an external process (e.g. when
> +        using vhost-user). This backend mimics memfd, allocating memory that is
> +        practically anonymous. This is useful when memfd is not available.

This actually explains the purpose, unlike the doc comment in qom.json.
Same for the existing memory backends; can't fault you for doing your
new one the same way.  We ought to fix them all.  I'm not demanding you
do it.

The text could perhaps a bit clearer.  What does "practically anonymous"
mean?  As far as I understand, memory-backend-shm is a more portable and
less featureful version of memory-backend-memfd.  Say that?

> +
> +        Please refer to ``memory-backend-file`` for a description of the
> +        options.
> +
> +        The ``share`` boolean option is on by default with shm. Setting it to
> +        off will cause a failure during allocation because it is not supported
> +        by this backend.
> +

The "will case a failure" part is documented only here, and not in
qom.json.

Not this patch's fault: documentation for -object memory-backend-epc is
missing.

>      ``-object iommufd,id=id[,fd=fd]``
>          Creates an iommufd backend which allows control of DMA mapping
>          through the ``/dev/iommu`` device.



  reply	other threads:[~2024-05-08 12:00 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-08  7:44 [PATCH v4 00/12] vhost-user: support any POSIX system (tested on macOS, FreeBSD, OpenBSD) Stefano Garzarella
2024-05-08  7:44 ` [PATCH v4 01/12] libvhost-user: set msg.msg_control to NULL when it is empty Stefano Garzarella
2024-05-08  8:57   ` Daniel P. Berrangé
2024-05-08  9:33     ` Stefano Garzarella
2024-05-08 10:23   ` Philippe Mathieu-Daudé
2024-05-08  7:44 ` [PATCH v4 02/12] libvhost-user: fail vu_message_write() if sendmsg() is failing Stefano Garzarella
2024-05-08  8:59   ` Daniel P. Berrangé
2024-05-08 10:23   ` Philippe Mathieu-Daudé
2024-05-08  7:44 ` [PATCH v4 03/12] libvhost-user: mask F_INFLIGHT_SHMFD if memfd is not supported Stefano Garzarella
2024-05-08 10:39   ` Philippe Mathieu-Daudé
2024-05-10  8:25     ` Stefano Garzarella
2024-05-08  7:44 ` [PATCH v4 04/12] vhost-user-server: do not set memory fd non-blocking Stefano Garzarella
2024-05-08  9:00   ` Daniel P. Berrangé
2024-05-08  7:44 ` [PATCH v4 05/12] contrib/vhost-user-blk: fix bind() using the right size of the address Stefano Garzarella
2024-05-08 10:25   ` Philippe Mathieu-Daudé
2024-05-08  7:44 ` [PATCH v4 06/12] contrib/vhost-user-*: use QEMU bswap helper functions Stefano Garzarella
2024-05-08 10:13   ` Philippe Mathieu-Daudé
2024-05-08 10:25     ` Philippe Mathieu-Daudé
2024-05-08  7:44 ` [PATCH v4 07/12] vhost-user: enable frontends on any POSIX system Stefano Garzarella
2024-05-08 10:26   ` Philippe Mathieu-Daudé
2024-05-08  7:44 ` [PATCH v4 08/12] libvhost-user: enable it " Stefano Garzarella
2024-05-08 10:36   ` Philippe Mathieu-Daudé
2024-05-10  8:56     ` Stefano Garzarella
2024-05-10  9:56       ` Philippe Mathieu-Daudé
2024-05-08  7:44 ` [PATCH v4 09/12] contrib/vhost-user-blk: " Stefano Garzarella
2024-05-08 10:32   ` Philippe Mathieu-Daudé
2024-05-10  9:02     ` Stefano Garzarella
2024-05-08  7:44 ` [PATCH v4 10/12] hostmem: add a new memory backend based on POSIX shm_open() Stefano Garzarella
2024-05-08 11:59   ` Markus Armbruster [this message]
2024-05-10  9:37     ` Stefano Garzarella
2024-05-08  7:44 ` [PATCH v4 11/12] tests/qtest/vhost-user-blk-test: use memory-backend-shm Stefano Garzarella
2024-05-10  5:57   ` Thomas Huth
2024-05-10 10:54   ` Philippe Mathieu-Daudé
2024-05-08  7:44 ` [PATCH v4 12/12] tests/qtest/vhost-user-test: add a test case for memory-backend-shm Stefano Garzarella
2024-05-10  5:58   ` Thomas Huth
2024-05-08 10:39 ` [PATCH v4 00/12] vhost-user: support any POSIX system (tested on macOS, FreeBSD, OpenBSD) Philippe Mathieu-Daudé
2024-05-09 19:20 ` Stefan Hajnoczi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87y18kcy56.fsf@pond.sub.org \
    --to=armbru@redhat.com \
    --cc=Coiby.Xu@gmail.com \
    --cc=berrange@redhat.com \
    --cc=brad@comstyle.com \
    --cc=david@redhat.com \
    --cc=eblake@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=gmaglione@redhat.com \
    --cc=hreitz@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=raphael@enfabrica.net \
    --cc=sgarzare@redhat.com \
    --cc=slp@redhat.com \
    --cc=stefanha@redhat.com \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.