All of 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>,
	Matthew Auld <matthew.auld@intel.com>,
	Rodrigo Vivi <rodrigo.vivi@intel.com>,
	Natalie Vock <nat@pixelcluster.dev>,
	Arun Pravin <arunpravin.paneerselvam@amd.com>,
	<dri-devel@lists.freedesktop.org>, <stable@vger.kernel.org>
Subject: Re: [PATCH] drm/ttm, drm/xe: Don't invoke the OOM killer when evicting VRAM at suspend
Date: Tue, 20 Oct 2026 09:16:22 -0700	[thread overview]
Message-ID: <ateT1i6Pwa4h0pVN@gsse-cloud1.jf.intel.com> (raw)
In-Reply-To: <20261020100504.46684-1-thomas.hellstrom@linux.intel.com>

On Tue, Oct 20, 2026 at 12:05:04PM +0200, Thomas Hellström wrote:
> When evicting user BOs from VRAM at suspend time, allocating system
> memory for the eviction may currently invoke the OOM killer. Under
> memory pressure it is preferable to abort the suspend and return
> -ENOMEM rather than killing processes.
> 
> TTM's ttm_resource_manager_evict_all() uses a default operation
> context, which doesn't allow the caller to request
> __GFP_RETRY_MAYFAIL allocations. Introduce
> ttm_resource_manager_evict_all_ctx() taking a caller-supplied
> struct ttm_operation_ctx, keeping ttm_resource_manager_evict_all()
> as an exported wrapper using a default context so that existing
> users are unaffected. Also honor the ctx interruptible setting when
> waiting for the eviction fences.
> 
> Use the new function from xe_bo_evict_all_user() with
> gfp_retry_mayfail set.
> 
> Note that the PM notifier eviction is best-effort and ignores errors.
> Any remaining BOs are evicted again from the .suspend() callback,
> where an -ENOMEM might then cause the suspend to be aborted.
> 
> Fixes: c6a4d46ec1d7 ("drm/xe: evict user memory in PM notifier")
> Cc: Matthew Auld <matthew.auld@intel.com>
> Cc: Matthew Brost <matthew.brost@intel.com>

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

> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Cc: Natalie Vock <nat@pixelcluster.dev>
> Cc: Arun Pravin <arunpravin.paneerselvam@amd.com>
> Cc: intel-xe@lists.freedesktop.org
> Cc: dri-devel@lists.freedesktop.org
> Cc: <stable@vger.kernel.org> # v6.16+
> Link: https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9615
> Assisted-by: LLM
> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> ---
>  drivers/gpu/drm/ttm/ttm_resource.c | 37 +++++++++++++++++++++++-------
>  drivers/gpu/drm/xe/xe_bo_evict.c   |  5 +++-
>  include/drm/ttm/ttm_resource.h     |  5 ++++
>  3 files changed, 38 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ttm/ttm_resource.c b/drivers/gpu/drm/ttm/ttm_resource.c
> index 4e6d3d658d85..5296b32a2e92 100644
> --- a/drivers/gpu/drm/ttm/ttm_resource.c
> +++ b/drivers/gpu/drm/ttm/ttm_resource.c
> @@ -568,24 +568,26 @@ void ttm_resource_manager_init(struct ttm_resource_manager *man,
>  }
>  EXPORT_SYMBOL(ttm_resource_manager_init);
>  
> -/*
> - * ttm_resource_manager_evict_all
> - *
> +/**
> + * ttm_resource_manager_evict_all_ctx() - Evict all objects from a manager
>   * @bdev: device to use
>   * @man: manager to use
> + * @ctx: operation context for the eviction
>   *
>   * Evict all the objects out of a memory manager until it is empty.
>   * Part of memory manager cleanup sequence.
> + *
> + * Return: 0 on success, negative error code on failure.
>   */
> -int ttm_resource_manager_evict_all(struct ttm_device *bdev,
> -				   struct ttm_resource_manager *man)
> +int ttm_resource_manager_evict_all_ctx(struct ttm_device *bdev,
> +				       struct ttm_resource_manager *man,
> +				       struct ttm_operation_ctx *ctx)
>  {
> -	struct ttm_operation_ctx ctx = { };
>  	struct dma_fence *fence;
>  	int ret, i;
>  
>  	do {
> -		ret = ttm_bo_evict_first(bdev, man, &ctx);
> +		ret = ttm_bo_evict_first(bdev, man, ctx);
>  		cond_resched();
>  	} while (!ret);
>  
> @@ -600,7 +602,7 @@ int ttm_resource_manager_evict_all(struct ttm_device *bdev,
>  		if (fence && !dma_fence_is_signaled(fence)) {
>  			dma_fence_get(fence);
>  			spin_unlock(&man->eviction_lock);
> -			ret = dma_fence_wait(fence, false);
> +			ret = dma_fence_wait(fence, ctx->interruptible);
>  			dma_fence_put(fence);
>  			if (ret)
>  				return ret;
> @@ -611,6 +613,25 @@ int ttm_resource_manager_evict_all(struct ttm_device *bdev,
>  
>  	return ret;
>  }
> +EXPORT_SYMBOL(ttm_resource_manager_evict_all_ctx);
> +
> +/**
> + * ttm_resource_manager_evict_all() - Evict all objects from a manager
> + * @bdev: device to use
> + * @man: manager to use
> + *
> + * Same as ttm_resource_manager_evict_all_ctx() using a default,
> + * non-interruptible operation context.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int ttm_resource_manager_evict_all(struct ttm_device *bdev,
> +				   struct ttm_resource_manager *man)
> +{
> +	struct ttm_operation_ctx ctx = { };
> +
> +	return ttm_resource_manager_evict_all_ctx(bdev, man, &ctx);
> +}
>  EXPORT_SYMBOL(ttm_resource_manager_evict_all);
>  
>  /**
> diff --git a/drivers/gpu/drm/xe/xe_bo_evict.c b/drivers/gpu/drm/xe/xe_bo_evict.c
> index 7661fca7f278..a37316a27573 100644
> --- a/drivers/gpu/drm/xe/xe_bo_evict.c
> +++ b/drivers/gpu/drm/xe/xe_bo_evict.c
> @@ -114,6 +114,9 @@ void xe_bo_notifier_unprepare_all_pinned(struct xe_device *xe)
>   */
>  int xe_bo_evict_all_user(struct xe_device *xe)
>  {
> +	struct ttm_operation_ctx ctx = {
> +		.gfp_retry_mayfail = true,
> +	};
>  	struct ttm_device *bdev = &xe->ttm;
>  	u32 mem_type;
>  	int ret;
> @@ -135,7 +138,7 @@ int xe_bo_evict_all_user(struct xe_device *xe)
>  			continue;
>  
>  		if (man) {
> -			ret = ttm_resource_manager_evict_all(bdev, man);
> +			ret = ttm_resource_manager_evict_all_ctx(bdev, man, &ctx);
>  			if (ret)
>  				return ret;
>  		}
> diff --git a/include/drm/ttm/ttm_resource.h b/include/drm/ttm/ttm_resource.h
> index 714c533622c2..6cf9187a12eb 100644
> --- a/include/drm/ttm/ttm_resource.h
> +++ b/include/drm/ttm/ttm_resource.h
> @@ -42,6 +42,7 @@ struct dmem_cgroup_device;
>  struct dmem_cgroup_region;
>  struct drm_printer;
>  struct ttm_device;
> +struct ttm_operation_ctx;
>  struct ttm_resource_manager;
>  struct ttm_resource;
>  struct ttm_place;
> @@ -488,6 +489,10 @@ void ttm_resource_manager_set_dmem_region(struct ttm_resource_manager *man,
>  int ttm_resource_manager_dmem_reclaim(struct dmem_cgroup_pool_state *pool,
>  				      u64 target_bytes, void *priv);
>  
> +int ttm_resource_manager_evict_all_ctx(struct ttm_device *bdev,
> +				       struct ttm_resource_manager *man,
> +				       struct ttm_operation_ctx *ctx);
> +
>  int ttm_resource_manager_evict_all(struct ttm_device *bdev,
>  				   struct ttm_resource_manager *man);
>  
> -- 
> 2.56.0
> 

      parent reply	other threads:[~2026-10-20 16:16 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-20 10:05 [PATCH] drm/ttm, drm/xe: Don't invoke the OOM killer when evicting VRAM at suspend Thomas Hellström
2026-10-20 12:03 ` ✓ CI.KUnit: success for " Patchwork
2026-10-20 12:41 ` ✓ Xe.CI.BAT: " Patchwork
2026-10-20 15:46 ` ✓ Xe.CI.FULL: " Patchwork
2026-10-20 16:16 ` Matthew Brost [this message]

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=ateT1i6Pwa4h0pVN@gsse-cloud1.jf.intel.com \
    --to=matthew.brost@intel.com \
    --cc=arunpravin.paneerselvam@amd.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=matthew.auld@intel.com \
    --cc=nat@pixelcluster.dev \
    --cc=rodrigo.vivi@intel.com \
    --cc=stable@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.