Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Matthew Brost <matthew.brost@intel.com>
To: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
Cc: intel-xe@lists.freedesktop.org,
	"Christian König" <christian.koenig@amd.com>,
	"Somalapuram Amaranath" <Amaranath.Somalapuram@amd.com>,
	dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v3 03/21] drm/ttm: Use LRU hitches
Date: Tue, 21 May 2024 16:09:59 +0000	[thread overview]
Message-ID: <ZkzHV4vyBpkgr+Z8@DUT025-TGLU.fm.intel.com> (raw)
In-Reply-To: <20240521071639.77614-4-thomas.hellstrom@linux.intel.com>

On Tue, May 21, 2024 at 09:16:21AM +0200, Thomas Hellström wrote:
> Have iterators insert themselves into the list they are iterating
> over using hitch list nodes. Since only the iterator owner
> can remove these list nodes from the list, it's safe to unlock
> the list and when continuing, use them as a starting point. Due to
> the way LRU bumping works in TTM, newly added items will not be
> missed, and bumped items will be iterated over a second time before
> reaching the end of the list.
> 
> The exception is list with bulk move sublists. When bumping a
> sublist, a hitch that is part of that sublist will also be moved
> and we might miss items if restarting from it. This will be
> addressed in a later patch.
> 
> Changes in previous series:
> - Updated ttm_resource_cursor_fini() documentation.
> v2:
> - Don't reorder ttm_resource_manager_first() and _next().
>   (Christian König).
> - Use list_add instead of list_move
>   (Christian König)
> v3:
> - Split into two patches, one cleanup, one new functionality
>   (Christian König)
> - use ttm_resource_cursor_fini_locked() instead of open-coding
>   (Matthew Brost)
> 
> Cc: Christian König <christian.koenig@amd.com>
> Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
> Cc: Matthew Brost <matthew.brost@intel.com>

Reviewed-by: Matthew Brost <matthew.brost@intel.com>

