mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
To: Matthew Brost <matthew.brost@intel.com>
Cc: intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
	"Carlos Santa" <carlos.santa@intel.com>,
	"Ryan Neph" <ryanneph@google.com>,
	"Christian Koenig" <christian.koenig@amd.com>,
	"Huang Rui" <ray.huang@amd.com>,
	"Matthew Auld" <matthew.auld@intel.com>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"David Airlie" <airlied@gmail.com>,
	"Simona Vetter" <simona@ffwll.ch>,
	linux-kernel@vger.kernel.org,
	"Thomas Hellström" <thomas.hellstrom@linux.intel.com>
Subject: Re: [PATCH v3 22/33] drm/xe: Add Kconfig.profile options for BO defrag configuration
Date: Sun, 8 Nov 2026 17:31:07 -0800	[thread overview]
Message-ID: <avEiW3AKOAi8Gy3C@nvishwa1-desk> (raw)
In-Reply-To: <20260711025619.2540575-23-matthew.brost@intel.com>

On Fri, Jul 10, 2026 at 07:56:08PM -0700, Matthew Brost wrote:
>Add Kconfig.profile options to make XE_BO_DEFRAG_* defines configurable:
>- DRM_XE_BO_DEFRAG_RECLAIM_BACKOFF_THRESHOLD: Threshold for TTM reclaim
>  backoff
>- DRM_XE_BO_DEFRAG_SIZE_LIMIT: Maximum number of bytes to defrag per
>  work run
>- DRM_XE_BO_DEFRAG_INTERVAL_MS: Default delay before defrag worker runs
>- DRM_XE_BO_DEFRAG_INTERVAL_MAX_MS: Upper bound for defrag worker
>  interval
>

Assisted-by: LLM

NIT...Would runtime knobs be useful than these compile time knobs?

>Update xe_bo.c to use these Kconfig options as defaults via #ifdef
>guards, maintaining backward compatibility with hardcoded values when
>not configured.
>
>Additionally, disable defrag completely when XE_BO_DEFRAG_SIZE_LIMIT is
>set less than 2M by returning early from xe_bo_defrag_update() (and
>xe_bo_defrag_remove()) so BOs are never added to the defrag list or the
>worker kicked; xe_bo_defrag_add() and xe_bo_defrag_schedule() assert the
>limit is at least 2M.
>
>Cc: Carlos Santa <carlos.santa@intel.com>
>Cc: Ryan Neph <ryanneph@google.com>
>Cc: Christian Koenig <christian.koenig@amd.com>
>Cc: Huang Rui <ray.huang@amd.com>
>Cc: Matthew Auld <matthew.auld@intel.com>
>Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>Cc: Maxime Ripard <mripard@kernel.org>
>Cc: Thomas Zimmermann <tzimmermann@suse.de>
>Cc: David Airlie <airlied@gmail.com>
>Cc: Simona Vetter <simona@ffwll.ch>
>Cc: dri-devel@lists.freedesktop.org
>Cc: linux-kernel@vger.kernel.org
>Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>Assisted-by: GitHub_Copilot:claude-haiku-4.5
>Signed-off-by: Matthew Brost <matthew.brost@intel.com>
>---
> drivers/gpu/drm/xe/Kconfig.profile | 40 ++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_bo.c         | 26 +++++++++++++++++++
> 2 files changed, 66 insertions(+)
>
>diff --git a/drivers/gpu/drm/xe/Kconfig.profile b/drivers/gpu/drm/xe/Kconfig.profile
>index e07517d120e0..e0aade41f53e 100644
>--- a/drivers/gpu/drm/xe/Kconfig.profile
>+++ b/drivers/gpu/drm/xe/Kconfig.profile
>@@ -74,3 +74,43 @@ config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
> 	  to apply to applicable user. For elevated user, all above MIN
> 	  and MAX values will apply when this configuration is enable to
> 	  apply limitation. By default limitation is applied.
>+
>+config DRM_XE_BO_DEFRAG_RECLAIM_BACKOFF_THRESHOLD
>+	int "BO defrag reclaim backoff threshold"
>+	default 2
>+	range 1 1000

Is the value of 1 intended here? As mentioned in patch 16, this will
reinforce the self backoff loop.

NIT...Also the max value of the range here and below seems too higher
than the default value. Not sure if that is intended.

