Disable mlock around incoming postcopy
Userfault doesn't work with mlock; mlock is designed to nail down pages so they don't move, userfault is designed to tell you when they're not there. munlock the pages we userfault protect before postcopy. mlock everything again at the end if mlock is enabled. Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Amit Shah <amit.shah@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
e9bef235d9
commit
58b7c17e22
@ -172,6 +172,7 @@ extern int boot_menu;
|
|||||||
extern bool boot_strict;
|
extern bool boot_strict;
|
||||||
extern uint8_t *boot_splash_filedata;
|
extern uint8_t *boot_splash_filedata;
|
||||||
extern size_t boot_splash_filedata_size;
|
extern size_t boot_splash_filedata_size;
|
||||||
|
extern bool enable_mlock;
|
||||||
extern uint8_t qemu_extra_params_fw[2];
|
extern uint8_t qemu_extra_params_fw[2];
|
||||||
extern QEMUClockType rtc_clock;
|
extern QEMUClockType rtc_clock;
|
||||||
extern const char *mem_path;
|
extern const char *mem_path;
|
||||||
|
@ -87,6 +87,11 @@ static bool ufd_version_check(int ufd)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note: This has the side effect of munlock'ing all of RAM, that's
|
||||||
|
* normally fine since if the postcopy succeeds it gets turned back on at the
|
||||||
|
* end.
|
||||||
|
*/
|
||||||
bool postcopy_ram_supported_by_host(void)
|
bool postcopy_ram_supported_by_host(void)
|
||||||
{
|
{
|
||||||
long pagesize = getpagesize();
|
long pagesize = getpagesize();
|
||||||
@ -114,6 +119,15 @@ bool postcopy_ram_supported_by_host(void)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* userfault and mlock don't go together; we'll put it back later if
|
||||||
|
* it was enabled.
|
||||||
|
*/
|
||||||
|
if (munlockall()) {
|
||||||
|
error_report("%s: munlockall: %s", __func__, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need to check that the ops we need are supported on anon memory
|
* We need to check that the ops we need are supported on anon memory
|
||||||
* To do that we need to register a chunk and see the flags that
|
* To do that we need to register a chunk and see the flags that
|
||||||
@ -294,6 +308,16 @@ int postcopy_ram_incoming_cleanup(MigrationIncomingState *mis)
|
|||||||
mis->have_fault_thread = false;
|
mis->have_fault_thread = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (enable_mlock) {
|
||||||
|
if (os_mlock() < 0) {
|
||||||
|
error_report("mlock: %s", strerror(errno));
|
||||||
|
/*
|
||||||
|
* It doesn't feel right to fail at this point, we have a valid
|
||||||
|
* VM state.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
postcopy_state_set(POSTCOPY_INCOMING_END);
|
postcopy_state_set(POSTCOPY_INCOMING_END);
|
||||||
migrate_send_rp_shut(mis, qemu_file_get_error(mis->from_src_file) != 0);
|
migrate_send_rp_shut(mis, qemu_file_get_error(mis->from_src_file) != 0);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user