On Thu, Oct 14, 2010 at 3:17 AM, Thomas Hellstrom <thellstrom at 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 at 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 at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel >