From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> Purpose is to catch places which iterate the object VMA list without holding the big lock. Implemented by open coding list_for_each_entry_safe to make the macro compatible with existing call sites. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> Cc: Daniel Vetter <daniel.vetter@xxxxxxxx> --- drivers/gpu/drm/i915/i915_drv.h | 7 +++++++ drivers/gpu/drm/i915/i915_gem.c | 6 +++--- drivers/gpu/drm/i915/i915_gem_shrinker.c | 3 +-- drivers/gpu/drm/i915/i915_gem_userptr.c | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 0406a020dfcc..81a83424fa13 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2858,6 +2858,13 @@ void i915_gem_vma_destroy(struct i915_vma *vma); &vma->vma_link != (&(obj)->vma_list); \ vma = list_next_entry(vma, vma_link)) +#define i915_gem_obj_for_each_vma_safe(vma, next, obj) \ + for (WARN_ON_ONCE(!mutex_is_locked(&(obj)->base.dev->struct_mutex)), \ + vma = list_first_entry(&(obj)->vma_list, typeof(*vma), vma_link), \ + next = list_next_entry(vma, vma_link); \ + &vma->vma_link != (&(obj)->vma_list); \ + vma = next, next = list_next_entry(next, vma_link)) + /* Flags used by pin/bind&friends. */ #define PIN_MAPPABLE (1<<0) #define PIN_NONBLOCK (1<<1) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 415bb5ef8b3a..5a6daeaef680 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -272,7 +272,7 @@ drop_pages(struct drm_i915_gem_object *obj) int ret; drm_gem_object_reference(&obj->base); - list_for_each_entry_safe(vma, next, &obj->vma_list, vma_link) + i915_gem_obj_for_each_vma_safe(vma, next, obj) if (i915_vma_unbind(vma)) break; @@ -3771,7 +3771,7 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj, * catch the issue of the CS prefetch crossing page boundaries and * reading an invalid PTE on older architectures. */ - list_for_each_entry_safe(vma, next, &obj->vma_list, vma_link) { + i915_gem_obj_for_each_vma_safe(vma, next, obj) { if (!drm_mm_node_allocated(&vma->node)) continue; @@ -4507,7 +4507,7 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj) trace_i915_gem_object_destroy(obj); - list_for_each_entry_safe(vma, next, &obj->vma_list, vma_link) { + i915_gem_obj_for_each_vma_safe(vma, next, obj) { int ret; vma->pin_count = 0; diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c index 4106666a4303..3cf83f4eb7c9 100644 --- a/drivers/gpu/drm/i915/i915_gem_shrinker.c +++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c @@ -175,8 +175,7 @@ i915_gem_shrink(struct drm_i915_private *dev_priv, drm_gem_object_reference(&obj->base); /* For the unbound phase, this should be a no-op! */ - list_for_each_entry_safe(vma, v, - &obj->vma_list, vma_link) + i915_gem_obj_for_each_vma_safe(vma, v, obj) if (i915_vma_unbind(vma)) break; diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c index 19fb0bddc1cd..b730dfffe306 100644 --- a/drivers/gpu/drm/i915/i915_gem_userptr.c +++ b/drivers/gpu/drm/i915/i915_gem_userptr.c @@ -81,7 +81,7 @@ static void __cancel_userptr__worker(struct work_struct *work) was_interruptible = dev_priv->mm.interruptible; dev_priv->mm.interruptible = false; - list_for_each_entry_safe(vma, tmp, &obj->vma_list, vma_link) { + i915_gem_obj_for_each_vma_safe(vma, tmp, obj) { int ret = i915_vma_unbind(vma); WARN_ON(ret && ret != -EIO); } -- 1.9.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx