From: Alex Williamson <alex.williamson@redhat.com>
To: Yi Liu <yi.l.liu@intel.com>
Cc: jgg@nvidia.com, kevin.tian@intel.com, joro@8bytes.org,
eric.auger@redhat.com, nicolinc@nvidia.com, kvm@vger.kernel.org,
chao.p.peng@linux.intel.com, iommu@lists.linux.dev,
baolu.lu@linux.intel.com, zhenzhong.duan@intel.com,
vasant.hegde@amd.com, willy@infradead.org
Subject: Re: [PATCH v4 2/4] vfio-iommufd: Support pasid [at|de]tach for physical VFIO devices
Date: Mon, 4 Nov 2024 13:59:36 -0700 [thread overview]
Message-ID: <20241104135936.22f7a18b.alex.williamson@redhat.com> (raw)
In-Reply-To: <20241104132732.16759-3-yi.l.liu@intel.com>
On Mon, 4 Nov 2024 05:27:30 -0800
Yi Liu <yi.l.liu@intel.com> wrote:
> This adds pasid_at|de]tach_ioas ops for attaching hwpt to pasid of a
> device and the helpers for it. For now, only vfio-pci supports pasid
> attach/detach.
>
> Signed-off-by: Kevin Tian <kevin.tian@intel.com>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> Signed-off-by: Yi Liu <yi.l.liu@intel.com>
> ---
> drivers/vfio/iommufd.c | 50 +++++++++++++++++++++++++++++++++++++
> drivers/vfio/pci/vfio_pci.c | 2 ++
> include/linux/vfio.h | 11 ++++++++
> 3 files changed, 63 insertions(+)
>
> diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c
> index 82eba6966fa5..2f5cb4f616ce 100644
> --- a/drivers/vfio/iommufd.c
> +++ b/drivers/vfio/iommufd.c
> @@ -119,14 +119,22 @@ int vfio_iommufd_physical_bind(struct vfio_device *vdev,
> if (IS_ERR(idev))
> return PTR_ERR(idev);
> vdev->iommufd_device = idev;
> + ida_init(&vdev->pasids);
> return 0;
> }
> EXPORT_SYMBOL_GPL(vfio_iommufd_physical_bind);
>
> void vfio_iommufd_physical_unbind(struct vfio_device *vdev)
> {
> + int pasid;
> +
> lockdep_assert_held(&vdev->dev_set->lock);
>
> + while ((pasid = ida_find_first(&vdev->pasids)) >= 0) {
> + iommufd_device_pasid_detach(vdev->iommufd_device, pasid);
> + ida_free(&vdev->pasids, pasid);
> + }
> +
> if (vdev->iommufd_attached) {
> iommufd_device_detach(vdev->iommufd_device);
> vdev->iommufd_attached = false;
> @@ -168,6 +176,48 @@ void vfio_iommufd_physical_detach_ioas(struct vfio_device *vdev)
> }
> EXPORT_SYMBOL_GPL(vfio_iommufd_physical_detach_ioas);
>
> +int vfio_iommufd_physical_pasid_attach_ioas(struct vfio_device *vdev,
> + u32 pasid, u32 *pt_id)
> +{
> + int rc;
> +
> + lockdep_assert_held(&vdev->dev_set->lock);
> +
> + if (WARN_ON(!vdev->iommufd_device))
> + return -EINVAL;
> +
> + if (ida_exists(&vdev->pasids, pasid))
> + return iommufd_device_pasid_replace(vdev->iommufd_device,
> + pasid, pt_id);
> +
> + rc = ida_alloc_range(&vdev->pasids, pasid, pasid, GFP_KERNEL);
> + if (rc < 0)
> + return rc;
> +
> + rc = iommufd_device_pasid_attach(vdev->iommufd_device, pasid, pt_id);
> + if (rc)
> + ida_free(&vdev->pasids, pasid);
> +
> + return 0;
I think you meant to return rc here. Thanks,
Alex
> +}
> +EXPORT_SYMBOL_GPL(vfio_iommufd_physical_pasid_attach_ioas);
> +
> +void vfio_iommufd_physical_pasid_detach_ioas(struct vfio_device *vdev,
> + u32 pasid)
> +{
> + lockdep_assert_held(&vdev->dev_set->lock);
> +
> + if (WARN_ON(!vdev->iommufd_device))
> + return;
> +
> + if (!ida_exists(&vdev->pasids, pasid))
> + return;
> +
> + iommufd_device_pasid_detach(vdev->iommufd_device, pasid);
> + ida_free(&vdev->pasids, pasid);
> +}
> +EXPORT_SYMBOL_GPL(vfio_iommufd_physical_pasid_detach_ioas);
> +
> /*
> * The emulated standard ops mean that vfio_device is going to use the
> * "mdev path" and will call vfio_pin_pages()/vfio_dma_rw(). Drivers using this
> diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
> index e727941f589d..6f7ae7e5b7b0 100644
> --- a/drivers/vfio/pci/vfio_pci.c
> +++ b/drivers/vfio/pci/vfio_pci.c
> @@ -144,6 +144,8 @@ static const struct vfio_device_ops vfio_pci_ops = {
> .unbind_iommufd = vfio_iommufd_physical_unbind,
> .attach_ioas = vfio_iommufd_physical_attach_ioas,
> .detach_ioas = vfio_iommufd_physical_detach_ioas,
> + .pasid_attach_ioas = vfio_iommufd_physical_pasid_attach_ioas,
> + .pasid_detach_ioas = vfio_iommufd_physical_pasid_detach_ioas,
> };
>
> static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> diff --git a/include/linux/vfio.h b/include/linux/vfio.h
> index 000a6cab2d31..11b3b453752e 100644
> --- a/include/linux/vfio.h
> +++ b/include/linux/vfio.h
> @@ -67,6 +67,7 @@ struct vfio_device {
> struct inode *inode;
> #if IS_ENABLED(CONFIG_IOMMUFD)
> struct iommufd_device *iommufd_device;
> + struct ida pasids;
> u8 iommufd_attached:1;
> #endif
> u8 cdev_opened:1;
> @@ -91,6 +92,8 @@ struct vfio_device {
> * bound iommufd. Undo in unbind_iommufd if @detach_ioas is not
> * called.
> * @detach_ioas: Opposite of attach_ioas
> + * @pasid_attach_ioas: The pasid variation of attach_ioas
> + * @pasid_detach_ioas: Opposite of pasid_attach_ioas
> * @open_device: Called when the first file descriptor is opened for this device
> * @close_device: Opposite of open_device
> * @read: Perform read(2) on device file descriptor
> @@ -115,6 +118,8 @@ struct vfio_device_ops {
> void (*unbind_iommufd)(struct vfio_device *vdev);
> int (*attach_ioas)(struct vfio_device *vdev, u32 *pt_id);
> void (*detach_ioas)(struct vfio_device *vdev);
> + int (*pasid_attach_ioas)(struct vfio_device *vdev, u32 pasid, u32 *pt_id);
> + void (*pasid_detach_ioas)(struct vfio_device *vdev, u32 pasid);
> int (*open_device)(struct vfio_device *vdev);
> void (*close_device)(struct vfio_device *vdev);
> ssize_t (*read)(struct vfio_device *vdev, char __user *buf,
> @@ -139,6 +144,8 @@ int vfio_iommufd_physical_bind(struct vfio_device *vdev,
> void vfio_iommufd_physical_unbind(struct vfio_device *vdev);
> int vfio_iommufd_physical_attach_ioas(struct vfio_device *vdev, u32 *pt_id);
> void vfio_iommufd_physical_detach_ioas(struct vfio_device *vdev);
> +int vfio_iommufd_physical_pasid_attach_ioas(struct vfio_device *vdev, u32 pasid, u32 *pt_id);
> +void vfio_iommufd_physical_pasid_detach_ioas(struct vfio_device *vdev, u32 pasid);
> int vfio_iommufd_emulated_bind(struct vfio_device *vdev,
> struct iommufd_ctx *ictx, u32 *out_device_id);
> void vfio_iommufd_emulated_unbind(struct vfio_device *vdev);
> @@ -166,6 +173,10 @@ vfio_iommufd_get_dev_id(struct vfio_device *vdev, struct iommufd_ctx *ictx)
> ((int (*)(struct vfio_device *vdev, u32 *pt_id)) NULL)
> #define vfio_iommufd_physical_detach_ioas \
> ((void (*)(struct vfio_device *vdev)) NULL)
> +#define vfio_iommufd_physical_pasid_attach_ioas \
> + ((int (*)(struct vfio_device *vdev, u32 pasid, u32 *pt_id)) NULL)
> +#define vfio_iommufd_physical_pasid_detach_ioas \
> + ((void (*)(struct vfio_device *vdev, u32 pasid)) NULL)
> #define vfio_iommufd_emulated_bind \
> ((int (*)(struct vfio_device *vdev, struct iommufd_ctx *ictx, \
> u32 *out_device_id)) NULL)
next prev parent reply other threads:[~2024-11-04 20:59 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-04 13:27 [PATCH v4 0/4] vfio-pci support pasid attach/detach Yi Liu
2024-11-04 13:27 ` [PATCH v4 1/4] ida: Add ida_find_first_range() Yi Liu
2024-11-04 13:27 ` [PATCH v4 2/4] vfio-iommufd: Support pasid [at|de]tach for physical VFIO devices Yi Liu
2024-11-04 20:59 ` Alex Williamson [this message]
2024-11-05 2:00 ` Yi Liu
2024-11-04 13:27 ` [PATCH v4 3/4] vfio: VFIO_DEVICE_[AT|DE]TACH_IOMMUFD_PT support pasid Yi Liu
2024-11-04 21:00 ` Alex Williamson
2024-11-05 7:44 ` Yi Liu
2024-11-04 13:27 ` [PATCH v4 4/4] iommufd: Extend IOMMU_GET_HW_INFO to report PASID capability Yi Liu
2024-11-04 13:41 ` [PATCH v4 0/4] vfio-pci support pasid attach/detach Yi Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241104135936.22f7a18b.alex.williamson@redhat.com \
--to=alex.williamson@redhat.com \
--cc=baolu.lu@linux.intel.com \
--cc=chao.p.peng@linux.intel.com \
--cc=eric.auger@redhat.com \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=nicolinc@nvidia.com \
--cc=vasant.hegde@amd.com \
--cc=willy@infradead.org \
--cc=yi.l.liu@intel.com \
--cc=zhenzhong.duan@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox