All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Tejas Upadhyay" <tejas.upadhyay@intel.com>
Cc: intel-xe@lists.freedesktop.org
Subject: Re: [PATCH V21 09/15] drm/xe/vram: Add VRAM page offline fault handler
Date: Thu, 03 Sep 2026 17:23:56 +0000	[thread overview]
Message-ID: <20260903172357.15F7B1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260903161553.528932-26-tejas.upadhyay@intel.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Time-of-check to time-of-use (TOCTOU) race and unconditional forceful unpinning of BO corrupts pin accounting and leads to panic.
--

commit c3198ab922e6897a8d11667a30d137d679162800
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>

drm/xe/vram: Add VRAM page offline fault handler

Add the core VRAM page offlining logic to handle HW-reported faulty
physical addresses.

> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index d97739a84a2d1..aea4cb0b66fd0 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c

[ ... ]

> +static int xe_ttm_vram_purge_page(struct xe_device *xe, struct xe_bo *bo)
> +{
> +	struct ttm_operation_ctx ctx = {};

[ ... ]

> +	xe_bo_set_purgeable_state(bo, XE_MADV_PURGEABLE_DONTNEED);
> +	ttm_bo_unmap_virtual(&bo->ttm);   /* nuke CPU mmap + VRAM IO mappings */
> +	if (xe_bo_is_pinned(bo))
> +		xe_bo_unpin(bo);

[Severity: High]
Does this code forcefully unpin the BO without owning the pin reference?

When xe_ttm_vram_purge_page() gets called, it unconditionally drops the
pin count if the BO is pinned. Since the pin is owned by an external subsystem
(like display or dma-buf), this steals their reference. 

When the legitimate owner later calls xe_bo_unpin_external(), the pin count
will underflow or fail an assertion (xe_assert(xe, xe_bo_is_pinned(bo))),
leading to a kernel panic because xe_bo_unpin_external() lacks the
xe_bo_is_purged() short-circuit found in xe_bo_unpin().

Is there a way to handle this without corrupting the pin accounting?

> +	ret = xe_ttm_bo_purge(&bo->ttm, &ctx);
> +	xe_bo_unlock(bo);
> +
> +out:
> +	if (q_to_put) {
> +		xe_exec_queue_kill(q_to_put);
> +		xe_exec_queue_put(q_to_put);
> +	}
> +
> +	return ret;
> +}

[ ... ]

> +static int xe_ttm_vram_reserve_page_at_addr(struct xe_device *xe, u64 addr,
> +					    struct xe_ttm_vram_mgr *vram_mgr, struct gpu_buddy *mm)
> +{

[ ... ]

> +		if (block) {
> +			pbo = xe_ttm_vram_block_owner_get(xe, block);
> +
> +			/*
> +			 * Critical kernel BO? Best-effort check without resv lock;
> +			 * worst case a concurrent pin causes reset path unnecessarily.
> +			 */
> +			if (pbo && ((pbo->ttm.type == ttm_bo_type_kernel &&
> +				     !(pbo->flags & XE_BO_FLAG_PINNED_LATE_RESTORE)) ||
> +				    (xe_bo_is_user(pbo) && xe_bo_is_pinned(pbo)))) {

[Severity: High]
Can a concurrent pin on a user BO bypass this check?

This check in xe_ttm_vram_reserve_page_at_addr() reads xe_bo_is_pinned(pbo)
without holding the BO's dma_resv lock. If a user BO is concurrently pinned via
dma-buf or display immediately after this check, it will fall through to
xe_ttm_vram_purge_page(). 

Because xe_ttm_vram_purge_page() acquires the lock and calls xe_bo_unpin()
unconditionally on pinned BOs, the newly pinned BO will have its pin reference
stolen, eventually causing a panic when the true owner tries to unpin it. 

Furthermore, kernel BOs with XE_BO_FLAG_PINNED_LATE_RESTORE intentionally
bypass this check and are also forcefully unpinned. If the subsequent
xe_ttm_bo_purge() fails, the BO isn't marked as purged, and a later legitimate
unpin will hit the same assertion panic.

Could this race be resolved by checking the pin status after acquiring the
dma_resv lock?

> +				kfree(nentry);
> +				pbo_to_put = pbo;
> +				drm_err(&xe->drm,
> +					"%s: addr: 0x%llx is critical kernel bo, requesting SBR\n",
> +					__func__, addr);
> +				break;
> +			}

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260903161553.528932-17-tejas.upadhyay@intel.com?part=9

  reply	other threads:[~2026-09-03 17:24 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-03 16:15 [PATCH V21 00/15] Add memory page offlining support Tejas Upadhyay
2026-09-03 16:15 ` [PATCH V21 01/15] drm/xe: Link VRAM resource allocation with gpu buddy Tejas Upadhyay
2026-09-03 16:15 ` [PATCH V21 02/15] drm/xe: Link LRC BO and its execution queue with safe lifetime rules Tejas Upadhyay
2026-09-03 16:15 ` [PATCH V21 03/15] drm/xe: Export xe_ttm_bo_purge() Tejas Upadhyay
2026-09-03 16:15 ` [PATCH V21 04/15] drm/xe: Handle NULL resource and allow purging of VRAM pages Tejas Upadhyay
2026-09-03 17:08   ` sashiko-bot
2026-09-03 16:15 ` [PATCH V21 05/15] drm/xe/bo: Make xe_bo_is_user() public Tejas Upadhyay
2026-09-03 16:15 ` [PATCH V21 06/15] drm/xe: Guard teardown paths against purged BOs Tejas Upadhyay
2026-09-03 16:55   ` sashiko-bot
2026-09-03 16:16 ` [PATCH V21 07/15] drm/xe/vram: Extract buddy allocation and free helpers Tejas Upadhyay
2026-09-03 16:16 ` [PATCH V21 08/15] drm/xe/vram: Add page offline data structures and lifecycle Tejas Upadhyay
2026-09-03 16:16 ` [PATCH V21 09/15] drm/xe/vram: Add VRAM page offline fault handler Tejas Upadhyay
2026-09-03 17:23   ` sashiko-bot [this message]
2026-09-03 16:16 ` [PATCH V21 10/15] drm/xe/configfs: Add disable_vram_page_offline attribute Tejas Upadhyay
2026-09-03 16:16 ` [PATCH V21 11/15] drm/xe/ras: Cache disable_vram_page_offline policy at init Tejas Upadhyay
2026-09-03 16:16 ` [PATCH V21 12/15] drm/xe/vram: Check disable_vram_page_offline policy in fault handler Tejas Upadhyay
2026-09-03 16:16 ` [PATCH V21 13/15] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
2026-09-03 16:16 ` [PATCH V21 14/15] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN Tejas Upadhyay
2026-09-03 17:46   ` sashiko-bot
2026-09-03 16:16 ` [PATCH V21 15/15] drm/xe: Add fault-inject based VRAM page offline injection Tejas Upadhyay
2026-09-03 16:23 ` ✗ CI.checkpatch: warning for Add memory page offlining support (rev25) Patchwork
2026-09-03 16:25 ` ✓ CI.KUnit: success " Patchwork
2026-09-03 17:46 ` ✗ Xe.CI.BAT: failure " Patchwork
2026-09-04  4:33 ` [PATCH V21 00/15] Add memory page offlining support Matthew Brost
2026-09-04  5:18 ` ✗ Xe.CI.FULL: failure for Add memory page offlining support (rev25) 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=20260903172357.15F7B1F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=tejas.upadhyay@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.