0cb51c183a
Allow cpr-reboot for vfio if the guest is in the suspended runstate. The guest drivers' suspend methods flush outstanding requests and re-initialize the devices, and thus there is no device state to save and restore. The user is responsible for suspending the guest before initiating cpr, such as by issuing guest-suspend-ram to the qemu guest agent. Relax the vfio blocker so it does not apply to cpr, and add a notifier that verifies the guest is suspended. Signed-off-by: Steve Sistare <steven.sistare@oracle.com> Reviewed-by: Cédric Le Goater <clg@redhat.com>
40 lines
1.1 KiB
C
40 lines
1.1 KiB
C
/*
|
|
* Copyright (c) 2021-2024 Oracle and/or its affiliates.
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*/
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "hw/vfio/vfio-common.h"
|
|
#include "migration/misc.h"
|
|
#include "qapi/error.h"
|
|
#include "sysemu/runstate.h"
|
|
|
|
static int vfio_cpr_reboot_notifier(NotifierWithReturn *notifier,
|
|
MigrationEvent *e, Error **errp)
|
|
{
|
|
if (e->type == MIG_EVENT_PRECOPY_SETUP &&
|
|
!runstate_check(RUN_STATE_SUSPENDED) && !vm_get_suspended()) {
|
|
|
|
error_setg(errp,
|
|
"VFIO device only supports cpr-reboot for runstate suspended");
|
|
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int vfio_cpr_register_container(VFIOContainerBase *bcontainer, Error **errp)
|
|
{
|
|
migration_add_notifier_mode(&bcontainer->cpr_reboot_notifier,
|
|
vfio_cpr_reboot_notifier,
|
|
MIG_MODE_CPR_REBOOT);
|
|
return 0;
|
|
}
|
|
|
|
void vfio_cpr_unregister_container(VFIOContainerBase *bcontainer)
|
|
{
|
|
migration_remove_notifier(&bcontainer->cpr_reboot_notifier);
|
|
}
|