Skip to content

Commit

Permalink
drm/ttm: Delayed delete fixes.
Browse files Browse the repository at this point in the history
1) Remove from lru before reserving so we avoid competing with
evicting processes.
2) Avoid calling kref_put() on bo::list_kref while spinlocked.
3) Additional refcounting bug-checking.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Thomas Hellstrom authored and Dave Airlie committed Dec 16, 2009
1 parent b663752 commit aaa2073
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions drivers/gpu/drm/ttm/ttm_bo.c
Original file line number Diff line number Diff line change
Expand Up @@ -465,27 +465,28 @@ static int ttm_bo_cleanup_refs(struct ttm_buffer_object *bo, bool remove_all)
spin_unlock(&bo->lock);

spin_lock(&glob->lru_lock);
put_count = ttm_bo_del_from_lru(bo);

ret = ttm_bo_reserve_locked(bo, false, false, false, 0);
BUG_ON(ret);
if (bo->ttm)
ttm_tt_unbind(bo->ttm);

if (!list_empty(&bo->ddestroy)) {
list_del_init(&bo->ddestroy);
kref_put(&bo->list_kref, ttm_bo_ref_bug);
++put_count;
}
if (bo->mem.mm_node) {
bo->mem.mm_node->private = NULL;
drm_mm_put_block(bo->mem.mm_node);
bo->mem.mm_node = NULL;
}
put_count = ttm_bo_del_from_lru(bo);
spin_unlock(&glob->lru_lock);

atomic_set(&bo->reserved, 0);

while (put_count--)
kref_put(&bo->list_kref, ttm_bo_release_list);
kref_put(&bo->list_kref, ttm_bo_ref_bug);

return 0;
}
Expand Down

0 comments on commit aaa2073

Please sign in to comment.