All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: Steven Sistare <steven.sistare@oracle.com>
Cc: qemu-devel@nongnu.org, Fabiano Rosas <farosas@suse.de>,
	David Hildenbrand <david@redhat.com>,
	Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
	Eduardo Habkost <eduardo@habkost.net>,
	Philippe Mathieu-Daude <philmd@linaro.org>,
	Paolo Bonzini <pbonzini@redhat.com>,
	"Daniel P. Berrange" <berrange@redhat.com>,
	Markus Armbruster <armbru@redhat.com>
Subject: Re: [PATCH V5 02/23] physmem: qemu_ram_alloc_from_fd extensions
Date: Thu, 2 Jan 2025 14:48:36 -0500	[thread overview]
Message-ID: <Z3btlLk4YpljgS4R@x1n> (raw)
In-Reply-To: <afde28fb-fad5-4ba7-8c28-bf9f2a05cd1b@oracle.com>

On Thu, Jan 02, 2025 at 01:36:01PM -0500, Steven Sistare wrote:
> On 12/24/2024 12:18 PM, Peter Xu wrote:
> > On Tue, Dec 24, 2024 at 08:16:47AM -0800, Steve Sistare wrote:
> > > Extend qemu_ram_alloc_from_fd to support resizable ram, and define
> > > qemu_ram_resize_cb to clean up the API.
> > > 
> > > Add a grow parameter to extend the file if necessary.  However, if
> > > grow is false, a zero-sized file is always extended.
> > > 
> > > Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
> > > ---
> > >   include/exec/ram_addr.h | 13 +++++++++----
> > >   system/memory.c         |  4 ++--
> > >   system/physmem.c        | 35 ++++++++++++++++++++---------------
> > >   3 files changed, 31 insertions(+), 21 deletions(-)
> > > 
> > > diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h
> > > index ff157c1..94bb3cc 100644
> > > --- a/include/exec/ram_addr.h
> > > +++ b/include/exec/ram_addr.h
> > > @@ -111,23 +111,30 @@ long qemu_maxrampagesize(void);
> > >    *
> > >    * Parameters:
> > >    *  @size: the size in bytes of the ram block
> > > + *  @max_size: the maximum size of the block after resizing
> > >    *  @mr: the memory region where the ram block is
> > > + *  @resized: callback after calls to qemu_ram_resize
> > >    *  @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM,
> > >    *              RAM_NORESERVE, RAM_PROTECTED, RAM_NAMED_FILE, RAM_READONLY,
> > >    *              RAM_READONLY_FD, RAM_GUEST_MEMFD
> > >    *  @mem_path or @fd: specify the backing file or device
> > >    *  @offset: Offset into target file
> > > + *  @grow: extend file if necessary (but an empty file is always extended).
> > >    *  @errp: pointer to Error*, to store an error if it happens
> > >    *
> > >    * Return:
> > >    *  On success, return a pointer to the ram block.
> > >    *  On failure, return NULL.
> > >    */
> > > +typedef void (*qemu_ram_resize_cb)(const char *, uint64_t length, void *host);
> > > +
> > >   RAMBlock *qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
> > >                                      uint32_t ram_flags, const char *mem_path,
> > >                                      off_t offset, Error **errp);
> > > -RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
> > > +RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, ram_addr_t max_size,
> > > +                                 qemu_ram_resize_cb resized, MemoryRegion *mr,
> > >                                    uint32_t ram_flags, int fd, off_t offset,
> > > +                                 bool grow,
> > >                                    Error **errp);
> > >   RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
> > > @@ -135,9 +142,7 @@ RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
> > >   RAMBlock *qemu_ram_alloc(ram_addr_t size, uint32_t ram_flags, MemoryRegion *mr,
> > >                            Error **errp);
> > >   RAMBlock *qemu_ram_alloc_resizeable(ram_addr_t size, ram_addr_t max_size,
> > > -                                    void (*resized)(const char*,
> > > -                                                    uint64_t length,
> > > -                                                    void *host),
> > > +                                    qemu_ram_resize_cb resized,
> > >                                       MemoryRegion *mr, Error **errp);
> > >   void qemu_ram_free(RAMBlock *block);
> > > diff --git a/system/memory.c b/system/memory.c
> > > index 78e17e0..290c522 100644
> > > --- a/system/memory.c
> > > +++ b/system/memory.c
> > > @@ -1680,8 +1680,8 @@ bool memory_region_init_ram_from_fd(MemoryRegion *mr,
> > >       mr->readonly = !!(ram_flags & RAM_READONLY);
> > >       mr->terminates = true;
> > >       mr->destructor = memory_region_destructor_ram;
> > > -    mr->ram_block = qemu_ram_alloc_from_fd(size, mr, ram_flags, fd, offset,
> > > -                                           &err);
> > > +    mr->ram_block = qemu_ram_alloc_from_fd(size, size, NULL, mr, ram_flags, fd,
> > > +                                           offset, false, &err);
> > >       if (err) {
> > >           mr->size = int128_zero();
> > >           object_unparent(OBJECT(mr));
> > > diff --git a/system/physmem.c b/system/physmem.c
> > > index c76503a..48c544f 100644
> > > --- a/system/physmem.c
> > > +++ b/system/physmem.c
> > > @@ -1942,8 +1942,10 @@ out_free:
> > >   }
> > >   #ifdef CONFIG_POSIX
> > > -RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
> > > +RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, ram_addr_t max_size,
> > > +                                 qemu_ram_resize_cb resized, MemoryRegion *mr,
> > >                                    uint32_t ram_flags, int fd, off_t offset,
> > > +                                 bool grow,
> > >                                    Error **errp)
> > >   {
> > >       RAMBlock *new_block;
> > > @@ -1953,7 +1955,9 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
> > >       /* Just support these ram flags by now. */
> > >       assert((ram_flags & ~(RAM_SHARED | RAM_PMEM | RAM_NORESERVE |
> > >                             RAM_PROTECTED | RAM_NAMED_FILE | RAM_READONLY |
> > > -                          RAM_READONLY_FD | RAM_GUEST_MEMFD)) == 0);
> > > +                          RAM_READONLY_FD | RAM_GUEST_MEMFD |
> > > +                          RAM_RESIZEABLE)) == 0);
> > > +    assert(max_size >= size);
> > >       if (xen_enabled()) {
> > >           error_setg(errp, "-mem-path not supported with Xen");
> > > @@ -1968,12 +1972,14 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
> > >       size = TARGET_PAGE_ALIGN(size);
> > >       size = REAL_HOST_PAGE_ALIGN(size);
> > > +    max_size = TARGET_PAGE_ALIGN(max_size);
> > > +    max_size = REAL_HOST_PAGE_ALIGN(max_size);
> > >       file_size = get_file_size(fd);
> > > -    if (file_size > offset && file_size < (offset + size)) {
> > > +    if (file_size && file_size < offset + max_size && !grow) {
> > 
> > Is this a bugfix for the case offset < fsize?  If so, better make it a
> > small patch and copy stable..
> > 
> > $ touch ramfile
> > $ truncate -s 64M ramfile
> > $ ./qemu-system-x86_64 -object memory-backend-file,mem-path=./ramfile,offset=128M,size=128M,id=mem1,prealloc=on
> > qemu-system-x86_64: qemu_prealloc_mem: preallocating memory failed: Bad address
> > 
> > So yes, it's a bug..
> 
> Yes, it's a bug I noticed by inspection.
> I will split and submit to stable.

Thanks.

> 
> > >           error_setg(errp, "backing store size 0x%" PRIx64
> > >                      " does not match 'size' option 0x" RAM_ADDR_FMT,
> > > -                   file_size, size);
> > > +                   file_size, max_size);
> > >           return NULL;
> > >       }
> > > @@ -1988,11 +1994,13 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
> > >       new_block = g_malloc0(sizeof(*new_block));
> > >       new_block->mr = mr;
> > >       new_block->used_length = size;
> > > -    new_block->max_length = size;
> > > +    new_block->max_length = max_size;
> > > +    new_block->resized = resized;
> > >       new_block->flags = ram_flags;
> > >       new_block->guest_memfd = -1;
> > > -    new_block->host = file_ram_alloc(new_block, size, fd, !file_size, offset,
> > > -                                     errp);
> > > +    new_block->host = file_ram_alloc(new_block, max_size, fd,
> > > +                                     file_size < offset + max_size,
> > 
> > Same here, looks like relevant to above.
> 
> This line would not be part of the fix for stable.  The pre-cpr code should only
> truncate (allocate) if !file_size.  If file_size > 0, the fixed conditional above
> verifies that file_size is large enough.
> 
> The fix will be a 1-liner:
>  -    if (file_size > offset && file_size < (offset + size)) {
>  +    if (file_size && file_size < offset + size) {

Indeed, this should work.

-- 
Peter Xu



  reply	other threads:[~2025-01-02 19:49 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-24 16:16 [PATCH V5 00/23] Live update: cpr-transfer Steve Sistare
2024-12-24 16:16 ` [PATCH V5 01/23] backends/hostmem-shm: factor out allocation of "anonymous shared memory with an fd" Steve Sistare
2024-12-24 16:56   ` Peter Xu
2024-12-24 16:16 ` [PATCH V5 02/23] physmem: qemu_ram_alloc_from_fd extensions Steve Sistare
2024-12-24 17:18   ` Peter Xu
2025-01-02 18:36     ` Steven Sistare
2025-01-02 19:48       ` Peter Xu [this message]
2025-01-02 20:03         ` Steven Sistare
2024-12-24 16:16 ` [PATCH V5 03/23] physmem: fd-based shared memory Steve Sistare
2024-12-24 17:27   ` Peter Xu
2025-01-02 18:34     ` Steven Sistare
2024-12-24 16:16 ` [PATCH V5 04/23] memory: add RAM_PRIVATE Steve Sistare
2024-12-24 16:16 ` [PATCH V5 05/23] machine: aux-ram-share option Steve Sistare
2024-12-24 16:16 ` [PATCH V5 06/23] migration: cpr-state Steve Sistare
2024-12-24 16:16 ` [PATCH V5 07/23] physmem: preserve ram blocks for cpr Steve Sistare
2024-12-24 17:32   ` Peter Xu
2024-12-24 16:16 ` [PATCH V5 08/23] hostmem-memfd: preserve " Steve Sistare
2024-12-24 16:16 ` [PATCH V5 09/23] hostmem-shm: " Steve Sistare
2024-12-24 16:16 ` [PATCH V5 10/23] migration: enhance migrate_uri_parse Steve Sistare
2024-12-24 17:48   ` Peter Xu
2024-12-24 16:16 ` [PATCH V5 11/23] migration: incoming channel Steve Sistare
2024-12-24 17:51   ` Peter Xu
2024-12-24 16:16 ` [PATCH V5 12/23] migration: SCM_RIGHTS for QEMUFile Steve Sistare
2024-12-24 16:16 ` [PATCH V5 13/23] migration: VMSTATE_FD Steve Sistare
2024-12-24 16:16 ` [PATCH V5 14/23] migration: cpr-transfer save and load Steve Sistare
2024-12-24 16:17 ` [PATCH V5 15/23] migration: cpr-transfer mode Steve Sistare
2024-12-24 19:24   ` Peter Xu
2025-01-02 19:21     ` Steven Sistare
2025-01-02 19:57       ` Peter Xu
2025-01-02 20:05         ` Steven Sistare
2025-01-07 12:05   ` Markus Armbruster
2025-01-07 15:38     ` Steven Sistare
2025-01-17 13:44       ` Markus Armbruster
2025-01-27 16:35         ` Steven Sistare
2025-01-28 11:56           ` Markus Armbruster
2025-01-28 21:19             ` Steven Sistare
2025-01-28 21:30             ` Steven Sistare
2025-01-29  6:19   ` Markus Armbruster
2024-12-24 16:17 ` [PATCH V5 16/23] migration-test: memory_backend Steve Sistare
2024-12-24 16:17 ` [PATCH V5 17/23] tests/qtest: optimize migrate_set_ports Steve Sistare
2024-12-24 19:26   ` Peter Xu
2024-12-24 16:17 ` [PATCH V5 18/23] tests/qtest: defer connection Steve Sistare
2024-12-24 19:27   ` Peter Xu
2024-12-24 16:17 ` [PATCH V5 19/23] migration-test: " Steve Sistare
2024-12-24 16:17 ` [PATCH V5 20/23] tests/qtest: enhance migration channels Steve Sistare
2024-12-24 19:48   ` Peter Xu
2024-12-24 16:17 ` [PATCH V5 21/23] tests/qtest: assert qmp_ready Steve Sistare
2024-12-24 19:54   ` Peter Xu
2025-01-02 18:36     ` Steven Sistare
2024-12-24 16:17 ` [PATCH V5 22/23] migration-test: cpr-transfer Steve Sistare
2024-12-24 20:01   ` Peter Xu
2024-12-24 20:06     ` Peter Xu
2025-01-02 18:35       ` Steven Sistare
2025-01-02 20:11         ` Peter Xu
2025-01-02 18:35     ` Steven Sistare
2025-01-02 20:09       ` Peter Xu
2025-01-02 20:12   ` Peter Xu
2024-12-24 16:17 ` [PATCH V5 23/23] migration: cpr-transfer documentation Steve Sistare
2024-12-24 20:02   ` Peter Xu

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=Z3btlLk4YpljgS4R@x1n \
    --to=peterx@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=david@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=farosas@suse.de \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=pbonzini@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=steven.sistare@oracle.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.