Message ID | 20220901143747.32858-9-kevin.tian@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Tidy up vfio_device life cycle | expand |
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 <kevin.tian@intel.com> > Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> > --- Looks good to me. Reviewed-by: Zhenyu Wang <zhenyuw@linux.intel.com> > 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 = &gvt->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 = &gvt->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, &mdev->dev, > + &intel_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(&vgpu->vfio_device, &mdev->dev, > - &intel_vgpu_dev_ops); > - > dev_set_drvdata(&mdev->dev, vgpu); > ret = vfio_register_emulated_iommu_dev(&vgpu->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(&vgpu->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(&vgpu->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 intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu) > mutex_lock(&gvt->lock); > intel_gvt_update_vgpu_types(gvt); > mutex_unlock(&gvt->lock); > - > - vfree(vgpu); > } > > #define IDLE_VGPU_IDR 0 > @@ -363,28 +361,23 @@ void intel_gvt_destroy_idle_vgpu(struct intel_vgpu *vgpu) > vfree(vgpu); > } > > -static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, > - struct intel_vgpu_creation_params *param) > +static int __intel_gvt_create_vgpu(struct intel_vgpu *vgpu, > + struct intel_vgpu_creation_params *param) > { > + struct intel_gvt *gvt = vgpu->gvt; > struct drm_i915_private *dev_priv = gvt->gt->i915; > - struct intel_vgpu *vgpu; > int ret; > > gvt_dbg_core("low %llu MB high %llu MB fence %llu\n", > param->low_gm_sz, param->high_gm_sz, > param->fence_sz); > > - vgpu = vzalloc(sizeof(*vgpu)); > - if (!vgpu) > - return ERR_PTR(-ENOMEM); > - > ret = idr_alloc(&gvt->vgpu_idr, vgpu, IDLE_VGPU_IDR + 1, GVT_MAX_VGPU, > GFP_KERNEL); > if (ret < 0) > - goto out_free_vgpu; > + return ret; > > vgpu->id = ret; > - vgpu->gvt = gvt; > vgpu->sched_ctl.weight = param->weight; > mutex_init(&vgpu->vgpu_lock); > mutex_init(&vgpu->dmabuf_lock); > @@ -437,7 +430,7 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, > if (ret) > goto out_clean_sched_policy; > > - return vgpu; > + return 0; > > out_clean_sched_policy: > intel_vgpu_clean_sched_policy(vgpu); > @@ -455,9 +448,7 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, > intel_vgpu_clean_mmio(vgpu); > out_clean_idr: > idr_remove(&gvt->vgpu_idr, vgpu->id); > -out_free_vgpu: > - vfree(vgpu); > - return ERR_PTR(ret); > + return ret; > } > > /** > @@ -470,11 +461,11 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, > * Returns: > * pointer to intel_vgpu, error pointer if failed. > */ > -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) > { > + struct intel_gvt *gvt = vgpu->gvt; > struct intel_vgpu_creation_params param; > - struct intel_vgpu *vgpu; > + int ret; > > param.primary = 1; > param.low_gm_sz = type->low_gm_size; > @@ -488,15 +479,15 @@ struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt, > param.high_gm_sz = BYTES_TO_MB(param.high_gm_sz); > > mutex_lock(&gvt->lock); > - vgpu = __intel_gvt_create_vgpu(gvt, ¶m); > - if (!IS_ERR(vgpu)) { > + ret = __intel_gvt_create_vgpu(vgpu, ¶m); > + if (!ret) { > /* calculate left instance change for types */ > intel_gvt_update_vgpu_types(gvt); > intel_gvt_update_reg_whitelist(vgpu); > } > mutex_unlock(&gvt->lock); > > - return vgpu; > + return ret; > } > > /** > -- > 2.21.3 >
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 = &gvt->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 = &gvt->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, &mdev->dev, + &intel_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(&vgpu->vfio_device, &mdev->dev, - &intel_vgpu_dev_ops); - dev_set_drvdata(&mdev->dev, vgpu); ret = vfio_register_emulated_iommu_dev(&vgpu->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(&vgpu->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(&vgpu->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 intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu) mutex_lock(&gvt->lock); intel_gvt_update_vgpu_types(gvt); mutex_unlock(&gvt->lock); - - vfree(vgpu); } #define IDLE_VGPU_IDR 0 @@ -363,28 +361,23 @@ void intel_gvt_destroy_idle_vgpu(struct intel_vgpu *vgpu) vfree(vgpu); } -static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, - struct intel_vgpu_creation_params *param) +static int __intel_gvt_create_vgpu(struct intel_vgpu *vgpu, + struct intel_vgpu_creation_params *param) { + struct intel_gvt *gvt = vgpu->gvt; struct drm_i915_private *dev_priv = gvt->gt->i915; - struct intel_vgpu *vgpu; int ret; gvt_dbg_core("low %llu MB high %llu MB fence %llu\n", param->low_gm_sz, param->high_gm_sz, param->fence_sz); - vgpu = vzalloc(sizeof(*vgpu)); - if (!vgpu) - return ERR_PTR(-ENOMEM); - ret = idr_alloc(&gvt->vgpu_idr, vgpu, IDLE_VGPU_IDR + 1, GVT_MAX_VGPU, GFP_KERNEL); if (ret < 0) - goto out_free_vgpu; + return ret; vgpu->id = ret; - vgpu->gvt = gvt; vgpu->sched_ctl.weight = param->weight; mutex_init(&vgpu->vgpu_lock); mutex_init(&vgpu->dmabuf_lock); @@ -437,7 +430,7 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, if (ret) goto out_clean_sched_policy; - return vgpu; + return 0; out_clean_sched_policy: intel_vgpu_clean_sched_policy(vgpu); @@ -455,9 +448,7 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, intel_vgpu_clean_mmio(vgpu); out_clean_idr: idr_remove(&gvt->vgpu_idr, vgpu->id); -out_free_vgpu: - vfree(vgpu); - return ERR_PTR(ret); + return ret; } /** @@ -470,11 +461,11 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, * Returns: * pointer to intel_vgpu, error pointer if failed. */ -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) { + struct intel_gvt *gvt = vgpu->gvt; struct intel_vgpu_creation_params param; - struct intel_vgpu *vgpu; + int ret; param.primary = 1; param.low_gm_sz = type->low_gm_size; @@ -488,15 +479,15 @@ struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt, param.high_gm_sz = BYTES_TO_MB(param.high_gm_sz); mutex_lock(&gvt->lock); - vgpu = __intel_gvt_create_vgpu(gvt, ¶m); - if (!IS_ERR(vgpu)) { + ret = __intel_gvt_create_vgpu(vgpu, ¶m); + if (!ret) { /* calculate left instance change for types */ intel_gvt_update_vgpu_types(gvt); intel_gvt_update_reg_whitelist(vgpu); } mutex_unlock(&gvt->lock); - return vgpu; + return ret; } /**