diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_device.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_resource.c | 52 | 
3 files changed, 55 insertions, 25 deletions
| diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 75d308ec173d..406e9c324e76 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -109,11 +109,11 @@ void ttm_bo_set_bulk_move(struct ttm_buffer_object *bo,  		return;  	spin_lock(&bo->bdev->lru_lock); -	if (bo->bulk_move && bo->resource) -		ttm_lru_bulk_move_del(bo->bulk_move, bo->resource); +	if (bo->resource) +		ttm_resource_del_bulk_move(bo->resource, bo);  	bo->bulk_move = bulk; -	if (bo->bulk_move && bo->resource) -		ttm_lru_bulk_move_add(bo->bulk_move, bo->resource); +	if (bo->resource) +		ttm_resource_add_bulk_move(bo->resource, bo);  	spin_unlock(&bo->bdev->lru_lock);  }  EXPORT_SYMBOL(ttm_bo_set_bulk_move); @@ -689,8 +689,11 @@ void ttm_bo_pin(struct ttm_buffer_object *bo)  {  	dma_resv_assert_held(bo->base.resv);  	WARN_ON_ONCE(!kref_read(&bo->kref)); -	if (!(bo->pin_count++) && bo->bulk_move && bo->resource) -		ttm_lru_bulk_move_del(bo->bulk_move, bo->resource); +	spin_lock(&bo->bdev->lru_lock); +	if (bo->resource) +		ttm_resource_del_bulk_move(bo->resource, bo); +	++bo->pin_count; +	spin_unlock(&bo->bdev->lru_lock);  }  EXPORT_SYMBOL(ttm_bo_pin); @@ -707,8 +710,11 @@ void ttm_bo_unpin(struct ttm_buffer_object *bo)  	if (WARN_ON_ONCE(!bo->pin_count))  		return; -	if (!(--bo->pin_count) && bo->bulk_move && bo->resource) -		ttm_lru_bulk_move_add(bo->bulk_move, bo->resource); +	spin_lock(&bo->bdev->lru_lock); +	--bo->pin_count; +	if (bo->resource) +		ttm_resource_add_bulk_move(bo->resource, bo); +	spin_unlock(&bo->bdev->lru_lock);  }  EXPORT_SYMBOL(ttm_bo_unpin); diff --git a/drivers/gpu/drm/ttm/ttm_device.c b/drivers/gpu/drm/ttm/ttm_device.c index a0562ab386f5..e7147e304637 100644 --- a/drivers/gpu/drm/ttm/ttm_device.c +++ b/drivers/gpu/drm/ttm/ttm_device.c @@ -156,8 +156,12 @@ int ttm_device_swapout(struct ttm_device *bdev, struct ttm_operation_ctx *ctx,  		ttm_resource_manager_for_each_res(man, &cursor, res) {  			struct ttm_buffer_object *bo = res->bo; -			uint32_t num_pages = PFN_UP(bo->base.size); +			uint32_t num_pages; +			if (!bo) +				continue; + +			num_pages = PFN_UP(bo->base.size);  			ret = ttm_bo_swapout(bo, ctx, gfp_flags);  			/* ttm_bo_swapout has dropped the lru_lock */  			if (!ret) diff --git a/drivers/gpu/drm/ttm/ttm_resource.c b/drivers/gpu/drm/ttm/ttm_resource.c index 65889b3caf50..20f9adcc3235 100644 --- a/drivers/gpu/drm/ttm/ttm_resource.c +++ b/drivers/gpu/drm/ttm/ttm_resource.c @@ -91,8 +91,8 @@ static void ttm_lru_bulk_move_pos_tail(struct ttm_lru_bulk_move_pos *pos,  }  /* Add the resource to a bulk_move cursor */ -void ttm_lru_bulk_move_add(struct ttm_lru_bulk_move *bulk, -			   struct ttm_resource *res) +static void ttm_lru_bulk_move_add(struct ttm_lru_bulk_move *bulk, +				  struct ttm_resource *res)  {  	struct ttm_lru_bulk_move_pos *pos = ttm_lru_bulk_move_pos(bulk, res); @@ -105,8 +105,8 @@ void ttm_lru_bulk_move_add(struct ttm_lru_bulk_move *bulk,  }  /* Remove the resource from a bulk_move range */ -void ttm_lru_bulk_move_del(struct ttm_lru_bulk_move *bulk, -			   struct ttm_resource *res) +static void ttm_lru_bulk_move_del(struct ttm_lru_bulk_move *bulk, +				  struct ttm_resource *res)  {  	struct ttm_lru_bulk_move_pos *pos = ttm_lru_bulk_move_pos(bulk, res); @@ -122,6 +122,22 @@ void ttm_lru_bulk_move_del(struct ttm_lru_bulk_move *bulk,  	}  } +/* Add the resource to a bulk move if the BO is configured for it */ +void ttm_resource_add_bulk_move(struct ttm_resource *res, +				struct ttm_buffer_object *bo) +{ +	if (bo->bulk_move && !bo->pin_count) +		ttm_lru_bulk_move_add(bo->bulk_move, res); +} + +/* Remove the resource from a bulk move if the BO is configured for it */ +void ttm_resource_del_bulk_move(struct ttm_resource *res, +				struct ttm_buffer_object *bo) +{ +	if (bo->bulk_move && !bo->pin_count) +		ttm_lru_bulk_move_del(bo->bulk_move, res); +} +  /* Move a resource to the LRU or bulk tail */  void ttm_resource_move_to_lru_tail(struct ttm_resource *res)  { @@ -169,15 +185,14 @@ void ttm_resource_init(struct ttm_buffer_object *bo,  	res->bus.is_iomem = false;  	res->bus.caching = ttm_cached;  	res->bo = bo; -	INIT_LIST_HEAD(&res->lru);  	man = ttm_manager_type(bo->bdev, place->mem_type);  	spin_lock(&bo->bdev->lru_lock); -	man->usage += res->num_pages << PAGE_SHIFT; -	if (bo->bulk_move) -		ttm_lru_bulk_move_add(bo->bulk_move, res); +	if (bo->pin_count) +		list_add_tail(&res->lru, &bo->bdev->pinned);  	else -		ttm_resource_move_to_lru_tail(res); +		list_add_tail(&res->lru, &man->lru[bo->priority]); +	man->usage += res->num_pages << PAGE_SHIFT;  	spin_unlock(&bo->bdev->lru_lock);  }  EXPORT_SYMBOL(ttm_resource_init); @@ -210,8 +225,16 @@ int ttm_resource_alloc(struct ttm_buffer_object *bo,  {  	struct ttm_resource_manager *man =  		ttm_manager_type(bo->bdev, place->mem_type); +	int ret; + +	ret = man->func->alloc(man, bo, place, res_ptr); +	if (ret) +		return ret; -	return man->func->alloc(man, bo, place, res_ptr); +	spin_lock(&bo->bdev->lru_lock); +	ttm_resource_add_bulk_move(*res_ptr, bo); +	spin_unlock(&bo->bdev->lru_lock); +	return 0;  }  void ttm_resource_free(struct ttm_buffer_object *bo, struct ttm_resource **res) @@ -221,12 +244,9 @@ void ttm_resource_free(struct ttm_buffer_object *bo, struct ttm_resource **res)  	if (!*res)  		return; -	if (bo->bulk_move) { -		spin_lock(&bo->bdev->lru_lock); -		ttm_lru_bulk_move_del(bo->bulk_move, *res); -		spin_unlock(&bo->bdev->lru_lock); -	} - +	spin_lock(&bo->bdev->lru_lock); +	ttm_resource_del_bulk_move(*res, bo); +	spin_unlock(&bo->bdev->lru_lock);  	man = ttm_manager_type(bo->bdev, (*res)->mem_type);  	man->func->free(man, *res);  	*res = NULL; | 
