Re: [Intel-gfx] [PATCH 07/20] drm/i915/buddy: track available visible size

Thomas Hellström
2022-01-31T16:12:41Z

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@intel.com>
> Cc: Thomas Hellström <thomas.hellstrom@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@linux.intel.com>