drm/i915: Unbind closed vma for i915_gem_object_unbind()
[deliverable/linux.git] / drivers / gpu / drm / i915 / i915_gem.c
index ac706f31af7dea6ba85a9cd319cdd78a5cb67934..3b16e92e9b51b2b9a1a7e134a230cd610cf17776 100644 (file)
@@ -283,11 +283,21 @@ int i915_gem_object_unbind(struct drm_i915_gem_object *obj)
 {
        struct i915_vma *vma;
        LIST_HEAD(still_in_list);
-       int ret = 0;
+       int ret;
 
-       /* The vma will only be freed if it is marked as closed, and if we wait
-        * upon rendering to the vma, we may unbind anything in the list.
+       lockdep_assert_held(&obj->base.dev->struct_mutex);
+
+       /* Closed vma are removed from the obj->vma_list - but they may
+        * still have an active binding on the object. To remove those we
+        * must wait for all rendering to complete to the object (as unbinding
+        * must anyway), and retire the requests.
         */
+       ret = i915_gem_object_wait_rendering(obj, false);
+       if (ret)
+               return ret;
+
+       i915_gem_retire_requests(to_i915(obj->base.dev));
+
        while ((vma = list_first_entry_or_null(&obj->vma_list,
                                               struct i915_vma,
                                               obj_link))) {
This page took 0.025254 seconds and 5 git commands to generate.