Message ID | 20220411141403.86980-25-hch@lst.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/34] drm/i915/gvt: remove module refcounting in intel_gvt_{, un}register_hypervisor | expand |
On Mon, Apr 11, 2022 at 04:13:53PM +0200, Christoph Hellwig wrote: > All the dmabufs are torn down when th VGPU is released, so there is > no need for extra refcounting here. 'th' -> 'the' I think the specific argument is that intel_vgpu_query_plane() is only called from intel_vgpu_ioctl() which has to happen while the device is open so intel_vgpu_query_plane() has no issue. dmabuf_gem_object_free() is OK because: intel_vgpu_close_device __intel_vgpu_release intel_gvt_release_vgpu intel_vgpu_dmabuf_cleanup Menaing dmabuf->vgpu was already NULL once close_device is passed, and the vfio_device reference is held automatically from open_device->close_device And similarly intel_vgpu_dmabuf_cleanup() is OK because it is called by the above. The other places that call intel_vgpu_dmabuf_cleanup() are redundant with the close_device path. Though the 'release_work' callpath is buggy, for many reasons, but not for this series. Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> > diff --git a/drivers/gpu/drm/i915/gvt/dmabuf.c b/drivers/gpu/drm/i915/gvt/dmabuf.c > index 90443306a9ad4..01e54b45c5c1b 100644 > +++ b/drivers/gpu/drm/i915/gvt/dmabuf.c > @@ -139,7 +139,6 @@ static void dmabuf_gem_object_free(struct kref *kref) > dmabuf_obj = list_entry(pos, struct intel_vgpu_dmabuf_obj, list); > if (dmabuf_obj == obj) { Not for this series but it seems like there is something off about the locking here: if (vgpu && vgpu->active && !list_empty(&vgpu->dmabuf_obj_list_head)) { This is called under the dmabuf lock but active is protected by the vgpu_lock.. It seems strange that vgpu->active could be false but the device is still open, so maybe it is not possible. Jason
diff --git a/drivers/gpu/drm/i915/gvt/dmabuf.c b/drivers/gpu/drm/i915/gvt/dmabuf.c index 90443306a9ad4..01e54b45c5c1b 100644 --- a/drivers/gpu/drm/i915/gvt/dmabuf.c +++ b/drivers/gpu/drm/i915/gvt/dmabuf.c @@ -139,7 +139,6 @@ static void dmabuf_gem_object_free(struct kref *kref) dmabuf_obj = list_entry(pos, struct intel_vgpu_dmabuf_obj, list); if (dmabuf_obj == obj) { list_del(pos); - vfio_device_put(vgpu->vfio_device); idr_remove(&vgpu->object_idr, dmabuf_obj->dmabuf_id); kfree(dmabuf_obj->info); @@ -473,16 +472,6 @@ int intel_vgpu_query_plane(struct intel_vgpu *vgpu, void *args) kref_init(&dmabuf_obj->kref); - mutex_lock(&vgpu->dmabuf_lock); - vgpu->vfio_device = vfio_device_get_from_dev(mdev_dev(vgpu->mdev)); - if (!vgpu->vfio_device) { - gvt_vgpu_err("failed to get vfio device\n"); - mutex_unlock(&vgpu->dmabuf_lock); - ret = -ENODEV; - goto out_free_info; - } - mutex_unlock(&vgpu->dmabuf_lock); - update_fb_info(gfx_plane_info, &fb_info); INIT_LIST_HEAD(&dmabuf_obj->list); @@ -587,7 +576,6 @@ void intel_vgpu_dmabuf_cleanup(struct intel_vgpu *vgpu) dmabuf_obj->vgpu = NULL; idr_remove(&vgpu->object_idr, dmabuf_obj->dmabuf_id); - vfio_device_put(vgpu->vfio_device); list_del(pos); /* dmabuf_obj might be freed in dmabuf_obj_put */ diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h index 865997c5005d5..8565189e0c0dd 100644 --- a/drivers/gpu/drm/i915/gvt/gvt.h +++ b/drivers/gpu/drm/i915/gvt/gvt.h @@ -231,7 +231,6 @@ struct intel_vgpu { struct kvm *kvm; struct work_struct release_work; atomic_t released; - struct vfio_device *vfio_device; struct vfio_group *vfio_group; struct kvm_page_track_notifier_node track_node;
All the dmabufs are torn down when th VGPU is released, so there is no need for extra refcounting here. Based on an patch from Jason Gunthorpe. Signed-off-by: Christoph Hellwig <hch@lst.de> --- drivers/gpu/drm/i915/gvt/dmabuf.c | 12 ------------ drivers/gpu/drm/i915/gvt/gvt.h | 1 - 2 files changed, 13 deletions(-)