From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerome Glisse Subject: Re: [PATCH 1/2] drm/ttm: introduce utility function to free an allocated memory node Date: Mon, 09 Aug 2010 15:24:18 -0400 Message-ID: <4C6055E2.5050009@freedesktop.org> References: <1281013783-10949-1-git-send-email-skeggsb@gmail.com> <1281013783-10949-2-git-send-email-skeggsb@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from protox.org (unknown [95.130.11.66]) by gabe.freedesktop.org (Postfix) with ESMTP id 7B1829E75E for ; Mon, 9 Aug 2010 12:24:28 -0700 (PDT) In-Reply-To: <1281013783-10949-2-git-send-email-skeggsb@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org Errors-To: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org To: Ben Skeggs Cc: Ben Skeggs , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org On 08/05/2010 09:09 AM, Ben Skeggs wrote: > From: Ben Skeggs > > 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 Reviewed-by: Jerome Glisse > --- > 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 > *