> Cc: <dri-devel@lists.freedesktop.org>
> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> ---
>  drivers/gpu/drm/ttm/ttm_bo.c       |  1 +
>  drivers/gpu/drm/ttm/ttm_device.c   |  9 +++--
>  drivers/gpu/drm/ttm/ttm_resource.c | 56 +++++++++++++++++++++++++-----
>  include/drm/ttm/ttm_resource.h     |  9 +++--
>  4 files changed, 62 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 6396dece0db1..43eda720657f 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -621,6 +621,7 @@ int ttm_mem_evict_first(struct ttm_device *bdev,
>  		if (locked)
>  			dma_resv_unlock(res->bo->base.resv);
>  	}
> +	ttm_resource_cursor_fini_locked(&cursor);
>  
>  	if (!bo) {
>  		if (busy_bo && !ttm_bo_get_unless_zero(busy_bo))
> diff --git a/drivers/gpu/drm/ttm/ttm_device.c b/drivers/gpu/drm/ttm/ttm_device.c
> index 09411978a13a..f9e9b1ec8c8a 100644
> --- a/drivers/gpu/drm/ttm/ttm_device.c
> +++ b/drivers/gpu/drm/ttm/ttm_device.c
> @@ -170,12 +170,17 @@ int ttm_device_swapout(struct ttm_device *bdev, struct ttm_operation_ctx *ctx,
>  			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)
> +			if (!ret) {
> +				ttm_resource_cursor_fini(&cursor);
>  				return num_pages;
> -			if (ret != -EBUSY)
> +			}
> +			if (ret != -EBUSY) {
> +				ttm_resource_cursor_fini(&cursor);
>  				return ret;
> +			}
>  		}
>  	}
> +	ttm_resource_cursor_fini_locked(&cursor);
>  	spin_unlock(&bdev->lru_lock);
>  	return 0;
>  }
> diff --git a/drivers/gpu/drm/ttm/ttm_resource.c b/drivers/gpu/drm/ttm/ttm_resource.c
> index 8bfbddddc0e8..9c8b6499edfb 100644
> --- a/drivers/gpu/drm/ttm/ttm_resource.c
> +++ b/drivers/gpu/drm/ttm/ttm_resource.c
> @@ -33,6 +33,37 @@
>  
>  #include <drm/drm_util.h>
>  
> +/**
> + * ttm_resource_cursor_fini_locked() - Finalize the LRU list cursor usage
> + * @cursor: The struct ttm_resource_cursor to finalize.
> + *
> + * The function pulls the LRU list cursor off any lists it was previusly
> + * attached to. Needs to be called with the LRU lock held. The function
> + * can be called multiple times after eachother.
> + */
> +void ttm_resource_cursor_fini_locked(struct ttm_resource_cursor *cursor)
> +{
> +	lockdep_assert_held(&cursor->man->bdev->lru_lock);
> +	list_del_init(&cursor->hitch.link);
> +}
> +
> +/**
> + * ttm_resource_cursor_fini() - Finalize the LRU list cursor usage
> + * @cursor: The struct ttm_resource_cursor to finalize.
> + *
> + * The function pulls the LRU list cursor off any lists it was previusly
> + * attached to. Needs to be called without the LRU list lock held. The
> + * function can be called multiple times after eachother.
> + */
> +void ttm_resource_cursor_fini(struct ttm_resource_cursor *cursor)
> +{
> +	spinlock_t *lru_lock = &cursor->man->bdev->lru_lock;
> +
> +	spin_lock(lru_lock);
> +	ttm_resource_cursor_fini_locked(cursor);
> +	spin_unlock(lru_lock);
> +}
> +
>  /**
>   * ttm_lru_bulk_move_init - initialize a bulk move structure
>   * @bulk: the structure to init
> @@ -485,12 +516,15 @@ void ttm_resource_manager_debug(struct ttm_resource_manager *man,
>  EXPORT_SYMBOL(ttm_resource_manager_debug);
>  
>  /**
> - * ttm_resource_manager_first
> - *
> + * ttm_resource_manager_first() - Start iterating over the resources
> + * of a resource manager
>   * @man: resource manager to iterate over
>   * @cursor: cursor to record the position
>   *
> - * Returns the first resource from the resource manager.
> + * Initializes the cursor and starts iterating. When done iterating,
> + * the caller must explicitly call ttm_resource_cursor_fini().
> + *
> + * Return: The first resource from the resource manager.
>   */
>  struct ttm_resource *
>  ttm_resource_manager_first(struct ttm_resource_manager *man,
> @@ -500,13 +534,15 @@ ttm_resource_manager_first(struct ttm_resource_manager *man,
>  
>  	cursor->priority = 0;
>  	cursor->man = man;
> -	cursor->cur = &man->lru[cursor->priority];
> +	ttm_lru_item_init(&cursor->hitch, TTM_LRU_HITCH);
> +	list_add(&cursor->hitch.link, &man->lru[cursor->priority]);
> +
>  	return ttm_resource_manager_next(cursor);
>  }
>  
>  /**
> - * ttm_resource_manager_next
> - *
> + * ttm_resource_manager_next() - Continue iterating over the resource manager
> + * resources
>   * @cursor: cursor to record the position
>   *
>   * Return: the next resource from the resource manager.
> @@ -520,10 +556,10 @@ ttm_resource_manager_next(struct ttm_resource_cursor *cursor)
>  	lockdep_assert_held(&man->bdev->lru_lock);
>  
>  	for (;;) {
> -		lru = list_entry(cursor->cur, typeof(*lru), link);
> +		lru = &cursor->hitch;
>  		list_for_each_entry_continue(lru, &man->lru[cursor->priority], link) {
>  			if (ttm_lru_item_is_res(lru)) {
> -				cursor->cur = &lru->link;
> +				list_move(&cursor->hitch.link, &lru->link);
>  				return ttm_lru_item_to_res(lru);
>  			}
>  		}
> @@ -531,9 +567,11 @@ ttm_resource_manager_next(struct ttm_resource_cursor *cursor)
>  		if (++cursor->priority >= TTM_MAX_BO_PRIORITY)
>  			break;
>  
> -		cursor->cur = &man->lru[cursor->priority];
> +		list_move(&cursor->hitch.link, &man->lru[cursor->priority]);
>  	}
>  
> +	ttm_resource_cursor_fini_locked(cursor);
> +
>  	return NULL;
>  }
>  
> diff --git a/include/drm/ttm/ttm_resource.h b/include/drm/ttm/ttm_resource.h
> index 7d81fd5b5b83..8fac781f641e 100644
> --- a/include/drm/ttm/ttm_resource.h
> +++ b/include/drm/ttm/ttm_resource.h
> @@ -273,17 +273,22 @@ ttm_lru_item_to_res(struct ttm_lru_item *item)
>   * struct ttm_resource_cursor
>   *
>   * @man: The resource manager currently being iterated over.
> - * @cur: The list head the cursor currently points to.
> + * @hitch: A hitch list node inserted before the next resource
> + * to iterate over.
>   * @priority: the current priority
>   *
>   * Cursor to iterate over the resources in a manager.
>   */
>  struct ttm_resource_cursor {
>  	struct ttm_resource_manager *man;
> -	struct list_head *cur;
> +	struct ttm_lru_item hitch;
>  	unsigned int priority;
>  };
>  
> +void ttm_resource_cursor_fini_locked(struct ttm_resource_cursor *cursor);
> +
> +void ttm_resource_cursor_fini(struct ttm_resource_cursor *cursor);
> +
>  /**
>   * struct ttm_lru_bulk_move_pos
>   *
> -- 
> 2.44.0
> 

  reply	other threads:[~2024-05-21 16:10 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-21  7:16 [PATCH v3 00/21] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
2024-05-21  7:16 ` [PATCH v3 01/21] drm/ttm: Allow TTM LRU list nodes of different types Thomas Hellström
2024-05-21 13:12   ` Matthew Brost
2024-05-28  9:16   ` Christian König
2024-05-21  7:16 ` [PATCH v3 02/21] drm/ttm: Slightly clean up LRU list iteration Thomas Hellström
2024-05-21 15:39   ` Matthew Brost
2024-05-28  9:19   ` Christian König
2024-05-21  7:16 ` [PATCH v3 03/21] drm/ttm: Use LRU hitches Thomas Hellström
2024-05-21 16:09   ` Matthew Brost [this message]
2024-05-21  7:16 ` [PATCH v3 04/21] drm/ttm, drm/amdgpu, drm/xe: Consider hitch moves within bulk sublist moves Thomas Hellström
2024-05-21  7:16 ` [PATCH v3 05/21] drm/ttm: Provide a generic LRU walker helper Thomas Hellström
2024-05-21  7:16 ` [PATCH v3 06/21] drm/ttm: Use the LRU walker helper for swapping Thomas Hellström
2024-05-21  7:16 ` [PATCH v3 07/21] drm/ttm: Use the LRU walker for eviction Thomas Hellström
2024-05-21  7:16 ` [PATCH v3 08/21] drm/ttm: Add a virtual base class for graphics memory backup Thomas Hellström
2024-05-21  7:16 ` [PATCH v3 09/21] drm/ttm/pool: Provide a helper to shrink pages Thomas Hellström
2024-05-21  7:16 ` [PATCH v3 10/21] drm/ttm: Use fault-injection to test error paths Thomas Hellström
2024-05-21  7:16 ` [PATCH v3 11/21] drm/ttm, drm/xe: Add a shrinker for xe bos Thomas Hellström
2024-05-21  7:16 ` [RFC PATCH v3 12/21] dma-buf/dma-resv: Introduce dma_resv_trylock_ctx() Thomas Hellström
2024-05-21  7:16 ` [RFC PATCH v3 13/21] drm/exec: Rework contended locking Thomas Hellström
2024-05-22  5:52   ` Christian König
2024-05-22 14:32     ` Thomas Hellström
2024-05-22 16:52       ` Christian König
2024-05-22 17:42         ` Thomas Hellström
2024-05-28  6:36           ` Thomas Hellström
2024-05-28  6:51             ` Christian König
2024-05-28  8:07               ` Thomas Hellström
2024-05-28 11:03                 ` Christian König
2024-05-29  7:18                   ` Thomas Hellström
2024-05-21  7:16 ` [RFC PATCH v3 14/21] drm/exec: Introduce a drm_exec_trylock_obj() function Thomas Hellström
2024-05-21  7:16 ` [RFC PATCH v3 15/21] drm/exec: Add a snapshot capability Thomas Hellström
2024-05-22 11:27   ` Christian König
2024-05-22 13:54     ` Thomas Hellström
2024-05-22 14:41       ` Thomas Hellström
2024-05-21  7:16 ` [RFC PATCH v3 16/21] drm/exec: Introduce an evict mode Thomas Hellström
2024-05-22 13:28   ` Christian König
2024-05-22 13:44     ` Thomas Hellström
2024-05-21  7:16 ` [RFC PATCH v3 17/21] drm/ttm: Support drm_exec locking for eviction and swapping Thomas Hellström
2024-05-21  7:16 ` [RFC PATCH v3 18/21] drm/ttm: Convert ttm vm to using drm_exec Thomas Hellström
2024-05-21  7:16 ` [RFC PATCH v3 19/21] drm/xe: Use drm_exec for fault locking Thomas Hellström
2024-05-21  7:16 ` [RFC PATCH v3 20/21] drm/ttm: Use drm_exec_trylock for bo initialization Thomas Hellström
2024-05-21  7:16 ` [RFC PATCH v3 21/21] drm/xe: Initial support for drm exec locking during validate Thomas Hellström
2024-05-21  7:22 ` [PATCH v3 00/21] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
2024-05-21  7:23 ` ✓ CI.Patch_applied: success for TTM shrinker helpers and xe buffer object shrinker (rev3) Patchwork
2024-05-21  7:24 ` ✗ CI.checkpatch: warning " Patchwork
2024-05-21  7:25 ` ✓ CI.KUnit: success " Patchwork
2024-05-21  7:37 ` ✓ CI.Build: " Patchwork
2024-05-21  7:39 ` ✗ CI.Hooks: failure " Patchwork
2024-05-21  7:41 ` ✗ CI.checksparse: warning " Patchwork
2024-05-21  8:03 ` ✓ CI.BAT: success " Patchwork
2024-05-21  9:09 ` ✗ CI.FULL: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZkzHV4vyBpkgr+Z8@DUT025-TGLU.fm.intel.com \
    --to=matthew.brost@intel.com \
    --cc=Amaranath.Somalapuram@amd.com \
    --cc=christian.koenig@amd.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=thomas.hellstrom@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox