diff options
| -rw-r--r-- | drivers/vfio/vfio_main.c | 21 | ||||
| -rw-r--r-- | include/linux/vfio.h | 1 |
2 files changed, 22 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; diff --git a/include/linux/vfio.h b/include/linux/vfio.h index e90859956514..7c1d33283e04 100644 --- a/include/linux/vfio.h +++ b/include/linux/vfio.h @@ -52,6 +52,7 @@ struct vfio_device { struct vfio_device_set *dev_set; struct list_head dev_set_list; unsigned int migration_flags; + u8 precopy_info_v2; struct kvm *kvm; /* Members below here are private, not for driver use */ |
