On 08/05/2010 09:09 AM, Ben Skeggs wrote: > From: Ben Skeggs <bskeggs@xxxxxxxxxx> > > Existing core code/drivers call drm_mm_put_block on ttm_mem_reg.mm_node > directly. Future patches will modify TTM behaviour in such a way that > ttm_mem_reg.mm_node doesn't necessarily belong to drm_mm. > > Signed-off-by: Ben Skeggs <bskeggs@xxxxxxxxxx> Reviewed-by: Jerome Glisse <jglisse@xxxxxxxxxx> > --- > drivers/gpu/drm/nouveau/nouveau_bo.c | 14 ++------------ > drivers/gpu/drm/radeon/radeon_ttm.c | 18 ++---------------- > drivers/gpu/drm/ttm/ttm_bo.c | 26 +++++++++++++++----------- > drivers/gpu/drm/ttm/ttm_bo_util.c | 9 +-------- > include/drm/ttm/ttm_bo_driver.h | 4 ++++ > 5 files changed, 24 insertions(+), 47 deletions(-) > > diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c > index 3ca8343..92290fa 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_bo.c > +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c > @@ -597,12 +597,7 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr, > > ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu, new_mem); > out: > - if (tmp_mem.mm_node) { > - spin_lock(&bo->bdev->glob->lru_lock); > - drm_mm_put_block(tmp_mem.mm_node); > - spin_unlock(&bo->bdev->glob->lru_lock); > - } > - > + ttm_bo_mem_put(bo, &tmp_mem); > return ret; > } > > @@ -635,12 +630,7 @@ nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr, > goto out; > > out: > - if (tmp_mem.mm_node) { > - spin_lock(&bo->bdev->glob->lru_lock); > - drm_mm_put_block(tmp_mem.mm_node); > - spin_unlock(&bo->bdev->glob->lru_lock); > - } > - > + ttm_bo_mem_put(bo, &tmp_mem); > return ret; > } > > diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c > index 84c53e4..cc19aba 100644 > --- a/drivers/gpu/drm/radeon/radeon_ttm.c > +++ b/drivers/gpu/drm/radeon/radeon_ttm.c > @@ -326,14 +326,7 @@ static int radeon_move_vram_ram(struct ttm_buffer_object *bo, > } > r = ttm_bo_move_ttm(bo, true, no_wait_reserve, no_wait_gpu, new_mem); > out_cleanup: > - if (tmp_mem.mm_node) { > - struct ttm_bo_global *glob = rdev->mman.bdev.glob; > - > - spin_lock(&glob->lru_lock); > - drm_mm_put_block(tmp_mem.mm_node); > - spin_unlock(&glob->lru_lock); > - return r; > - } > + ttm_bo_mem_put(bo, &tmp_mem); > return r; > } > > @@ -372,14 +365,7 @@ static int radeon_move_ram_vram(struct ttm_buffer_object *bo, > goto out_cleanup; > } > out_cleanup: > - if (tmp_mem.mm_node) { > - struct ttm_bo_global *glob = rdev->mman.bdev.glob; > - > - spin_lock(&glob->lru_lock); > - drm_mm_put_block(tmp_mem.mm_node); > - spin_unlock(&glob->lru_lock); > - return r; > - } > + ttm_bo_mem_put(bo, &tmp_mem); > return r; > } > > diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c > index cb4cf7e..80d37b4 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo.c > +++ b/drivers/gpu/drm/ttm/ttm_bo.c > @@ -475,11 +475,8 @@ static int ttm_bo_cleanup_refs(struct ttm_buffer_object *bo, bool remove_all) > list_del_init(&bo->ddestroy); > ++put_count; > } > - if (bo->mem.mm_node) { > - drm_mm_put_block(bo->mem.mm_node); > - bo->mem.mm_node = NULL; > - } > spin_unlock(&glob->lru_lock); > + ttm_bo_mem_put(bo, &bo->mem); > > atomic_set(&bo->reserved, 0); > > @@ -621,7 +618,6 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible, > bool no_wait_reserve, bool no_wait_gpu) > { > struct ttm_bo_device *bdev = bo->bdev; > - struct ttm_bo_global *glob = bo->glob; > struct ttm_mem_reg evict_mem; > struct ttm_placement placement; > int ret = 0; > @@ -667,12 +663,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible, > if (ret) { > if (ret != -ERESTARTSYS) > printk(KERN_ERR TTM_PFX "Buffer eviction failed\n"); > - spin_lock(&glob->lru_lock); > - if (evict_mem.mm_node) { > - drm_mm_put_block(evict_mem.mm_node); > - evict_mem.mm_node = NULL; > - } > - spin_unlock(&glob->lru_lock); > + ttm_bo_mem_put(bo, &evict_mem); > goto out; > } > bo->evicted = true; > @@ -769,6 +760,19 @@ static int ttm_bo_man_get_node(struct ttm_buffer_object *bo, > return 0; > } > > +void ttm_bo_mem_put(struct ttm_buffer_object *bo, struct ttm_mem_reg *mem) > +{ > + struct ttm_bo_global *glob = bo->glob; > + > + if (mem->mm_node) { > + spin_lock(&glob->lru_lock); > + drm_mm_put_block(mem->mm_node); > + spin_unlock(&glob->lru_lock); > + mem->mm_node = NULL; > + } > +} > +EXPORT_SYMBOL(ttm_bo_mem_put); > + > /** > * 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_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c > index 7cffb3e..0ebfe0d 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo_util.c > +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c > @@ -39,14 +39,7 @@ > > void ttm_bo_free_old_node(struct ttm_buffer_object *bo) > { > - struct ttm_mem_reg *old_mem = &bo->mem; > - > - if (old_mem->mm_node) { > - spin_lock(&bo->glob->lru_lock); > - drm_mm_put_block(old_mem->mm_node); > - spin_unlock(&bo->glob->lru_lock); > - } > - old_mem->mm_node = NULL; > + ttm_bo_mem_put(bo, &bo->mem); > } > > int ttm_bo_move_ttm(struct ttm_buffer_object *bo, > diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h > index b875042..6c694d8 100644 > --- a/include/drm/ttm/ttm_bo_driver.h > +++ b/include/drm/ttm/ttm_bo_driver.h > @@ -649,6 +649,10 @@ extern int ttm_bo_mem_space(struct ttm_buffer_object *bo, > struct ttm_mem_reg *mem, > bool interruptible, > bool no_wait_reserve, bool no_wait_gpu); > + > +extern void ttm_bo_mem_put(struct ttm_buffer_object *bo, > + struct ttm_mem_reg *mem); > + > /** > * ttm_bo_wait_for_cpu > * _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel