On 3/6/24 14:34, Cédric Le Goater wrote:
> This will prepare ground for future changes adding an Error** argument
> to the save_setup() handler. We need to make sure that on failure,
> vfio_save_setup() always sets a new error.
>
> Reviewed-by: Fabiano Rosas <faro...@suse.de>
> Signed-off-by: Cédric Le Goater <c...@redhat.com>
Reviewed-by: Eric Auger <eric.au...@redhat.com>
Eric
> ---
>
> Changes in v4:
>
> - Fixed state name printed out in error returned by vfio_save_setup()
> - Fixed test on error returned by qemu_file_get_error()
>
> hw/vfio/migration.c | 15 ++++++++++++---
> 1 file changed, 12 insertions(+), 3 deletions(-)
>
> diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c
> index
> 2050ac8897231ff89cc223f0570d5c7a65dede9e..330b3a28548e32b0b3268072895bb5e4875766a2
> 100644
> --- a/hw/vfio/migration.c
> +++ b/hw/vfio/migration.c
> @@ -383,6 +383,7 @@ static int vfio_save_setup(QEMUFile *f, void *opaque)
> VFIODevice *vbasedev = opaque;
> VFIOMigration *migration = vbasedev->migration;
> uint64_t stop_copy_size = VFIO_MIG_DEFAULT_DATA_BUFFER_SIZE;
> + int ret;
>
> qemu_put_be64(f, VFIO_MIG_FLAG_DEV_SETUP_STATE);
>
> @@ -397,13 +398,13 @@ static int vfio_save_setup(QEMUFile *f, void *opaque)
> }
>
> if (vfio_precopy_supported(vbasedev)) {
> - int ret;
> -
> switch (migration->device_state) {
> case VFIO_DEVICE_STATE_RUNNING:
> ret = vfio_migration_set_state(vbasedev,
> VFIO_DEVICE_STATE_PRE_COPY,
> VFIO_DEVICE_STATE_RUNNING);
> if (ret) {
> + error_report("%s: Failed to set new PRE_COPY state",
> + vbasedev->name);
> return ret;
> }
>
> @@ -414,6 +415,8 @@ static int vfio_save_setup(QEMUFile *f, void *opaque)
> /* vfio_save_complete_precopy() will go to STOP_COPY */
> break;
> default:
> + error_report("%s: Invalid device state %d", vbasedev->name,
> + migration->device_state);
> return -EINVAL;
> }
> }
> @@ -422,7 +425,13 @@ static int vfio_save_setup(QEMUFile *f, void *opaque)
>
> qemu_put_be64(f, VFIO_MIG_FLAG_END_OF_STATE);
>
> - return qemu_file_get_error(f);
> + ret = qemu_file_get_error(f);
> + if (ret < 0) {
> + error_report("%s: save setup failed : %s", vbasedev->name,
> + strerror(-ret));
> + }
> +
> + return ret;
> }
>
> static void vfio_save_cleanup(void *opaque)