]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
hisi_acc_vfio_pci: bugfix cache write-back issue
authorLongfang Liu <liulongfang@huawei.com>
Sat, 10 May 2025 08:11:52 +0000 (16:11 +0800)
committerAlex Williamson <alex.williamson@redhat.com>
Mon, 19 May 2025 18:41:31 +0000 (12:41 -0600)
At present, cache write-back is placed in the device data
copy stage after stopping the device operation.
Writing back to the cache at this stage will cause the data
obtained by the cache to be written back to be empty.

In order to ensure that the cache data is written back
successfully, the data needs to be written back into the
stop device stage.

Fixes: b0eed085903e ("hisi_acc_vfio_pci: Add support for VFIO live migration")
Signed-off-by: Longfang Liu <liulongfang@huawei.com>
Reviewed-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Link: https://lore.kernel.org/r/20250510081155.55840-4-liulongfang@huawei.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c

index 80217aea54755bb2d85022134bf8f5283e52e33a..d96446f499ed01370f088f365cae1e4e3d593c69 100644 (file)
@@ -566,7 +566,6 @@ static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev,
 {
        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))) {
@@ -580,12 +579,6 @@ static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev,
        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;
@@ -1012,6 +1005,13 @@ static int hisi_acc_vf_stop_device(struct hisi_acc_vf_core_device *hisi_acc_vdev
                dev_err(dev, "failed to check QM INT state!\n");
                return ret;
        }
+
+       ret = vf_qm_cache_wb(vf_qm);
+       if (ret) {
+               dev_err(dev, "failed to writeback QM cache!\n");
+               return ret;
+       }
+
        return 0;
 }