> From: Zeng, Xin <xin.zeng@xxxxxxxxx> > Sent: Wednesday, February 28, 2024 10:34 PM > + > +static long qat_vf_precopy_ioctl(struct file *filp, unsigned int cmd, > + unsigned long arg) > +{ > + struct qat_vf_migration_file *migf = filp->private_data; > + struct qat_vf_core_device *qat_vdev = migf->qat_vdev; > + struct qat_mig_dev *mig_dev = qat_vdev->mdev; > + struct vfio_precopy_info info; > + loff_t *pos = &filp->f_pos; > + unsigned long minsz; > + int ret = 0; > + > + if (cmd != VFIO_MIG_GET_PRECOPY_INFO) > + return -ENOTTY; > + > + minsz = offsetofend(struct vfio_precopy_info, dirty_bytes); > + > + if (copy_from_user(&info, (void __user *)arg, minsz)) > + return -EFAULT; > + if (info.argsz < minsz) > + return -EINVAL; > + > + mutex_lock(&qat_vdev->state_mutex); > + if (qat_vdev->mig_state != VFIO_DEVICE_STATE_PRE_COPY) { > + mutex_unlock(&qat_vdev->state_mutex); > + return -EINVAL; > + } what about PRE_COPY_P2P? > +static struct qat_vf_migration_file * > +qat_vf_save_device_data(struct qat_vf_core_device *qat_vdev, bool > pre_copy) > +{ > + struct qat_vf_migration_file *migf; > + int ret; > + > + migf = kzalloc(sizeof(*migf), GFP_KERNEL); > + if (!migf) > + return ERR_PTR(-ENOMEM); > + > + migf->filp = anon_inode_getfile("qat_vf_mig", &qat_vf_save_fops, > + migf, O_RDONLY); > + ret = PTR_ERR_OR_ZERO(migf->filp); > + if (ret) { > + kfree(migf); > + return ERR_PTR(ret); > + } > + > + stream_open(migf->filp->f_inode, migf->filp); > + mutex_init(&migf->lock); > + > + if (pre_copy) > + ret = qat_vf_save_setup(qat_vdev, migf); > + else > + ret = qat_vf_save_state(qat_vdev, migf); > + if (ret) { > + fput(migf->filp); > + return ERR_PTR(ret); > + } lack of kfree(migf). Using goto can avoid such typo in error unwind. > + > +static struct file *qat_vf_pci_step_device_state(struct qat_vf_core_device > *qat_vdev, u32 new) > +{ > + u32 cur = qat_vdev->mig_state; > + int ret; > + > + if ((cur == VFIO_DEVICE_STATE_RUNNING && new == > VFIO_DEVICE_STATE_RUNNING_P2P) || > + (cur == VFIO_DEVICE_STATE_PRE_COPY && new == > VFIO_DEVICE_STATE_PRE_COPY_P2P)) { > + ret = qat_vfmig_suspend(qat_vdev->mdev); > + if (ret) > + return ERR_PTR(ret); > + return NULL; > + } could you arrange the transitions in pair as mlx does e.g. following above is the reverse one calling qat_vfmig_resume()? > + > +MODULE_LICENSE("GPL"); > +MODULE_AUTHOR("Intel Corporation"); please use your name as the author.