diff options
author | Tina Zhang <tina.zhang@intel.com> | 2017-12-08 02:17:38 -0500 |
---|---|---|
committer | Zhenyu Wang <zhenyuw@linux.intel.com> | 2017-12-08 03:20:12 -0500 |
commit | 6ee942d5f7e3e630d3a2517e75969ce5d07c87d6 (patch) | |
tree | 4112861fabf8a3acbde1eb052c42022dd2c215bf /drivers | |
parent | 072ec93d50fd4c4b27ea44fff160a95c2b581eb1 (diff) |
drm/i915/gvt: Refine dmabuf_obj cleanup process
In the process of dmabuf_obj cleanup, the dmabuf_obj might be freed during
dmabuf_obj_put leaking intel_gvt_hypervisor_put_vfio_device.
Move intel_gvt_hypervisor_put_vfio_device and all the other dmabuf_obj ops
in front of dmabuf_obj_put and let every dmabuf_obj have a chance to call
intel_gvt_hypervisor_put_vfio_device to fix this leaking issue.
Fixes: e3a0d7976c53 ("drm/i915/gvt: Handle orphan dmabuf_objs")
Signed-off-by: Tina Zhang <tina.zhang@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/gvt/dmabuf.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/gvt/dmabuf.c b/drivers/gpu/drm/i915/gvt/dmabuf.c index 9c40a67ecdd6..2ab584f97dfb 100644 --- a/drivers/gpu/drm/i915/gvt/dmabuf.c +++ b/drivers/gpu/drm/i915/gvt/dmabuf.c | |||
@@ -520,19 +520,18 @@ void intel_vgpu_dmabuf_cleanup(struct intel_vgpu *vgpu) | |||
520 | list_for_each_safe(pos, n, &vgpu->dmabuf_obj_list_head) { | 520 | list_for_each_safe(pos, n, &vgpu->dmabuf_obj_list_head) { |
521 | dmabuf_obj = container_of(pos, struct intel_vgpu_dmabuf_obj, | 521 | dmabuf_obj = container_of(pos, struct intel_vgpu_dmabuf_obj, |
522 | list); | 522 | list); |
523 | dmabuf_obj->vgpu = NULL; | ||
524 | |||
525 | idr_remove(&vgpu->object_idr, dmabuf_obj->dmabuf_id); | ||
526 | intel_gvt_hypervisor_put_vfio_device(vgpu); | ||
527 | list_del(pos); | ||
528 | |||
529 | /* dmabuf_obj might be freed in dmabuf_obj_put */ | ||
523 | if (dmabuf_obj->initref) { | 530 | if (dmabuf_obj->initref) { |
524 | dmabuf_obj->initref = false; | 531 | dmabuf_obj->initref = false; |
525 | dmabuf_obj_put(dmabuf_obj); | 532 | dmabuf_obj_put(dmabuf_obj); |
526 | } | 533 | } |
527 | 534 | ||
528 | idr_remove(&vgpu->object_idr, dmabuf_obj->dmabuf_id); | ||
529 | |||
530 | if (dmabuf_obj->vgpu) | ||
531 | intel_gvt_hypervisor_put_vfio_device(vgpu); | ||
532 | |||
533 | list_del(pos); | ||
534 | dmabuf_obj->vgpu = NULL; | ||
535 | |||
536 | } | 535 | } |
537 | mutex_unlock(&vgpu->dmabuf_lock); | 536 | mutex_unlock(&vgpu->dmabuf_lock); |
538 | } | 537 | } |