>+	help
>+	  Once this many BOs are tracked on the device defrag list (i.e. were
>+	  backed with a sub-optimal page order), request that the TTM pool backs
>+	  off from aggressive reclaim at the beneficial order during populate,
>+	  so that allocations make forward progress instead of stalling.
>+
>+config DRM_XE_BO_DEFRAG_SIZE_LIMIT
>+	int "Maximum bytes to defrag per work run"
>+	default 33554432
>+	range 0 1073741824
>+	help
>+	  Maximum number of bytes the defrag worker will process in a single run
>+	  before yielding and rescheduling itself. Set to less than large page
>+	  size (2M) to disable defrag. A defrag move synchronously reallocates
>+	  and re-copies a BO's backing store, which is not free. If a large
>+	  number of BOs become eligible at once, processing them all in one
>+	  worker run would hold things up for a long, unbounded stretch.
>+	  Instead, cap the work done per run and requeue, spreading the defrag
>+	  effort out over time.
>+

The disable mechanism is confusing (0 to 2MB). May be add a separate runtime
knob for enable/disable and change the range here to start from 2MB?

>+config DRM_XE_BO_DEFRAG_INTERVAL_MS
>+	int "Default delay before defrag worker run (ms)"
>+	default 25
>+	range 1 1000
>+	help
>+	  Default delay before (re)running the defrag worker, in milliseconds.
>+
>+config DRM_XE_BO_DEFRAG_INTERVAL_MAX_MS
>+	int "Upper bound for defrag worker interval (ms)"
>+	default 15000
>+	range 100 1000000

The range here overlaps with that of DRM_XE_BO_DEFRAG_INTERVAL_MS and it
accepts value lower than that of DRM_XE_BO_DEFRAG_INTERVAL_MS.

>+	help
>+	  Upper bound for the (exponentially backed off) defrag worker interval,
>+	  in milliseconds, so repeated failures don't push the retry arbitrarily
>+	  far out. 15000 ms = 15 seconds.
>diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>index 073d926ef9ac..0bdd1c920404 100644
>--- a/drivers/gpu/drm/xe/xe_bo.c
>+++ b/drivers/gpu/drm/xe/xe_bo.c
>@@ -49,7 +49,11 @@
>  * aggressive reclaim at the beneficial order during populate, so that
>  * allocations make forward progress instead of stalling.
>  */
>+#ifdef CONFIG_DRM_XE_BO_DEFRAG_RECLAIM_BACKOFF_THRESHOLD
>+#define XE_BO_DEFRAG_RECLAIM_BACKOFF_THRESHOLD	CONFIG_DRM_XE_BO_DEFRAG_RECLAIM_BACKOFF_THRESHOLD
>+#else
> #define XE_BO_DEFRAG_RECLAIM_BACKOFF_THRESHOLD	2
>+#endif
>

Looks like The 'ifdef's are redundent here as the config params without any
dependency take the default value and hence will always turn out to be true.

> /*
>  * Maximum number of bytes of newly (re)allocated backing the defrag worker will
>@@ -65,17 +69,31 @@
>  * Only pages a move truly reallocates are charged; pages harvested from the old
>  * backing are free, so an object larger than the budget is upgraded in
>  * budget-sized slices across runs.
>+ *
>+ * Set to 0 to disable defrag completely.
>  */
>+#ifdef CONFIG_DRM_XE_BO_DEFRAG_SIZE_LIMIT
>+#define XE_BO_DEFRAG_SIZE_LIMIT			CONFIG_DRM_XE_BO_DEFRAG_SIZE_LIMIT
>+#else
> #define XE_BO_DEFRAG_SIZE_LIMIT			SZ_32M
>+#endif
>
> /* Default delay before (re)running the defrag worker, in milliseconds. */
>+#ifdef CONFIG_DRM_XE_BO_DEFRAG_INTERVAL_MS
>+#define XE_BO_DEFRAG_INTERVAL_MS		CONFIG_DRM_XE_BO_DEFRAG_INTERVAL_MS
>+#else
> #define XE_BO_DEFRAG_INTERVAL_MS		25
>+#endif
>
> /*
>  * Upper bound for the (exponentially backed off) defrag worker interval, in
>  * milliseconds, so repeated failures don't push the retry arbitrarily far out.
>  */
>+#ifdef CONFIG_DRM_XE_BO_DEFRAG_INTERVAL_MAX_MS
>+#define XE_BO_DEFRAG_INTERVAL_MAX_MS		CONFIG_DRM_XE_BO_DEFRAG_INTERVAL_MAX_MS
>+#else
> #define XE_BO_DEFRAG_INTERVAL_MAX_MS		15000	/* 15 seconds */
>+#endif
>
> static void xe_bo_defrag_worker(struct work_struct *w);
> static void xe_place_from_ttm_type(u32 mem_type, struct ttm_place *place);
>@@ -1126,6 +1144,7 @@ int xe_bo_defrag_init(struct xe_device *xe)
>
> static void xe_bo_defrag_schedule(struct xe_device *xe)
> {
>+	xe_assert(xe, XE_BO_DEFRAG_SIZE_LIMIT >= SZ_2M);
> 	schedule_delayed_work(&xe->mem.defrag.worker,
> 			      msecs_to_jiffies(xe->mem.defrag.interval_ms));
> }
>@@ -1152,6 +1171,7 @@ static void xe_bo_defrag_add(struct xe_bo *bo)
>
> 	xe_bo_assert_held(bo);
> 	xe_assert(xe, xe_bo_needs_defrag(bo));
>+	xe_assert(xe, XE_BO_DEFRAG_SIZE_LIMIT >= SZ_2M);

