
driver inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/ICX1ZY CVE: NA ---------------------------------------------------------------------- The current live migration function will cause RAS problems in direct migration without loading the accelerator driver in the VM. The reason is that the loading status of the driver in the VM is not read in pre_copy. Instead, read it in stop_copy. This results in the migrating end being unable to obtain this status value, and thus the live migration recovery operation will still be performed. This error occurs because the source side skips migration and no data is migrated over. Therefore, this status value needs to be read in the pre_copy stage. Fixes: ee3a5b2359e0 ("hisi_acc_vfio_pci: add new vfio_pci driver for HiSilicon ACC devices") Signed-off-by: Longfang Liu <liulongfang@huawei.com> Signed-off-by: JiangShui Yang <yangjiangshui@h-partners.com> --- drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c index 0030ab31ef15..bee6c9d46362 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c @@ -439,6 +439,7 @@ static int vf_qm_get_match_data(struct hisi_acc_vf_core_device *hisi_acc_vdev, struct acc_vf_data *vf_data) { struct hisi_qm *pf_qm = hisi_acc_vdev->pf_qm; + struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm; struct device *dev = &pf_qm->pdev->dev; int vf_id = hisi_acc_vdev->vf_id; int ret; @@ -465,6 +466,13 @@ static int vf_qm_get_match_data(struct hisi_acc_vf_core_device *hisi_acc_vdev, return ret; } + /* Get VF driver insmod state */ + ret = qm_read_regs(vf_qm, QM_VF_STATE, &vf_data->vf_qm_state, 1); + if (ret) { + dev_err(dev, "failed to read QM_VF_STATE!\n"); + return ret; + } + return 0; } @@ -748,6 +756,9 @@ static int hisi_acc_vf_load_state(struct hisi_acc_vf_core_device *hisi_acc_vdev) struct hisi_acc_vf_migration_file *migf = hisi_acc_vdev->resuming_migf; int ret; + if (hisi_acc_vdev->vf_qm_state != QM_READY) + return 0; + /* Recover data to VF */ ret = vf_qm_load_data(hisi_acc_vdev, migf); if (ret) { -- 2.43.0