diff options
Diffstat (limited to 'drivers/vfio')
| -rw-r--r-- | drivers/vfio/vfio_main.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c index 742477546b15..8666f35fb3f0 100644 --- a/drivers/vfio/vfio_main.c +++ b/drivers/vfio/vfio_main.c @@ -553,6 +553,7 @@ static void vfio_df_device_last_close(struct vfio_device_file *df) vfio_df_iommufd_unbind(df); else vfio_device_group_unuse_iommu(device); + device->precopy_info_v2 = 0; module_put(device->dev->driver->owner); } @@ -964,6 +965,23 @@ vfio_ioctl_device_feature_migration_data_size(struct vfio_device *device, return 0; } +static int +vfio_ioctl_device_feature_migration_precopy_info_v2(struct vfio_device *device, + u32 flags, size_t argsz) +{ + int ret; + + if (!(device->migration_flags & VFIO_MIGRATION_PRE_COPY)) + return -EINVAL; + + ret = vfio_check_feature(flags, argsz, VFIO_DEVICE_FEATURE_SET, 0); + if (ret != 1) + return ret; + + device->precopy_info_v2 = 1; + return 0; +} + static int vfio_ioctl_device_feature_migration(struct vfio_device *device, u32 flags, void __user *arg, size_t argsz) @@ -1251,6 +1269,9 @@ static int vfio_ioctl_device_feature(struct vfio_device *device, return vfio_ioctl_device_feature_migration_data_size( device, feature.flags, arg->data, feature.argsz - minsz); + case VFIO_DEVICE_FEATURE_MIG_PRECOPY_INFOv2: + return vfio_ioctl_device_feature_migration_precopy_info_v2( + device, feature.flags, feature.argsz - minsz); default: if (unlikely(!device->ops->device_feature)) return -ENOTTY; |
