]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
hisi_acc_vfio_pci: create subfunction for data reading
authorLongfang Liu <liulongfang@huawei.com>
Tue, 12 Nov 2024 07:33:20 +0000 (15:33 +0800)
committerAlex Williamson <alex.williamson@redhat.com>
Tue, 12 Nov 2024 21:23:10 +0000 (14:23 -0700)
This patch generates the code for the operation of reading data from
the device into a sub-function.
Then, it can be called during the device status data saving phase of
the live migration process and the device status data reading function
in debugfs.
Thereby reducing the redundant code of the driver.

Signed-off-by: Longfang Liu <liulongfang@huawei.com>
Reviewed-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Link: https://lore.kernel.org/r/20241112073322.54550-3-liulongfang@huawei.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c

index 299766a33e014eef0b9286deb5da29f680969e08..c4a74e38c78aeec12fcbac1602d68d6da6046be9 100644 (file)
@@ -486,31 +486,11 @@ static int vf_qm_load_data(struct hisi_acc_vf_core_device *hisi_acc_vdev,
        return 0;
 }
 
-static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev,
-                           struct hisi_acc_vf_migration_file *migf)
+static int vf_qm_read_data(struct hisi_qm *vf_qm, struct acc_vf_data *vf_data)
 {
-       struct acc_vf_data *vf_data = &migf->vf_data;
-       struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
        struct device *dev = &vf_qm->pdev->dev;
        int 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;
-               hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state;
-               migf->total_length = QM_MATCH_SIZE;
-               return 0;
-       }
-
-       vf_data->vf_qm_state = QM_READY;
-       hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state;
-
-       ret = vf_qm_cache_wb(vf_qm);
-       if (ret) {
-               dev_err(dev, "failed to writeback QM Cache!\n");
-               return ret;
-       }
-
        ret = qm_get_regs(vf_qm, vf_data);
        if (ret)
                return -EINVAL;
@@ -536,6 +516,38 @@ static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev,
                return -EINVAL;
        }
 
+       return 0;
+}
+
+static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev,
+                           struct hisi_acc_vf_migration_file *migf)
+{
+       struct acc_vf_data *vf_data = &migf->vf_data;
+       struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
+       struct device *dev = &vf_qm->pdev->dev;
+       int 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;
+               hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state;
+               migf->total_length = QM_MATCH_SIZE;
+               return 0;
+       }
+
+       vf_data->vf_qm_state = QM_READY;
+       hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state;
+
+       ret = vf_qm_cache_wb(vf_qm);
+       if (ret) {
+               dev_err(dev, "failed to writeback QM Cache!\n");
+               return ret;
+       }
+
+       ret = vf_qm_read_data(vf_qm, vf_data);
+       if (ret)
+               return -EINVAL;
+
        migf->total_length = sizeof(struct acc_vf_data);
        return 0;
 }