From: Juan Quintela <quintela@redhat.com>
To: David Hildenbrand <david@redhat.com>
Cc: qemu-devel@nongnu.org,
"Dr . David Alan Gilbert" <dgilbert@redhat.com>,
Peter Xu <peterx@redhat.com>,
"Michael S . Tsirkin" <mst@redhat.com>,
Michal Privoznik <mprivozn@redhat.com>,
Jing Qi <jinqi@redhat.com>
Subject: Re: [PATCH v5 8/8] virtio-mem: Proper support for preallocation with migration
Date: Thu, 02 Feb 2023 12:56:10 +0100 [thread overview]
Message-ID: <87cz6snuw5.fsf@secure.mitica> (raw)
In-Reply-To: <20230117112249.244096-9-david@redhat.com> (David Hildenbrand's message of "Tue, 17 Jan 2023 12:22:49 +0100")
David Hildenbrand <david@redhat.com> wrote:
> Ordinary memory preallocation runs when QEMU starts up and creates the
> memory backends, before processing the incoming migration stream. With
> virtio-mem, we don't know which memory blocks to preallocate before
> migration started. Now that we migrate the virtio-mem bitmap early, before
> migrating any RAM content, we can safely preallocate memory for all plugged
> memory blocks before migrating any RAM content.
>
> This is especially relevant for the following cases:
>
> (1) User errors
>
> With hugetlb/files, if we don't have sufficient backend memory available on
> the migration destination, we'll crash QEMU (SIGBUS) during RAM migration
> when running out of backend memory. Preallocating memory before actual
> RAM migration allows for failing gracefully and informing the user about
> the setup problem.
>
> (2) Excluded memory ranges during migration
>
> For example, virtio-balloon free page hinting will exclude some pages
> from getting migrated. In that case, we won't crash during RAM
> migration, but later, when running the VM on the destination, which is
> bad.
>
> To fix this for new QEMU machines that migrate the bitmap early,
> preallocate the memory early, before any RAM migration. Warn with old
> QEMU machines.
>
> Getting postcopy right is a bit tricky, but we essentially now implement
> the same (problematic) preallocation logic as ordinary preallocation:
> preallocate memory early and discard it again before precopy starts. During
> ordinary preallocation, discarding of RAM happens when postcopy is advised.
> As the state (bitmap) is loaded after postcopy was advised but before
> postcopy starts listening, we have to discard memory we preallocated
> immediately again ourselves.
>
> Note that nothing (not even hugetlb reservations) guarantees for postcopy
> that backend memory (especially, hugetlb pages) are still free after they
> were freed ones while discarding RAM. Still, allocating that memory at
> least once helps catching some basic setup problems.
>
> Before this change, trying to restore a VM when insufficient hugetlb
> pages are around results in the process crashing to to a "Bus error"
> (SIGBUS). With this change, QEMU fails gracefully:
>
> qemu-system-x86_64: qemu_prealloc_mem: preallocating memory failed: Bad address
> qemu-system-x86_64: error while loading state for instance 0x0 of device '0000:00:03.0/virtio-mem-device-early'
> qemu-system-x86_64: load of migration failed: Cannot allocate memory
>
> And we can even introspect the early migration data, including the
> bitmap:
> $ ./scripts/analyze-migration.py -f STATEFILE
> {
> "ram (2)": {
> "section sizes": {
> "0000:00:03.0/mem0": "0x0000000780000000",
> "0000:00:04.0/mem1": "0x0000000780000000",
> "pc.ram": "0x0000000100000000",
> "/rom@etc/acpi/tables": "0x0000000000020000",
> "pc.bios": "0x0000000000040000",
> "0000:00:02.0/e1000.rom": "0x0000000000040000",
> "pc.rom": "0x0000000000020000",
> "/rom@etc/table-loader": "0x0000000000001000",
> "/rom@etc/acpi/rsdp": "0x0000000000001000"
> }
> },
> "0000:00:03.0/virtio-mem-device-early (51)": {
> "tmp": "00 00 00 01 40 00 00 00 00 00 00 07 80 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00",
> "size": "0x0000000040000000",
> "bitmap": "ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [...]
> },
> "0000:00:04.0/virtio-mem-device-early (53)": {
> "tmp": "00 00 00 08 c0 00 00 00 00 00 00 07 80 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00",
> "size": "0x00000001fa400000",
> "bitmap": "ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [...]
> },
> [...]
>
> Reported-by: Jing Qi <jinqi@redhat.com>
> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Signed-off-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
next prev parent reply other threads:[~2023-02-02 11:56 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-17 11:22 [PATCH v5 0/8] virtio-mem: Handle preallocation with migration David Hildenbrand
2023-01-17 11:22 ` [PATCH v5 1/8] migration/savevm: Move more savevm handling into vmstate_save() David Hildenbrand
2023-02-02 11:46 ` Juan Quintela
2023-01-17 11:22 ` [PATCH v5 2/8] migration/savevm: Prepare vmdesc json writer in qemu_savevm_state_setup() David Hildenbrand
2023-02-02 11:48 ` Juan Quintela
2023-01-17 11:22 ` [PATCH v5 3/8] migration/savevm: Allow immutable device state to be migrated early (i.e., before RAM) David Hildenbrand
2023-02-02 11:49 ` Juan Quintela
2023-01-17 11:22 ` [PATCH v5 4/8] migration/vmstate: Introduce VMSTATE_WITH_TMP_TEST() and VMSTATE_BITMAP_TEST() David Hildenbrand
2023-02-02 11:50 ` Juan Quintela
2023-01-17 11:22 ` [PATCH v5 5/8] migration/ram: Factor out check for advised postcopy David Hildenbrand
2023-02-02 11:51 ` Juan Quintela
2023-01-17 11:22 ` [PATCH v5 6/8] virtio-mem: Fail if a memory backend with "prealloc=on" is specified David Hildenbrand
2023-02-02 11:52 ` Juan Quintela
2023-01-17 11:22 ` [PATCH v5 7/8] virtio-mem: Migrate immutable properties early David Hildenbrand
2023-02-02 11:54 ` Juan Quintela
2023-01-17 11:22 ` [PATCH v5 8/8] virtio-mem: Proper support for preallocation with migration David Hildenbrand
2023-02-02 11:56 ` Juan Quintela [this message]
2023-01-17 15:40 ` [PATCH v5 0/8] virtio-mem: Handle " Peter Xu
2023-01-23 14:27 ` David Hildenbrand
2023-02-02 11:04 ` Juan Quintela
2023-02-02 12:58 ` David Hildenbrand
2023-02-02 11:11 ` Michael S. Tsirkin
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=87cz6snuw5.fsf@secure.mitica \
--to=quintela@redhat.com \
--cc=david@redhat.com \
--cc=dgilbert@redhat.com \
--cc=jinqi@redhat.com \
--cc=mprivozn@redhat.com \
--cc=mst@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
/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.