On Mon, Aug 20, 2012 at 9:42 AM, Maarten Lankhorst maarten.lankhorst@canonical.com wrote:
How is this different from just calling with no_wait == false? As far as I can tell, both paths end up with the same result..
Signed-off-by: Maarten Lankhorst maarten.lankhorst@canonical.com
NAK this seriously modify the behavior. The ttm_eu_del_from_lru_locked part is important. It must happen with lru lock held and without any dropping of this lock prior to wait for bo unreserve.
Cheers, Jerome
diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c b/drivers/gpu/drm/ttm/ttm_execbuf_util.c index 3f48a46..4e7b596 100644 --- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c +++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c @@ -82,22 +82,6 @@ static void ttm_eu_list_ref_sub(struct list_head *list) } }
-static int ttm_eu_wait_unreserved_locked(struct list_head *list,
struct ttm_buffer_object *bo)
-{
struct ttm_bo_global *glob = bo->glob;
int ret;
ttm_eu_del_from_lru_locked(list);
spin_unlock(&glob->lru_lock);
ret = ttm_bo_wait_unreserved(bo, true);
spin_lock(&glob->lru_lock);
if (unlikely(ret != 0))
ttm_eu_backoff_reservation_locked(list);
return ret;
-}
void ttm_eu_backoff_reservation(struct list_head *list) { struct ttm_validate_buffer *entry; @@ -152,19 +136,10 @@ retry: list_for_each_entry(entry, list, head) { struct ttm_buffer_object *bo = entry->bo;
-retry_this_bo:
ret = ttm_bo_reserve_locked(bo, true, true, true, val_seq);
ret = ttm_bo_reserve_locked(bo, true, false, true, val_seq); switch (ret) { case 0: break;
case -EBUSY:
ret = ttm_eu_wait_unreserved_locked(list, bo);
if (unlikely(ret != 0)) {
spin_unlock(&glob->lru_lock);
ttm_eu_list_ref_sub(list);
return ret;
}
goto retry_this_bo; case -EAGAIN: ttm_eu_backoff_reservation_locked(list); spin_unlock(&glob->lru_lock);
dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel