Commit 1eef0de1 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Daniel Vetter

drm/i915: Ensure we hold the object mutex in pin correctly.

Currently we have a lot of places where we hold the gem object lock,
but haven't yet been converted to the ww dance. Complain loudly about
those places.

i915_vma_pin shouldn't have the obj lock held, so we can do a ww dance,
while i915_vma_pin_ww should.
Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com> #irc
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20210323155059.628690-6-maarten.lankhorst@linux.intel.com
parent 237647f4
...@@ -197,7 +197,7 @@ int intel_renderstate_init(struct intel_renderstate *so, ...@@ -197,7 +197,7 @@ int intel_renderstate_init(struct intel_renderstate *so,
if (err) if (err)
goto err_context; goto err_context;
err = i915_vma_pin(so->vma, 0, 0, PIN_GLOBAL | PIN_HIGH); err = i915_vma_pin_ww(so->vma, &so->ww, 0, 0, PIN_GLOBAL | PIN_HIGH);
if (err) if (err)
goto err_context; goto err_context;
......
...@@ -865,6 +865,8 @@ int i915_vma_pin_ww(struct i915_vma *vma, struct i915_gem_ww_ctx *ww, ...@@ -865,6 +865,8 @@ int i915_vma_pin_ww(struct i915_vma *vma, struct i915_gem_ww_ctx *ww,
#ifdef CONFIG_PROVE_LOCKING #ifdef CONFIG_PROVE_LOCKING
if (debug_locks && lockdep_is_held(&vma->vm->i915->drm.struct_mutex)) if (debug_locks && lockdep_is_held(&vma->vm->i915->drm.struct_mutex))
WARN_ON(!ww); WARN_ON(!ww);
if (debug_locks && ww && vma->resv)
assert_vma_held(vma);
#endif #endif
BUILD_BUG_ON(PIN_GLOBAL != I915_VMA_GLOBAL_BIND); BUILD_BUG_ON(PIN_GLOBAL != I915_VMA_GLOBAL_BIND);
...@@ -1020,8 +1022,15 @@ int i915_ggtt_pin(struct i915_vma *vma, struct i915_gem_ww_ctx *ww, ...@@ -1020,8 +1022,15 @@ int i915_ggtt_pin(struct i915_vma *vma, struct i915_gem_ww_ctx *ww,
GEM_BUG_ON(!i915_vma_is_ggtt(vma)); GEM_BUG_ON(!i915_vma_is_ggtt(vma));
#ifdef CONFIG_LOCKDEP
WARN_ON(!ww && vma->resv && dma_resv_held(vma->resv));
#endif
do { do {
err = i915_vma_pin_ww(vma, ww, 0, align, flags | PIN_GLOBAL); if (ww)
err = i915_vma_pin_ww(vma, ww, 0, align, flags | PIN_GLOBAL);
else
err = i915_vma_pin(vma, 0, align, flags | PIN_GLOBAL);
if (err != -ENOSPC) { if (err != -ENOSPC) {
if (!err) { if (!err) {
err = i915_vma_wait_for_bind(vma); err = i915_vma_wait_for_bind(vma);
......
...@@ -243,6 +243,9 @@ i915_vma_pin_ww(struct i915_vma *vma, struct i915_gem_ww_ctx *ww, ...@@ -243,6 +243,9 @@ i915_vma_pin_ww(struct i915_vma *vma, struct i915_gem_ww_ctx *ww,
static inline int __must_check static inline int __must_check
i915_vma_pin(struct i915_vma *vma, u64 size, u64 alignment, u64 flags) i915_vma_pin(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
{ {
#ifdef CONFIG_LOCKDEP
WARN_ON_ONCE(vma->resv && dma_resv_held(vma->resv));
#endif
return i915_vma_pin_ww(vma, NULL, size, alignment, flags); return i915_vma_pin_ww(vma, NULL, size, alignment, flags);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment