mirror of https://gitlab.com/qemu-project/qemu
vfio: Add Error** argument to vfio_devices_dma_logging_start()
This allows to update the Error argument of the VFIO log_global_start() handler. Errors for container based logging will also be propagated to qemu_savevm_state_setup() when the ram save_setup() handler is executed. Also, errors from vfio_container_set_dirty_page_tracking() are now collected and reported. The vfio_set_migration_error() call becomes redundant in vfio_listener_log_global_start(). Remove it. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Avihai Horon <avihaih@nvidia.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
parent
836bb30868
commit
0f21358f33
|
@ -1027,7 +1027,8 @@ static void vfio_device_feature_dma_logging_start_destroy(
|
||||||
g_free(feature);
|
g_free(feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vfio_devices_dma_logging_start(VFIOContainerBase *bcontainer)
|
static int vfio_devices_dma_logging_start(VFIOContainerBase *bcontainer,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
struct vfio_device_feature *feature;
|
struct vfio_device_feature *feature;
|
||||||
VFIODirtyRanges ranges;
|
VFIODirtyRanges ranges;
|
||||||
|
@ -1038,6 +1039,7 @@ static int vfio_devices_dma_logging_start(VFIOContainerBase *bcontainer)
|
||||||
feature = vfio_device_feature_dma_logging_start_create(bcontainer,
|
feature = vfio_device_feature_dma_logging_start_create(bcontainer,
|
||||||
&ranges);
|
&ranges);
|
||||||
if (!feature) {
|
if (!feature) {
|
||||||
|
error_setg_errno(errp, errno, "Failed to prepare DMA logging");
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1049,8 +1051,8 @@ static int vfio_devices_dma_logging_start(VFIOContainerBase *bcontainer)
|
||||||
ret = ioctl(vbasedev->fd, VFIO_DEVICE_FEATURE, feature);
|
ret = ioctl(vbasedev->fd, VFIO_DEVICE_FEATURE, feature);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ret = -errno;
|
ret = -errno;
|
||||||
error_report("%s: Failed to start DMA logging, err %d (%s)",
|
error_setg_errno(errp, errno, "%s: Failed to start DMA logging",
|
||||||
vbasedev->name, ret, strerror(errno));
|
vbasedev->name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
vbasedev->dirty_tracking = true;
|
vbasedev->dirty_tracking = true;
|
||||||
|
@ -1069,20 +1071,19 @@ out:
|
||||||
static bool vfio_listener_log_global_start(MemoryListener *listener,
|
static bool vfio_listener_log_global_start(MemoryListener *listener,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
|
ERRP_GUARD();
|
||||||
VFIOContainerBase *bcontainer = container_of(listener, VFIOContainerBase,
|
VFIOContainerBase *bcontainer = container_of(listener, VFIOContainerBase,
|
||||||
listener);
|
listener);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (vfio_devices_all_device_dirty_tracking(bcontainer)) {
|
if (vfio_devices_all_device_dirty_tracking(bcontainer)) {
|
||||||
ret = vfio_devices_dma_logging_start(bcontainer);
|
ret = vfio_devices_dma_logging_start(bcontainer, errp);
|
||||||
} else {
|
} else {
|
||||||
ret = vfio_container_set_dirty_page_tracking(bcontainer, true, NULL);
|
ret = vfio_container_set_dirty_page_tracking(bcontainer, true, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
error_report("vfio: Could not start dirty page tracking, err: %d (%s)",
|
error_prepend(errp, "vfio: Could not start dirty page tracking - ");
|
||||||
ret, strerror(-ret));
|
|
||||||
vfio_set_migration_error(ret);
|
|
||||||
}
|
}
|
||||||
return !ret;
|
return !ret;
|
||||||
}
|
}
|
||||||
|
@ -1091,17 +1092,20 @@ static void vfio_listener_log_global_stop(MemoryListener *listener)
|
||||||
{
|
{
|
||||||
VFIOContainerBase *bcontainer = container_of(listener, VFIOContainerBase,
|
VFIOContainerBase *bcontainer = container_of(listener, VFIOContainerBase,
|
||||||
listener);
|
listener);
|
||||||
|
Error *local_err = NULL;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (vfio_devices_all_device_dirty_tracking(bcontainer)) {
|
if (vfio_devices_all_device_dirty_tracking(bcontainer)) {
|
||||||
vfio_devices_dma_logging_stop(bcontainer);
|
vfio_devices_dma_logging_stop(bcontainer);
|
||||||
} else {
|
} else {
|
||||||
ret = vfio_container_set_dirty_page_tracking(bcontainer, false, NULL);
|
ret = vfio_container_set_dirty_page_tracking(bcontainer, false,
|
||||||
|
&local_err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
error_report("vfio: Could not stop dirty page tracking, err: %d (%s)",
|
error_prepend(&local_err,
|
||||||
ret, strerror(-ret));
|
"vfio: Could not stop dirty page tracking - ");
|
||||||
|
error_report_err(local_err);
|
||||||
vfio_set_migration_error(ret);
|
vfio_set_migration_error(ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue