lkml.org 
[lkml]   [2023]   [Feb]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 10/14] vfio-iommufd: Add detach_ioas for emulated VFIO devices
    Date
    this prepares for adding DETACH ioctl for emulated VFIO devices.

    Signed-off-by: Yi Liu <yi.l.liu@intel.com>
    ---
    drivers/gpu/drm/i915/gvt/kvmgt.c | 1 +
    drivers/s390/cio/vfio_ccw_ops.c | 1 +
    drivers/s390/crypto/vfio_ap_ops.c | 1 +
    drivers/vfio/iommufd.c | 29 +++++++++++++++++++++++++----
    include/linux/vfio.h | 3 +++
    5 files changed, 31 insertions(+), 4 deletions(-)

    diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
    index 8ae7039b3683..8a76a84bc3c1 100644
    --- a/drivers/gpu/drm/i915/gvt/kvmgt.c
    +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
    @@ -1474,6 +1474,7 @@ static const struct vfio_device_ops intel_vgpu_dev_ops = {
    .bind_iommufd = vfio_iommufd_emulated_bind,
    .unbind_iommufd = vfio_iommufd_emulated_unbind,
    .attach_ioas = vfio_iommufd_emulated_attach_ioas,
    + .detach_ioas = vfio_iommufd_emulated_detach_ioas,
    };

    static int intel_vgpu_probe(struct mdev_device *mdev)
    diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_ops.c
    index 5b53b94f13c7..cba4971618ff 100644
    --- a/drivers/s390/cio/vfio_ccw_ops.c
    +++ b/drivers/s390/cio/vfio_ccw_ops.c
    @@ -632,6 +632,7 @@ static const struct vfio_device_ops vfio_ccw_dev_ops = {
    .bind_iommufd = vfio_iommufd_emulated_bind,
    .unbind_iommufd = vfio_iommufd_emulated_unbind,
    .attach_ioas = vfio_iommufd_emulated_attach_ioas,
    + .detach_ioas = vfio_iommufd_emulated_detach_ioas,
    };

    struct mdev_driver vfio_ccw_mdev_driver = {
    diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c
    index 9c01957e56b3..f99c69d40982 100644
    --- a/drivers/s390/crypto/vfio_ap_ops.c
    +++ b/drivers/s390/crypto/vfio_ap_ops.c
    @@ -1802,6 +1802,7 @@ static const struct vfio_device_ops vfio_ap_matrix_dev_ops = {
    .bind_iommufd = vfio_iommufd_emulated_bind,
    .unbind_iommufd = vfio_iommufd_emulated_unbind,
    .attach_ioas = vfio_iommufd_emulated_attach_ioas,
    + .detach_ioas = vfio_iommufd_emulated_detach_ioas,
    };

    static struct mdev_driver vfio_ap_matrix_driver = {
    diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c
    index 90df1f30b7fd..026f81a87dd7 100644
    --- a/drivers/vfio/iommufd.c
    +++ b/drivers/vfio/iommufd.c
    @@ -149,14 +149,18 @@ int vfio_iommufd_emulated_bind(struct vfio_device *vdev,
    }
    EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_bind);

    +static void __vfio_iommufd_access_destroy(struct vfio_device *vdev)
    +{
    + iommufd_access_destroy(vdev->iommufd_access);
    + vdev->iommufd_access = NULL;
    +}
    +
    void vfio_iommufd_emulated_unbind(struct vfio_device *vdev)
    {
    lockdep_assert_held(&vdev->dev_set->lock);

    - if (vdev->iommufd_access) {
    - iommufd_access_destroy(vdev->iommufd_access);
    - vdev->iommufd_access = NULL;
    - }
    + if (vdev->iommufd_access)
    + __vfio_iommufd_access_destroy(vdev);
    iommufd_ctx_put(vdev->iommufd_ictx);
    vdev->iommufd_ictx = NULL;
    }
    @@ -168,6 +172,12 @@ int vfio_iommufd_emulated_attach_ioas(struct vfio_device *vdev, u32 *pt_id)

    lockdep_assert_held(&vdev->dev_set->lock);

    + if (!vdev->iommufd_ictx)
    + return -EINVAL;
    +
    + if (vdev->iommufd_access)
    + return -EBUSY;
    +
    user = iommufd_access_create(vdev->iommufd_ictx, *pt_id, &vfio_user_ops,
    vdev);
    if (IS_ERR(user))
    @@ -176,3 +186,14 @@ int vfio_iommufd_emulated_attach_ioas(struct vfio_device *vdev, u32 *pt_id)
    return 0;
    }
    EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_attach_ioas);
    +
    +void vfio_iommufd_emulated_detach_ioas(struct vfio_device *vdev)
    +{
    + lockdep_assert_held(&vdev->dev_set->lock);
    +
    + if (!vdev->iommufd_ictx || !vdev->iommufd_access)
    + return;
    +
    + __vfio_iommufd_access_destroy(vdev);
    +}
    +EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_detach_ioas);
    diff --git a/include/linux/vfio.h b/include/linux/vfio.h
    index 99a6a07e915c..70380d4955e1 100644
    --- a/include/linux/vfio.h
    +++ b/include/linux/vfio.h
    @@ -125,6 +125,7 @@ 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);
    int vfio_iommufd_emulated_attach_ioas(struct vfio_device *vdev, u32 *pt_id);
    +void vfio_iommufd_emulated_detach_ioas(struct vfio_device *vdev);
    #else
    #define vfio_iommufd_physical_bind \
    ((int (*)(struct vfio_device *vdev, struct iommufd_ctx *ictx, \
    @@ -142,6 +143,8 @@ int vfio_iommufd_emulated_attach_ioas(struct vfio_device *vdev, u32 *pt_id);
    ((void (*)(struct vfio_device *vdev)) NULL)
    #define vfio_iommufd_emulated_attach_ioas \
    ((int (*)(struct vfio_device *vdev, u32 *pt_id)) NULL)
    +#define vfio_iommufd_emulated_detach_ioas \
    + ((void (*)(struct vfio_device *vdev)) NULL)
    #endif

    /**
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-03-27 00:10    [W:2.535 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site