mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 05:41:55 +00:00
powerpc/mobility: wait for memory transfer to complete
In pseries_migration_partition(), loop until the memory transfer is complete. This way the calling drmgr process will not exit earlier, allowing callbacks to be run only once the migration is fully completed. If reading the VASI state is done after the hypervisor has completed the migration, the HCALL is returning H_PARAMETER. We can safely assume that the memory transfer is achieved if this happens. This will also allow to manage the NMI watchdog state in the next commits. Signed-off-by: Laurent Dufour <ldufour@linux.ibm.com> Reviewed-by: Nathan Lynch <nathanl@linux.ibm.com> Reviewed-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20220713154729.80789-2-ldufour@linux.ibm.com
This commit is contained in:
parent
6c9c7d8fbc
commit
882c0d1704
@ -427,6 +427,43 @@ static int wait_for_vasi_session_suspending(u64 handle)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void wait_for_vasi_session_completed(u64 handle)
|
||||
{
|
||||
unsigned long state = 0;
|
||||
int ret;
|
||||
|
||||
pr_info("waiting for memory transfer to complete...\n");
|
||||
|
||||
/*
|
||||
* Wait for transition from H_VASI_RESUMED to H_VASI_COMPLETED.
|
||||
*/
|
||||
while (true) {
|
||||
ret = poll_vasi_state(handle, &state);
|
||||
|
||||
/*
|
||||
* If the memory transfer is already complete and the migration
|
||||
* has been cleaned up by the hypervisor, H_PARAMETER is return,
|
||||
* which is translate in EINVAL by poll_vasi_state().
|
||||
*/
|
||||
if (ret == -EINVAL || (!ret && state == H_VASI_COMPLETED)) {
|
||||
pr_info("memory transfer completed.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
pr_err("H_VASI_STATE return error (%d)\n", ret);
|
||||
break;
|
||||
}
|
||||
|
||||
if (state != H_VASI_RESUMED) {
|
||||
pr_err("unexpected H_VASI_STATE result %lu\n", state);
|
||||
break;
|
||||
}
|
||||
|
||||
msleep(500);
|
||||
}
|
||||
}
|
||||
|
||||
static void prod_single(unsigned int target_cpu)
|
||||
{
|
||||
long hvrc;
|
||||
@ -673,9 +710,16 @@ static int pseries_migrate_partition(u64 handle)
|
||||
vas_migration_handler(VAS_SUSPEND);
|
||||
|
||||
ret = pseries_suspend(handle);
|
||||
if (ret == 0)
|
||||
if (ret == 0) {
|
||||
post_mobility_fixup();
|
||||
else
|
||||
/*
|
||||
* Wait until the memory transfer is complete, so that the user
|
||||
* space process returns from the syscall after the transfer is
|
||||
* complete. This allows the user hooks to be executed at the
|
||||
* right time.
|
||||
*/
|
||||
wait_for_vasi_session_completed(handle);
|
||||
} else
|
||||
pseries_cancel_migration(handle, ret);
|
||||
|
||||
vas_migration_handler(VAS_RESUME);
|
||||
|
Loading…
Reference in New Issue
Block a user