Re: [PATCH] vdpa/pds: fixes for VF vdpa flr-aer handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Feb 20, 2024 at 9:11 AM Shannon Nelson <shannon.nelson@xxxxxxx> wrote:
>
> This addresses a couple of things found while testing the FLR and AER
> handling with the VFs.
>  - release irqs before calling vp_modern_remove()
>  - make sure we have a valid struct pointer before using it to release irqs
>  - make sure the FW is alive before trying to add a new device
>
> Signed-off-by: Shannon Nelson <shannon.nelson@xxxxxxx>
> ---
>  drivers/vdpa/pds/aux_drv.c  |  2 +-
>  drivers/vdpa/pds/vdpa_dev.c | 20 +++++++++++++++++---
>  drivers/vdpa/pds/vdpa_dev.h |  1 +
>  3 files changed, 19 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/vdpa/pds/aux_drv.c b/drivers/vdpa/pds/aux_drv.c
> index 186e9ee22eb1..f57330cf9024 100644
> --- a/drivers/vdpa/pds/aux_drv.c
> +++ b/drivers/vdpa/pds/aux_drv.c
> @@ -93,8 +93,8 @@ static void pds_vdpa_remove(struct auxiliary_device *aux_dev)
>         struct device *dev = &aux_dev->dev;
>
>         vdpa_mgmtdev_unregister(&vdpa_aux->vdpa_mdev);
> +       pds_vdpa_release_irqs(vdpa_aux->pdsv);
>         vp_modern_remove(&vdpa_aux->vd_mdev);
> -       pci_free_irq_vectors(vdpa_aux->padev->vf_pdev);
>
>         pds_vdpa_debugfs_del_vdpadev(vdpa_aux);
>         kfree(vdpa_aux);
> diff --git a/drivers/vdpa/pds/vdpa_dev.c b/drivers/vdpa/pds/vdpa_dev.c
> index 25c0fe5ec3d5..301d95e08596 100644
> --- a/drivers/vdpa/pds/vdpa_dev.c
> +++ b/drivers/vdpa/pds/vdpa_dev.c
> @@ -426,12 +426,18 @@ static int pds_vdpa_request_irqs(struct pds_vdpa_device *pdsv)
>         return err;
>  }
>
> -static void pds_vdpa_release_irqs(struct pds_vdpa_device *pdsv)
> +void pds_vdpa_release_irqs(struct pds_vdpa_device *pdsv)
>  {
> -       struct pci_dev *pdev = pdsv->vdpa_aux->padev->vf_pdev;
> -       struct pds_vdpa_aux *vdpa_aux = pdsv->vdpa_aux;
> +       struct pds_vdpa_aux *vdpa_aux;
> +       struct pci_dev *pdev;
>         int qid;
>
> +       if (!pdsv)
> +               return;
> +
> +       pdev = pdsv->vdpa_aux->padev->vf_pdev;
> +       vdpa_aux = pdsv->vdpa_aux;
> +
>         if (!vdpa_aux->nintrs)
>                 return;
>
> @@ -612,6 +618,7 @@ static int pds_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
>         struct device *dma_dev;
>         struct pci_dev *pdev;
>         struct device *dev;
> +       u8 status;
>         int err;
>         int i;
>
> @@ -638,6 +645,13 @@ static int pds_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
>         dma_dev = &pdev->dev;
>         pdsv->vdpa_dev.dma_dev = dma_dev;
>
> +       status = pds_vdpa_get_status(&pdsv->vdpa_dev);
> +       if (status == 0xff) {
> +               dev_err(dev, "Broken PCI - status %#x\n", status);
> +               err = -ENXIO;
> +               goto err_unmap;
> +       }

This seems a violation of the virtio spec.

Note that spec has a DEVICE_NEEDS_RESET(64) or do we have a vendor
specific way to detect this instead?

Thanks

> +
>         pdsv->supported_features = mgmt->supported_features;
>
>         if (add_config->mask & BIT_ULL(VDPA_ATTR_DEV_FEATURES)) {
> diff --git a/drivers/vdpa/pds/vdpa_dev.h b/drivers/vdpa/pds/vdpa_dev.h
> index d984ba24a7da..84bdb45871ff 100644
> --- a/drivers/vdpa/pds/vdpa_dev.h
> +++ b/drivers/vdpa/pds/vdpa_dev.h
> @@ -46,5 +46,6 @@ struct pds_vdpa_device {
>
>  #define PDS_VDPA_PACKED_INVERT_IDX     0x8000
>
> +void pds_vdpa_release_irqs(struct pds_vdpa_device *pdsv);
>  int pds_vdpa_get_mgmt_info(struct pds_vdpa_aux *vdpa_aux);
>  #endif /* _VDPA_DEV_H_ */
> --
> 2.17.1
>






[Index of Archives]     [KVM Development]     [Libvirt Development]     [Libvirt Users]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux