Re: [PATCH v2 08/15] drm/i915/gvt: Use the new device life cycle helpers
On 2022.09.01 22:37:40 +0800, Kevin Tian wrote: > Move vfio_device to the start of intel_vgpu as required by the new > helpers. > > Change intel_gvt_create_vgpu() to use intel_vgpu as the first param > as other vgpu helpers do. > > Signed-off-by: Kevin Tian > Reviewed-by: Jason Gunthorpe > --- Looks good to me. Reviewed-by: Zhenyu Wang > drivers/gpu/drm/i915/gvt/gvt.h | 5 ++- > drivers/gpu/drm/i915/gvt/kvmgt.c | 52 ++-- > drivers/gpu/drm/i915/gvt/vgpu.c | 33 > 3 files changed, 50 insertions(+), 40 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h > index 705689e64011..89fab7896fc6 100644 > --- a/drivers/gpu/drm/i915/gvt/gvt.h > +++ b/drivers/gpu/drm/i915/gvt/gvt.h > @@ -172,6 +172,7 @@ struct intel_vgpu_submission { > #define KVMGT_DEBUGFS_FILENAME "kvmgt_nr_cache_entries" > > struct intel_vgpu { > + struct vfio_device vfio_device; > struct intel_gvt *gvt; > struct mutex vgpu_lock; > int id; > @@ -211,7 +212,6 @@ struct intel_vgpu { > > u32 scan_nonprivbb; > > - struct vfio_device vfio_device; > struct vfio_region *region; > int num_regions; > struct eventfd_ctx *intx_trigger; > @@ -494,8 +494,7 @@ void intel_gvt_clean_vgpu_types(struct intel_gvt *gvt); > > struct intel_vgpu *intel_gvt_create_idle_vgpu(struct intel_gvt *gvt); > void intel_gvt_destroy_idle_vgpu(struct intel_vgpu *vgpu); > -struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt, > - struct intel_vgpu_type *type); > +int intel_gvt_create_vgpu(struct intel_vgpu *vgpu, struct intel_vgpu_type > *type); > void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu); > void intel_gvt_release_vgpu(struct intel_vgpu *vgpu); > void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr, > diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c > b/drivers/gpu/drm/i915/gvt/kvmgt.c > index e3cd58946477..41bba40feef8 100644 > --- a/drivers/gpu/drm/i915/gvt/kvmgt.c > +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c > @@ -1546,7 +1546,33 @@ static const struct attribute_group > *intel_vgpu_groups[] = { > NULL, > }; > > +static int intel_vgpu_init_dev(struct vfio_device *vfio_dev) > +{ > + struct mdev_device *mdev = to_mdev_device(vfio_dev->dev); > + struct device *pdev = mdev_parent_dev(mdev); > + struct intel_gvt *gvt = kdev_to_i915(pdev)->gvt; > + struct intel_vgpu_type *type; > + struct intel_vgpu *vgpu = vfio_dev_to_vgpu(vfio_dev); > + > + type = >types[mdev_get_type_group_id(mdev)]; > + if (!type) > + return -EINVAL; > + > + vgpu->gvt = gvt; > + return intel_gvt_create_vgpu(vgpu, type); > +} > + > +static void intel_vgpu_release_dev(struct vfio_device *vfio_dev) > +{ > + struct intel_vgpu *vgpu = vfio_dev_to_vgpu(vfio_dev); > + > + intel_gvt_destroy_vgpu(vgpu); > + vfio_free_device(vfio_dev); > +} > + > static const struct vfio_device_ops intel_vgpu_dev_ops = { > + .init = intel_vgpu_init_dev, > + .release= intel_vgpu_release_dev, > .open_device= intel_vgpu_open_device, > .close_device = intel_vgpu_close_device, > .read = intel_vgpu_read, > @@ -1558,35 +1584,28 @@ static const struct vfio_device_ops > intel_vgpu_dev_ops = { > > static int intel_vgpu_probe(struct mdev_device *mdev) > { > - struct device *pdev = mdev_parent_dev(mdev); > - struct intel_gvt *gvt = kdev_to_i915(pdev)->gvt; > - struct intel_vgpu_type *type; > struct intel_vgpu *vgpu; > int ret; > > - type = >types[mdev_get_type_group_id(mdev)]; > - if (!type) > - return -EINVAL; > - > - vgpu = intel_gvt_create_vgpu(gvt, type); > + vgpu = vfio_alloc_device(intel_vgpu, vfio_device, >dev, > + _vgpu_dev_ops); > if (IS_ERR(vgpu)) { > gvt_err("failed to create intel vgpu: %ld\n", PTR_ERR(vgpu)); > return PTR_ERR(vgpu); > } > > - vfio_init_group_dev(>vfio_device, >dev, > - _vgpu_dev_ops); > - > dev_set_drvdata(>dev, vgpu); > ret = vfio_register_emulated_iommu_dev(>vfio_device); > - if (ret) { > - intel_gvt_destroy_vgpu(vgpu); > - return ret; > - } > + if (ret) > + goto out_put_vdev; > > gvt_dbg_core("intel_vgpu_create succeeded for mdev: %s\n", >dev_name(mdev_dev(mdev))); > return 0; > + > +out_put_vdev: > + vfio_put_device(>vfio_device); > + return ret; > } > > static void intel_vgpu_remove(struct mdev_device *mdev) > @@ -1595,7 +1614,8 @@ static void intel_vgpu_remove(struct mdev_device *mdev) > > if (WARN_ON_ONCE(vgpu->attached)) > return; > - intel_gvt_destroy_vgpu(vgpu); > + > + vfio_put_device(>vfio_device); > } > > static struct mdev_driver
[PATCH v2 08/15] drm/i915/gvt: Use the new device life cycle helpers
Move vfio_device to the start of intel_vgpu as required by the new helpers. Change intel_gvt_create_vgpu() to use intel_vgpu as the first param as other vgpu helpers do. Signed-off-by: Kevin Tian Reviewed-by: Jason Gunthorpe --- drivers/gpu/drm/i915/gvt/gvt.h | 5 ++- drivers/gpu/drm/i915/gvt/kvmgt.c | 52 ++-- drivers/gpu/drm/i915/gvt/vgpu.c | 33 3 files changed, 50 insertions(+), 40 deletions(-) diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h index 705689e64011..89fab7896fc6 100644 --- a/drivers/gpu/drm/i915/gvt/gvt.h +++ b/drivers/gpu/drm/i915/gvt/gvt.h @@ -172,6 +172,7 @@ struct intel_vgpu_submission { #define KVMGT_DEBUGFS_FILENAME "kvmgt_nr_cache_entries" struct intel_vgpu { + struct vfio_device vfio_device; struct intel_gvt *gvt; struct mutex vgpu_lock; int id; @@ -211,7 +212,6 @@ struct intel_vgpu { u32 scan_nonprivbb; - struct vfio_device vfio_device; struct vfio_region *region; int num_regions; struct eventfd_ctx *intx_trigger; @@ -494,8 +494,7 @@ void intel_gvt_clean_vgpu_types(struct intel_gvt *gvt); struct intel_vgpu *intel_gvt_create_idle_vgpu(struct intel_gvt *gvt); void intel_gvt_destroy_idle_vgpu(struct intel_vgpu *vgpu); -struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt, -struct intel_vgpu_type *type); +int intel_gvt_create_vgpu(struct intel_vgpu *vgpu, struct intel_vgpu_type *type); void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu); void intel_gvt_release_vgpu(struct intel_vgpu *vgpu); void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr, diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c index e3cd58946477..41bba40feef8 100644 --- a/drivers/gpu/drm/i915/gvt/kvmgt.c +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c @@ -1546,7 +1546,33 @@ static const struct attribute_group *intel_vgpu_groups[] = { NULL, }; +static int intel_vgpu_init_dev(struct vfio_device *vfio_dev) +{ + struct mdev_device *mdev = to_mdev_device(vfio_dev->dev); + struct device *pdev = mdev_parent_dev(mdev); + struct intel_gvt *gvt = kdev_to_i915(pdev)->gvt; + struct intel_vgpu_type *type; + struct intel_vgpu *vgpu = vfio_dev_to_vgpu(vfio_dev); + + type = >types[mdev_get_type_group_id(mdev)]; + if (!type) + return -EINVAL; + + vgpu->gvt = gvt; + return intel_gvt_create_vgpu(vgpu, type); +} + +static void intel_vgpu_release_dev(struct vfio_device *vfio_dev) +{ + struct intel_vgpu *vgpu = vfio_dev_to_vgpu(vfio_dev); + + intel_gvt_destroy_vgpu(vgpu); + vfio_free_device(vfio_dev); +} + static const struct vfio_device_ops intel_vgpu_dev_ops = { + .init = intel_vgpu_init_dev, + .release= intel_vgpu_release_dev, .open_device= intel_vgpu_open_device, .close_device = intel_vgpu_close_device, .read = intel_vgpu_read, @@ -1558,35 +1584,28 @@ static const struct vfio_device_ops intel_vgpu_dev_ops = { static int intel_vgpu_probe(struct mdev_device *mdev) { - struct device *pdev = mdev_parent_dev(mdev); - struct intel_gvt *gvt = kdev_to_i915(pdev)->gvt; - struct intel_vgpu_type *type; struct intel_vgpu *vgpu; int ret; - type = >types[mdev_get_type_group_id(mdev)]; - if (!type) - return -EINVAL; - - vgpu = intel_gvt_create_vgpu(gvt, type); + vgpu = vfio_alloc_device(intel_vgpu, vfio_device, >dev, +_vgpu_dev_ops); if (IS_ERR(vgpu)) { gvt_err("failed to create intel vgpu: %ld\n", PTR_ERR(vgpu)); return PTR_ERR(vgpu); } - vfio_init_group_dev(>vfio_device, >dev, - _vgpu_dev_ops); - dev_set_drvdata(>dev, vgpu); ret = vfio_register_emulated_iommu_dev(>vfio_device); - if (ret) { - intel_gvt_destroy_vgpu(vgpu); - return ret; - } + if (ret) + goto out_put_vdev; gvt_dbg_core("intel_vgpu_create succeeded for mdev: %s\n", dev_name(mdev_dev(mdev))); return 0; + +out_put_vdev: + vfio_put_device(>vfio_device); + return ret; } static void intel_vgpu_remove(struct mdev_device *mdev) @@ -1595,7 +1614,8 @@ static void intel_vgpu_remove(struct mdev_device *mdev) if (WARN_ON_ONCE(vgpu->attached)) return; - intel_gvt_destroy_vgpu(vgpu); + + vfio_put_device(>vfio_device); } static struct mdev_driver intel_vgpu_mdev_driver = { diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c index 46da19b3225d..5c533fbc2c8d 100644 --- a/drivers/gpu/drm/i915/gvt/vgpu.c +++ b/drivers/gpu/drm/i915/gvt/vgpu.c @@ -302,8 +302,6 @@ void