Skip to content

Commit

Permalink
drm/ttm: Fix potential ttm_mem_evict_first races.
Browse files Browse the repository at this point in the history
1) The function was previously called with a potentially empty
LRU list which would have lead to an OOPS or servere corruption.
2) In rare cases, after reservation has succeeded, another process may
already have evicted it or even pinned it. We must revalidate the
buffer status after releasing the lru lock.

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 aaa2073 commit 9c51ba1
Showing 1 changed file with 31 additions and 5 deletions.
36 changes: 31 additions & 5 deletions drivers/gpu/drm/ttm/ttm_bo.c
Original file line number Diff line number Diff line change
Expand Up @@ -685,19 +685,45 @@ static int ttm_mem_evict_first(struct ttm_bo_device *bdev,
struct ttm_buffer_object *bo;
int ret, put_count = 0;

retry:
spin_lock(&glob->lru_lock);
if (list_empty(&man->lru)) {
spin_unlock(&glob->lru_lock);
return -EBUSY;
}

bo = list_first_entry(&man->lru, struct ttm_buffer_object, lru);
kref_get(&bo->list_kref);
ret = ttm_bo_reserve_locked(bo, interruptible, no_wait, false, 0);
if (likely(ret == 0))
put_count = ttm_bo_del_from_lru(bo);

ret = ttm_bo_reserve_locked(bo, false, true, false, 0);

if (unlikely(ret == -EBUSY)) {
spin_unlock(&glob->lru_lock);
if (likely(!no_wait))
ret = ttm_bo_wait_unreserved(bo, interruptible);

kref_put(&bo->list_kref, ttm_bo_release_list);

/**
* We *need* to retry after releasing the lru lock.
*/

if (unlikely(ret != 0))
return ret;
goto retry;
}

put_count = ttm_bo_del_from_lru(bo);
spin_unlock(&glob->lru_lock);
if (unlikely(ret != 0))
return ret;

BUG_ON(ret != 0);

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

ret = ttm_bo_evict(bo, interruptible, no_wait);
ttm_bo_unreserve(bo);

kref_put(&bo->list_kref, ttm_bo_release_list);
return ret;
}
Expand Down

0 comments on commit 9c51ba1

Please sign in to comment.