RE: [PATCH v2 2/5] hisi_acc_vfio_pci: add eq and aeq interruption restore

From: Shameerali Kolothum Thodi
Date: Thu Dec 19 2024 - 05:02:24 EST




> -----Original Message-----
> From: liulongfang <liulongfang@xxxxxxxxxx>
> Sent: Thursday, December 19, 2024 9:18 AM
> To: alex.williamson@xxxxxxxxxx; jgg@xxxxxxxxxx; Shameerali Kolothum
> Thodi <shameerali.kolothum.thodi@xxxxxxxxxx>; Jonathan Cameron
> <jonathan.cameron@xxxxxxxxxx>
> Cc: kvm@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx;
> linuxarm@xxxxxxxxxxxxx; liulongfang <liulongfang@xxxxxxxxxx>
> Subject: [PATCH v2 2/5] hisi_acc_vfio_pci: add eq and aeq interruption
> restore
>
> 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@xxxxxxxxxx>
> ---
> drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
> b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
> index 8518efea3a52..4c8f1ae5b636 100644
> --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
> +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
> @@ -463,6 +463,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)
> {
> @@ -571,6 +584,9 @@ static int vf_qm_state_save(struct
> hisi_acc_vf_core_device *hisi_acc_vdev,
> return -EINVAL;
>
> migf->total_length = sizeof(struct acc_vf_data);
> + /* Save eqc and aeqc interrupt information */
> + vf_qm_xeqc_save(vf_qm, migf);
> +
> return 0;
> }

Reviewed-by: Shameer Kolothum <shameerali.kolothum.thodi@xxxxxxxxxx>

Thanks,
Shameer