]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/i915/gt: Make fence revocation unequivocal
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 1 Apr 2020 21:01:04 +0000 (22:01 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 1 Apr 2020 22:34:17 +0000 (23:34 +0100)
If we must revoke the fence because the VMA is no longer present, or
because the fence no longer applies, ensure that we do and convert it
into an error if we try but cannot.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200401210104.15907-3-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_vma.c
drivers/gpu/drm/i915/i915_vma.h

index b5b2ef52e5709e7dc0306492355559283898d2d8..7fb36b12fe7a2aabf8e64bfe6ad7d1cb3df4503e 100644 (file)
@@ -298,23 +298,26 @@ static int fence_update(struct i915_fence_reg *fence,
  *
  * This function force-removes any fence from the given object, which is useful
  * if the kernel wants to do untiled GTT access.
- *
- * Returns:
- *
- * 0 on success, negative error code on failure.
  */
-int i915_vma_revoke_fence(struct i915_vma *vma)
+void i915_vma_revoke_fence(struct i915_vma *vma)
 {
        struct i915_fence_reg *fence = vma->fence;
+       intel_wakeref_t wakeref;
 
        lockdep_assert_held(&vma->vm->mutex);
        if (!fence)
-               return 0;
+               return;
 
-       if (atomic_read(&fence->pin_count))
-               return -EBUSY;
+       GEM_BUG_ON(fence->vma != vma);
+       GEM_BUG_ON(!i915_active_is_idle(&fence->active));
+       GEM_BUG_ON(atomic_read(&fence->pin_count));
+
+       fence->tiling = 0;
+       WRITE_ONCE(fence->vma, NULL);
+       vma->fence = NULL;
 
-       return fence_update(fence, NULL);
+       with_intel_runtime_pm_if_in_use(fence_to_uncore(fence)->rpm, wakeref)
+               fence_write(fence);
 }
 
 static struct i915_fence_reg *fence_find(struct i915_ggtt *ggtt)
index 762b50b08d731fd8a185e858ac0c4a4503d54f58..b0836fc47ae6c5aa2620a86b2ba7570400236a1d 100644 (file)
@@ -993,18 +993,16 @@ i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
                        return ERR_PTR(ret);
        }
 
+       ret = i915_vma_pin(vma, size, alignment, flags | PIN_GLOBAL);
+       if (ret)
+               return ERR_PTR(ret);
+
        if (vma->fence && !i915_gem_object_is_tiled(obj)) {
                mutex_lock(&ggtt->vm.mutex);
-               ret = i915_vma_revoke_fence(vma);
+               i915_vma_revoke_fence(vma);
                mutex_unlock(&ggtt->vm.mutex);
-               if (ret)
-                       return ERR_PTR(ret);
        }
 
-       ret = i915_vma_pin(vma, size, alignment, flags | PIN_GLOBAL);
-       if (ret)
-               return ERR_PTR(ret);
-
        ret = i915_vma_wait_for_bind(vma);
        if (ret) {
                i915_vma_unpin(vma);
index 616ca5a7c8751fbe668af3daf23fc38a49c948fa..b5f78b0acf5df5354b991c55a692da80f4f95440 100644 (file)
@@ -1298,9 +1298,7 @@ int __i915_vma_unbind(struct i915_vma *vma)
                i915_vma_flush_writes(vma);
 
                /* release the fence reg _after_ flushing */
-               ret = i915_vma_revoke_fence(vma);
-               if (ret)
-                       return ret;
+               i915_vma_revoke_fence(vma);
 
                /* Force a pagefault for domain tracking on next user access */
                i915_vma_revoke_mmap(vma);
index b958ad07f212941ebd67e6e13bbaa19327c081ca..8ad1daabcd58bbb1ec37be60b3a207f5df223104 100644 (file)
@@ -326,7 +326,7 @@ static inline struct page *i915_vma_first_page(struct i915_vma *vma)
  * True if the vma has a fence, false otherwise.
  */
 int __must_check i915_vma_pin_fence(struct i915_vma *vma);
-int __must_check i915_vma_revoke_fence(struct i915_vma *vma);
+void i915_vma_revoke_fence(struct i915_vma *vma);
 
 int __i915_vma_pin_fence(struct i915_vma *vma);