mem + migration pull for 10.2
- Fabiano's patch to fix snapshot crash by rejecting some caps - Marco's mapped-ram support on snapshot save/load - Steve's cpr maintainers entry update on retirement - Peter's coverity fixes - Chenyi's tdx fix on hugetlbfs regression - Peter's doc update on migrate resume flag - Peter's doc update on HMP set parameter for cpr-exec-command's char** parsing - Xiaoyao's guest-memfd fix for enabling shmem - Arun's fix on error_fatal regression for migration errors - Bin's fix on redundant error free for add block failures - Markus's cleanup around MigMode sets - Peter's two patches (out of loadvm threadify) to cleanup qio read peek process - Thomas's vmstate-static-checker update for possible deprecation of argparse use - Stefan's fix on windows deadlock by making unassigned MMIOs lockless -----BEGIN PGP SIGNATURE----- iIgEABYKADAWIQS5GE3CDMRX2s990ak7X8zN86vXBgUCaQkZPBIccGV0ZXJ4QHJl ZGhhdC5jb20ACgkQO1/MzfOr1wZhTgEA8eCBMpM7PusNSdzzeIygKnIp2A8I70ca eIJz3ZM+FiUBAPVDrIZ59EhZA6NPcJb8Ya9OY4lT63F4BxrvN+f+uG4N =GUBi -----END PGP SIGNATURE----- Merge tag 'staging-pull-request' of https://gitlab.com/peterx/qemu into staging mem + migration pull for 10.2 - Fabiano's patch to fix snapshot crash by rejecting some caps - Marco's mapped-ram support on snapshot save/load - Steve's cpr maintainers entry update on retirement - Peter's coverity fixes - Chenyi's tdx fix on hugetlbfs regression - Peter's doc update on migrate resume flag - Peter's doc update on HMP set parameter for cpr-exec-command's char** parsing - Xiaoyao's guest-memfd fix for enabling shmem - Arun's fix on error_fatal regression for migration errors - Bin's fix on redundant error free for add block failures - Markus's cleanup around MigMode sets - Peter's two patches (out of loadvm threadify) to cleanup qio read peek process - Thomas's vmstate-static-checker update for possible deprecation of argparse use - Stefan's fix on windows deadlock by making unassigned MMIOs lockless # -----BEGIN PGP SIGNATURE----- # # iIgEABYKADAWIQS5GE3CDMRX2s990ak7X8zN86vXBgUCaQkZPBIccGV0ZXJ4QHJl # ZGhhdC5jb20ACgkQO1/MzfOr1wZhTgEA8eCBMpM7PusNSdzzeIygKnIp2A8I70ca # eIJz3ZM+FiUBAPVDrIZ59EhZA6NPcJb8Ya9OY4lT63F4BxrvN+f+uG4N # =GUBi # -----END PGP SIGNATURE----- # gpg: Signature made Mon 03 Nov 2025 10:06:04 PM CET # gpg: using EDDSA key B9184DC20CC457DACF7DD1A93B5FCCCDF3ABD706 # gpg: issuer "peterx@redhat.com" # gpg: Good signature from "Peter Xu <xzpeter@gmail.com>" [unknown] # gpg: aka "Peter Xu <peterx@redhat.com>" [unknown] # gpg: WARNING: The key's User ID is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: B918 4DC2 0CC4 57DA CF7D D1A9 3B5F CCCD F3AB D706 * tag 'staging-pull-request' of https://gitlab.com/peterx/qemu: (36 commits) migration: Introduce POSTCOPY_DEVICE state migration: Make postcopy listen thread joinable migration: Respect exit-on-error when migration fails before resuming migration: Refactor all incoming cleanup info migration_incoming_destroy() migration: Introduce postcopy incoming setup and cleanup functions migration: Move postcopy_ram_listen_thread() to postcopy-ram.c migration: Do not try to start VM if disk activation fails migration: Flush migration channel after sending data of CMD_PACKAGED system/physmem: mark io_mem_unassigned lockless scripts/vmstate-static-checker: Fix deprecation warnings with latest argparse migration: vmsd errp handlers: return bool migration/vmstate: stop reporting error number for new _errp APIs tmp_emulator: improve and fix use of errp migration: vmstate_save_state_v(): fix error path migration: Properly wait on G_IO_IN when peeking messages io: Add qio_channel_wait_cond() helper migration: Put Error **errp parameter last migration: Use bitset of MigMode instead of variable arguments migration: Use unsigned instead of int for bit set of MigMode migration: Don't free the reason after calling migrate_add_blocker ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
abe80c8ae2
49 changed files with 684 additions and 380 deletions
|
|
@ -2255,8 +2255,8 @@ static void ram_block_add(RAMBlock *new_block, Error **errp)
|
|||
"Memory region %s uses guest_memfd, "
|
||||
"which is not supported with CPR.",
|
||||
memory_region_name(new_block->mr));
|
||||
migrate_add_blocker_modes(&new_block->cpr_blocker, errp,
|
||||
MIG_MODE_CPR_TRANSFER, -1);
|
||||
migrate_add_blocker_modes(&new_block->cpr_blocker,
|
||||
BIT(MIG_MODE_CPR_TRANSFER), errp);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3011,6 +3011,9 @@ static void io_mem_init(void)
|
|||
{
|
||||
memory_region_init_io(&io_mem_unassigned, NULL, &unassigned_mem_ops, NULL,
|
||||
NULL, UINT64_MAX);
|
||||
|
||||
/* Trivially thread-safe since memory accesses are rejected */
|
||||
memory_region_enable_lockless_io(&io_mem_unassigned);
|
||||
}
|
||||
|
||||
AddressSpaceDispatch *address_space_dispatch_new(FlatView *fv)
|
||||
|
|
@ -4462,8 +4465,8 @@ void ram_block_add_cpr_blocker(RAMBlock *rb, Error **errp)
|
|||
"Memory region %s is not compatible with CPR. share=on is "
|
||||
"required for memory-backend objects, and aux-ram-share=on is "
|
||||
"required.", memory_region_name(rb->mr));
|
||||
migrate_add_blocker_modes(&rb->cpr_blocker, errp, MIG_MODE_CPR_TRANSFER,
|
||||
-1);
|
||||
migrate_add_blocker_modes(&rb->cpr_blocker, BIT(MIG_MODE_CPR_TRANSFER),
|
||||
errp);
|
||||
}
|
||||
|
||||
void ram_block_del_cpr_blocker(RAMBlock *rb)
|
||||
|
|
|
|||
|
|
@ -22,16 +22,14 @@ OBJECT_DEFINE_SIMPLE_TYPE_WITH_INTERFACES(RamBlockAttributes,
|
|||
{ })
|
||||
|
||||
static size_t
|
||||
ram_block_attributes_get_block_size(const RamBlockAttributes *attr)
|
||||
ram_block_attributes_get_block_size(void)
|
||||
{
|
||||
/*
|
||||
* Because page conversion could be manipulated in the size of at least 4K
|
||||
* or 4K aligned, Use the host page size as the granularity to track the
|
||||
* memory attribute.
|
||||
*/
|
||||
g_assert(attr && attr->ram_block);
|
||||
g_assert(attr->ram_block->page_size == qemu_real_host_page_size());
|
||||
return attr->ram_block->page_size;
|
||||
return qemu_real_host_page_size();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -40,7 +38,7 @@ ram_block_attributes_rdm_is_populated(const RamDiscardManager *rdm,
|
|||
const MemoryRegionSection *section)
|
||||
{
|
||||
const RamBlockAttributes *attr = RAM_BLOCK_ATTRIBUTES(rdm);
|
||||
const size_t block_size = ram_block_attributes_get_block_size(attr);
|
||||
const size_t block_size = ram_block_attributes_get_block_size();
|
||||
const uint64_t first_bit = section->offset_within_region / block_size;
|
||||
const uint64_t last_bit =
|
||||
first_bit + int128_get64(section->size) / block_size - 1;
|
||||
|
|
@ -81,7 +79,7 @@ ram_block_attributes_for_each_populated_section(const RamBlockAttributes *attr,
|
|||
{
|
||||
unsigned long first_bit, last_bit;
|
||||
uint64_t offset, size;
|
||||
const size_t block_size = ram_block_attributes_get_block_size(attr);
|
||||
const size_t block_size = ram_block_attributes_get_block_size();
|
||||
int ret = 0;
|
||||
|
||||
first_bit = section->offset_within_region / block_size;
|
||||
|
|
@ -122,7 +120,7 @@ ram_block_attributes_for_each_discarded_section(const RamBlockAttributes *attr,
|
|||
{
|
||||
unsigned long first_bit, last_bit;
|
||||
uint64_t offset, size;
|
||||
const size_t block_size = ram_block_attributes_get_block_size(attr);
|
||||
const size_t block_size = ram_block_attributes_get_block_size();
|
||||
int ret = 0;
|
||||
|
||||
first_bit = section->offset_within_region / block_size;
|
||||
|
|
@ -163,7 +161,7 @@ ram_block_attributes_rdm_get_min_granularity(const RamDiscardManager *rdm,
|
|||
const RamBlockAttributes *attr = RAM_BLOCK_ATTRIBUTES(rdm);
|
||||
|
||||
g_assert(mr == attr->ram_block->mr);
|
||||
return ram_block_attributes_get_block_size(attr);
|
||||
return ram_block_attributes_get_block_size();
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -265,7 +263,7 @@ ram_block_attributes_is_valid_range(RamBlockAttributes *attr, uint64_t offset,
|
|||
g_assert(mr);
|
||||
|
||||
uint64_t region_size = memory_region_size(mr);
|
||||
const size_t block_size = ram_block_attributes_get_block_size(attr);
|
||||
const size_t block_size = ram_block_attributes_get_block_size();
|
||||
|
||||
if (!QEMU_IS_ALIGNED(offset, block_size) ||
|
||||
!QEMU_IS_ALIGNED(size, block_size)) {
|
||||
|
|
@ -322,7 +320,7 @@ int ram_block_attributes_state_change(RamBlockAttributes *attr,
|
|||
uint64_t offset, uint64_t size,
|
||||
bool to_discard)
|
||||
{
|
||||
const size_t block_size = ram_block_attributes_get_block_size(attr);
|
||||
const size_t block_size = ram_block_attributes_get_block_size();
|
||||
const unsigned long first_bit = offset / block_size;
|
||||
const unsigned long nbits = size / block_size;
|
||||
const unsigned long last_bit = first_bit + nbits - 1;
|
||||
|
|
@ -392,7 +390,7 @@ int ram_block_attributes_state_change(RamBlockAttributes *attr,
|
|||
|
||||
RamBlockAttributes *ram_block_attributes_create(RAMBlock *ram_block)
|
||||
{
|
||||
const int block_size = qemu_real_host_page_size();
|
||||
const int block_size = ram_block_attributes_get_block_size();
|
||||
RamBlockAttributes *attr;
|
||||
MemoryRegion *mr = ram_block->mr;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue