]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
hisi_acc_vfio_pci: add eq and aeq interruption restore
authorLongfang Liu <liulongfang@huawei.com>
Sat, 10 May 2025 08:11:51 +0000 (16:11 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Jun 2025 10:07:11 +0000 (11:07 +0100)
[ Upstream commit 3495cec0787721ba7a9d5c19d0bbb66d182de584 ]

In order to ensure that the task packets of the accelerator
device are not lost during the migration process, it is necessary
to send an EQ and AEQ command to the device after the live migration
is completed and to update the completion position of the task queue.

Let the device recheck the completed tasks data and if there are
uncollected packets, device resend a task completion interrupt
to the software.

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-3-liulongfang@huawei.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c

index b5efb37712d5ef4bf2c7b7e1d0f74e7c53120869..de3e1a148ddab98dbe51808fe4d41b4953cd60c9 100644 (file)
@@ -469,6 +469,19 @@ static int vf_qm_get_match_data(struct hisi_acc_vf_core_device *hisi_acc_vdev,
        return 0;
 }
 
+static void vf_qm_xeqc_save(struct hisi_qm *qm,
+                           struct hisi_acc_vf_migration_file *migf)
+{
+       struct acc_vf_data *vf_data = &migf->vf_data;
+       u16 eq_head, aeq_head;
+
+       eq_head = vf_data->qm_eqc_dw[0] & 0xFFFF;
+       qm_db(qm, 0, QM_DOORBELL_CMD_EQ, eq_head, 0);
+
+       aeq_head = vf_data->qm_aeqc_dw[0] & 0xFFFF;
+       qm_db(qm, 0, QM_DOORBELL_CMD_AEQ, aeq_head, 0);
+}
+
 static int vf_qm_load_data(struct hisi_acc_vf_core_device *hisi_acc_vdev,
                           struct hisi_acc_vf_migration_file *migf)
 {
@@ -569,6 +582,9 @@ static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev,
        }
 
        migf->total_length = sizeof(struct acc_vf_data);
+       /* Save eqc and aeqc interrupt information */
+       vf_qm_xeqc_save(vf_qm, migf);
+
        return 0;
 }