migration/postcopy: Initialize blocktime context only until listen
Before this patch, the blocktime context can be created very early, because postcopy_ram_supported_by_host() <- migrate_caps_check() can happen during migration object init. The trick here is the blocktime context needs system vCPU information, which seems to be possible to change after that point. I didn't verify it, but it doesn't sound right. Now move it out and initialize the context only when postcopy listen starts. That is already during a migration so it should be guaranteed the vCPU topology can never change on both sides. While at it, assert that the ctx isn't created instead this time; the old "if" trick isn't needed when we're sure it will only happen once now. Reviewed-by: Fabiano Rosas <farosas@suse.de> Link: https://lore.kernel.org/r/20250613141217.474825-10-peterx@redhat.com Signed-off-by: Peter Xu <peterx@redhat.com> Signed-off-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
parent
b4c82b4288
commit
f07f2a3092
1 changed files with 10 additions and 5 deletions
|
|
@ -325,13 +325,13 @@ static bool ufd_check_and_apply(int ufd, MigrationIncomingState *mis,
|
|||
}
|
||||
|
||||
#ifdef UFFD_FEATURE_THREAD_ID
|
||||
/*
|
||||
* Postcopy blocktime conditionally needs THREAD_ID feature (introduced
|
||||
* to Linux in 2017). Always try to enable it when QEMU is compiled
|
||||
* with such environment.
|
||||
*/
|
||||
if (UFFD_FEATURE_THREAD_ID & supported_features) {
|
||||
asked_features |= UFFD_FEATURE_THREAD_ID;
|
||||
if (migrate_postcopy_blocktime()) {
|
||||
if (!mis->blocktime_ctx) {
|
||||
mis->blocktime_ctx = blocktime_context_new();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -1239,6 +1239,11 @@ int postcopy_ram_incoming_setup(MigrationIncomingState *mis)
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (migrate_postcopy_blocktime()) {
|
||||
assert(mis->blocktime_ctx == NULL);
|
||||
mis->blocktime_ctx = blocktime_context_new();
|
||||
}
|
||||
|
||||
/* Now an eventfd we use to tell the fault-thread to quit */
|
||||
mis->userfault_event_fd = eventfd(0, EFD_CLOEXEC);
|
||||
if (mis->userfault_event_fd == -1) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue