vfio_df_iommufd_unbind(df);
else
vfio_device_group_unuse_iommu(device);
+ device->precopy_info_v2 = 0;
module_put(device->dev->driver->owner);
}
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)
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;
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 */