drm/i915/gvt: Free dmabuf_obj list in intel_vgpu_dmabuf_cleanup
authorTina Zhang <tina.zhang@intel.com>
Wed, 29 Nov 2017 06:57:37 +0000 (14:57 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Mon, 4 Dec 2017 03:24:34 +0000 (11:24 +0800)
The per vGPU dmabuf_obj list should be released in intel_vgpu_dmabuf_
cleanup, which is invoked either in the process of closing a VM or in
the process of removing a vGPU.

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>
drivers/gpu/drm/i915/gvt/dmabuf.c

index 5f39e90f961c3310d4f21bcb45a130302764f8d7..9c40a67ecdd634edd3013cbacc6e7490cb052d4c 100644 (file)
@@ -90,7 +90,7 @@ static void dmabuf_gem_object_free(struct kref *kref)
        struct list_head *pos;
        struct intel_vgpu_dmabuf_obj *dmabuf_obj;
 
-       if (vgpu) {
+       if (vgpu && vgpu->active && !list_empty(&vgpu->dmabuf_obj_list_head)) {
                list_for_each(pos, &vgpu->dmabuf_obj_list_head) {
                        dmabuf_obj = container_of(pos,
                                        struct intel_vgpu_dmabuf_obj, list);
@@ -530,6 +530,7 @@ void intel_vgpu_dmabuf_cleanup(struct intel_vgpu *vgpu)
                if (dmabuf_obj->vgpu)
                        intel_gvt_hypervisor_put_vfio_device(vgpu);
 
+               list_del(pos);
                dmabuf_obj->vgpu = NULL;
 
        }