[PATCH 07/20] drm/i915/buddy: track available visible size

Thomas Hellström thomas.hellstrom at linux.intel.com
Mon Jan 31 16:12:22 UTC 2022


On 1/26/22 16:21, Matthew Auld wrote:
> Track the total amount of available visible memory, and also track
> per-resource the amount of used visible memory. For now this is useful
> for our debug output, and deciding if it is even worth calling into the
> buddy allocator. In the future tracking the per-resource visible usage
> will be useful for when deciding if we should attempt to evict certain
> buffers.
>
> Signed-off-by: Matthew Auld <matthew.auld at intel.com>
> Cc: Thomas Hellström <thomas.hellstrom at linux.intel.com>
> ---
>   drivers/gpu/drm/i915/i915_ttm_buddy_manager.c | 55 ++++++++++++++++++-
>   drivers/gpu/drm/i915/i915_ttm_buddy_manager.h |  8 ++-
>   drivers/gpu/drm/i915/intel_region_ttm.c       |  1 +
>   3 files changed, 62 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c
> index 53eb100688a6..6e5842155898 100644
> --- a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c
> +++ b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c
> @@ -19,6 +19,8 @@ struct i915_ttm_buddy_manager {
>   	struct drm_buddy mm;
>   	struct list_head reserved;
>   	struct mutex lock;
> +	unsigned long visible_size;
> +	unsigned long visible_avail;
>   	u64 default_page_size;
>   };
>   
> @@ -87,6 +89,13 @@ static int i915_ttm_buddy_man_alloc(struct ttm_resource_manager *man,
>   	n_pages = size >> ilog2(mm->chunk_size);
>   
>   	mutex_lock(&bman->lock);
> +	if (place->lpfn && place->lpfn <= bman->visible_size &&
> +	    n_pages > bman->visible_avail) {
> +		mutex_unlock(&bman->lock);
> +		err = -ENOSPC;
> +		goto err_free_res;
> +	}
> +
>   	err = drm_buddy_alloc_blocks(mm, (u64)place->fpfn << PAGE_SHIFT,
>   				    (u64)lpfn << PAGE_SHIFT,
>   				    (u64)n_pages << PAGE_SHIFT,
> @@ -107,6 +116,30 @@ static int i915_ttm_buddy_man_alloc(struct ttm_resource_manager *man,
>   		mutex_unlock(&bman->lock);
>   	}
>   
> +	if (place->lpfn && place->lpfn <= bman->visible_size) {
> +		bman_res->used_visible_size = bman_res->base.num_pages;
> +	} else {
> +		struct drm_buddy_block *block;
> +
> +		list_for_each_entry(block, &bman_res->blocks, link) {
> +			unsigned long start =
> +				drm_buddy_block_offset(block) >> PAGE_SHIFT;
> +			unsigned long end = start +
> +				(drm_buddy_block_size(mm, block) >> PAGE_SHIFT);
> +

Move this inside the if statement below? Or perhaps the compiler is 
smart enough to figure that out.


> +			if (start < bman->visible_size) {
> +				bman_res->used_visible_size +=
> +					min(end, bman->visible_size) - start;
> +			}
> +		}
> +	}

Reviewed-by: Thomas Hellstrom <thomas.hellstrom at linux.intel.com>




More information about the dri-devel mailing list