Skip to content

Commit

Permalink
drm/i915/gt: Make fence revocation unequivocal
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Chris Wilson committed Apr 1, 2020
1 parent 725c9ee commit 0d86ee3
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 20 deletions.
21 changes: 12 additions & 9 deletions drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
12 changes: 5 additions & 7 deletions drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 1 addition & 3 deletions drivers/gpu/drm/i915/i915_vma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/i915/i915_vma.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit 0d86ee3

Please sign in to comment.