u32 que_iso_state;
        int ret;
 
-       if (migf->total_length < QM_MATCH_SIZE)
-               return -EINVAL;
+       if (migf->total_length < QM_MATCH_SIZE || hisi_acc_vdev->match_done)
+               return 0;
 
        if (vf_data->acc_magic != ACC_DEV_MAGIC) {
                dev_err(dev, "failed to match ACC_DEV_MAGIC\n");
        }
 
        hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state;
+       hisi_acc_vdev->match_done = true;
        return 0;
 }
 
        struct device *dev = &vf_qm->pdev->dev;
        int ret;
 
-       ret = vf_qm_get_match_data(hisi_acc_vdev, vf_data);
-       if (ret)
-               return ret;
-
        if (unlikely(qm_wait_dev_not_ready(vf_qm))) {
                /* Update state and return with match data */
                vf_data->vf_qm_state = QM_NOT_READY;
        struct hisi_acc_vf_migration_file *migf = hisi_acc_vdev->resuming_migf;
        int ret;
 
-       /* Check dev compatibility */
-       ret = vf_qm_check_match(hisi_acc_vdev, migf);
-       if (ret) {
-               dev_err(dev, "failed to match the VF!\n");
-               return ret;
-       }
        /* Recover data to VF */
        ret = vf_qm_load_data(hisi_acc_vdev, migf);
        if (ret) {
        *pos += len;
        done = len;
        migf->total_length += len;
+
+       ret = vf_qm_check_match(migf->hisi_acc_vdev, migf);
+       if (ret)
+               done = -EFAULT;
 out_unlock:
        mutex_unlock(&migf->lock);
        return done;