xe_bo_defrag_init_early and xe_bo_defrag_init still runs if defrag is
disabled which can be avoided.

Niranjana

>
> 	scoped_guard(spinlock, &xe->mem.defrag.lock) {
> 		if (list_empty(&bo->defrag_link)) {
>@@ -1185,6 +1205,9 @@ static void xe_bo_defrag_remove(struct xe_bo *bo)
> {
> 	xe_bo_assert_held(bo);
>
>+	if (XE_BO_DEFRAG_SIZE_LIMIT < SZ_2M)
>+		return;
>+
> 	if (list_empty(&bo->defrag_link))
> 		return;
>
>@@ -1204,6 +1227,9 @@ static void xe_bo_defrag_update(struct xe_bo *bo)
> {
> 	xe_bo_assert_held(bo);
>
>+	if (XE_BO_DEFRAG_SIZE_LIMIT < SZ_2M)
>+		return;
>+
> 	if (xe_bo_needs_defrag(bo))
> 		xe_bo_defrag_add(bo);
> 	else
>-- 
>2.34.1
>

  reply	other threads:[~2026-11-09  1:31 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-11  2:55 [PATCH v3 00/33] drm/ttm, drm/xe: Minimize dma-resv hold times and defragment sub-optimally backed BOs Matthew Brost
2026-07-11  2:55 ` [PATCH v3 01/33] drm/ttm/pool: Allow backing off reclaim at the beneficial order Matthew Brost
2026-11-06  2:55   ` Niranjana Vishwanathapura
2026-07-11  2:55 ` [PATCH v3 02/33] drm/ttm/pool: Add ttm_pool_page_order_nodma() helper Matthew Brost
2026-11-05 11:27   ` Matthew Auld
2026-11-06  2:30   ` Niranjana Vishwanathapura
2026-07-11  2:55 ` [PATCH v3 03/33] drm/ttm: Record sub-optimal page order allocations in ttm_tt Matthew Brost
2026-11-06  2:34   ` Niranjana Vishwanathapura
2026-11-06 20:06     ` Matthew Brost
2026-07-11  2:55 ` [PATCH v3 04/33] drm/ttm: Introduce ttm_pool_alloc_iter for __ttm_pool_alloc() Matthew Brost
2026-11-06  2:39   ` Niranjana Vishwanathapura
2026-07-11  2:55 ` [PATCH v3 05/33] drm/ttm: Support defragmentation moves Matthew Brost
2026-11-06  2:51   ` Niranjana Vishwanathapura
2026-07-11  2:55 ` [PATCH v3 06/33] drm/ttm: Add fault injection for beneficial-order allocation failures Matthew Brost
2026-11-06  2:54   ` Niranjana Vishwanathapura
2026-07-11  2:55 ` [PATCH v3 07/33] drm/ttm: Harvest beneficial-order pages on defragmentation moves Matthew Brost
2026-07-11  2:55 ` [PATCH v3 08/33] drm/ttm: Bound page (re)allocation per defragmentation move Matthew Brost
2026-07-11  2:55 ` [PATCH v3 09/33] drm/ttm: Preallocate beneficial-order defrag pages outside the lock Matthew Brost
2026-07-11  2:55 ` [PATCH v3 10/33] drm/ttm: Add full out-of-lock preallocation for ttm_pool_alloc() Matthew Brost
2026-07-11  2:56 ` [PATCH v3 15/33] drm/xe: Track BOs backed at a sub-optimal page order Matthew Brost
2026-11-07  4:49   ` Niranjana Vishwanathapura
2026-07-11  2:56 ` [PATCH v3 16/33] drm/xe: Back off beneficial-order reclaim under defrag pressure Matthew Brost
2026-11-07  5:02   ` Niranjana Vishwanathapura
2026-07-11  2:56 ` [PATCH v3 17/33] drm/xe: Add xe_migrate_copy_defrag() for on-GPU defrag copies Matthew Brost
2026-11-03 12:58   ` Matthew Auld
2026-11-03 20:08     ` Matthew Brost
2026-11-04 12:37       ` Matthew Auld
2026-11-07  5:07   ` Niranjana Vishwanathapura
2026-07-11  2:56 ` [PATCH v3 18/33] drm/xe: Handle defrag moves in xe_bo_move() Matthew Brost
2026-11-07  5:12   ` Niranjana Vishwanathapura
2026-07-11  2:56 ` [PATCH v3 19/33] drm/xe: Skip self-copies for borrowed pages on defrag moves Matthew Brost
2026-07-11  2:56 ` [PATCH v3 20/33] drm/xe: Add a page defragmentation worker Matthew Brost
2026-11-07  5:27   ` Niranjana Vishwanathapura
2026-07-11  2:56 ` [PATCH v3 21/33] drm/xe: Add defrag GT stats Matthew Brost
2026-11-09  1:10   ` Niranjana Vishwanathapura
2026-07-11  2:56 ` [PATCH v3 22/33] drm/xe: Add Kconfig.profile options for BO defrag configuration Matthew Brost
2026-11-09  1:31   ` Niranjana Vishwanathapura [this message]
2026-07-11  2:56 ` [PATCH v3 23/33] drm/xe: Defrag using out-of-lock page preallocation Matthew Brost
2026-07-11  2:56 ` [PATCH v3 24/33] drm/xe: Add defrag profiling tracepoints Matthew Brost
2026-07-11  2:56 ` [PATCH v3 25/33] drm/xe: Preallocate system BO backing outside the dma-resv lock Matthew Brost
2026-07-11  2:56 ` [PATCH v3 26/33] drm/xe: Add tracepoint for xe_gem_create_ioctl Matthew Brost
2026-07-11  2:56 ` [PATCH v3 27/33] drm/xe: Add IOVA-based xe_res_cursor variant Matthew Brost
2026-11-04 12:23   ` Matthew Auld
2026-07-11  2:56 ` [PATCH v3 28/33] drm/xe: Use IOVA-based DMA mapping for eligible tt BOs Matthew Brost
2026-11-03 19:00   ` Matthew Auld
2026-11-03 20:21     ` Matthew Brost
2026-11-04 11:39       ` Matthew Auld
2026-11-05  3:04         ` Matthew Brost
2026-07-11  2:56 ` [PATCH v3 29/33] drm/xe: Add per-device dependency scheduler for IOVA defrag finalize Matthew Brost
2026-07-11  2:56 ` [PATCH v3 30/33] drm/xe: Add packed copy-step IOVA mapping for defrag Matthew Brost
2026-07-11  2:56 ` [PATCH v3 31/33] drm/xe: Blit src-natural to dst-packed for defrag-IOVA copies Matthew Brost
2026-07-11  2:56 ` [PATCH v3 32/33] drm/xe: Finalize defrag-IOVA moves with post-copy job Matthew Brost
2026-07-11  2:56 ` [PATCH v3 33/33] drm/amdgpu: Preallocate system BO pages outside the reservation lock Matthew Brost
2026-07-11 10:46   ` Christian König
2026-07-13 20:24     ` Matthew Brost
2026-07-14  9:17       ` Christian König
2026-07-14 15:15         ` Matthew Brost

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=avEiW3AKOAi8Gy3C@nvishwa1-desk \
    --to=niranjana.vishwanathapura@intel.com \
    --cc=airlied@gmail.com \
    --cc=carlos.santa@intel.com \
    --cc=christian.koenig@amd.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=matthew.auld@intel.com \
    --cc=matthew.brost@intel.com \
    --cc=mripard@kernel.org \
    --cc=ray.huang@amd.com \
    --cc=ryanneph@google.com \
    --cc=simona@ffwll.ch \
    --cc=thomas.hellstrom@linux.intel.com \
    --cc=tzimmermann@suse.de \
    /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

all inboxes | Powered by JetHome®