On Thu, Oct 14, 2010 at 3:17 AM, Thomas Hellstrom thellstrom@vmware.com wrote:
Release the lru spinlock early.
Actually I think its this patch that introduces the recursion issue, since we still seem to hold the lock on entry into cleanup_memtype_use and not drop it at all.
Dave.
Signed-off-by: Thomas Hellstrom thellstrom@vmware.com
drivers/gpu/drm/ttm/ttm_bo.c | 30 +++++------------------------- drivers/gpu/drm/ttm/ttm_bo_manager.c | 10 ---------- include/drm/ttm/ttm_bo_driver.h | 2 -- 3 files changed, 5 insertions(+), 37 deletions(-)
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index fd8344d..7497b79 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -439,36 +439,25 @@ out_err: }
/**
- Call bo::reserved and with the lru lock held.
- Call bo::reserved.
* Will release GPU memory type usage on destruction.
- This is the place to put in driver specific hooks.
- Will release the bo::reserved lock and the
- lru lock on exit.
- This is the place to put in driver specific hooks to release
- driver private resources.
- Will release the bo::reserved lock.
*/
static void ttm_bo_cleanup_memtype_use(struct ttm_buffer_object *bo) {
- struct ttm_bo_global *glob = bo->glob;
if (bo->ttm) {
- /**
- * Release the lru_lock, since we don't want to have
- * an atomic requirement on ttm_tt[unbind|destroy].
- */
- spin_unlock(&glob->lru_lock);
ttm_tt_unbind(bo->ttm); ttm_tt_destroy(bo->ttm); bo->ttm = NULL;
- spin_lock(&glob->lru_lock);
}
- ttm_bo_mem_put_locked(bo, &bo->mem);
- ttm_bo_mem_put(bo, &bo->mem);
atomic_set(&bo->reserved, 0); wake_up_all(&bo->event_queue);
- spin_unlock(&glob->lru_lock);
}
@@ -788,15 +777,6 @@ void ttm_bo_mem_put(struct ttm_buffer_object *bo, struct ttm_mem_reg *mem) } EXPORT_SYMBOL(ttm_bo_mem_put);
-void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo, struct ttm_mem_reg *mem) -{
- struct ttm_mem_type_manager *man = &bo->bdev->man[mem->mem_type];
- if (mem->mm_node)
- (*man->func->put_node_locked)(man, mem);
-} -EXPORT_SYMBOL(ttm_bo_mem_put_locked);
/** * Repeatedly evict memory from the LRU for @mem_type until we create enough * space, or we've evicted everything and there isn't enough space. diff --git a/drivers/gpu/drm/ttm/ttm_bo_manager.c b/drivers/gpu/drm/ttm/ttm_bo_manager.c index 35c97b2..7410c19 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_manager.c +++ b/drivers/gpu/drm/ttm/ttm_bo_manager.c @@ -90,15 +90,6 @@ static void ttm_bo_man_put_node(struct ttm_mem_type_manager *man, } }
-static void ttm_bo_man_put_node_locked(struct ttm_mem_type_manager *man,
- struct ttm_mem_reg *mem)
-{
- if (mem->mm_node) {
- drm_mm_put_block(mem->mm_node);
- mem->mm_node = NULL;
- }
-}
static int ttm_bo_man_init(struct ttm_mem_type_manager *man, unsigned long p_size) { @@ -152,7 +143,6 @@ const struct ttm_mem_type_manager_func ttm_bo_manager_func = { ttm_bo_man_takedown, ttm_bo_man_get_node, ttm_bo_man_put_node,
- ttm_bo_man_put_node_locked,
ttm_bo_man_debug }; EXPORT_SYMBOL(ttm_bo_manager_func); diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index d0ff529..d01b4dd 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -214,8 +214,6 @@ struct ttm_mem_type_manager_func { struct ttm_mem_reg *mem); void (*put_node)(struct ttm_mem_type_manager *man, struct ttm_mem_reg *mem);
- void (*put_node_locked)(struct ttm_mem_type_manager *man,
- struct ttm_mem_reg *mem);
void (*debug)(struct ttm_mem_type_manager *man, const char *prefix); };
-- 1.6.2.5
dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel