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 V19 14/15] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN
Date: Mon, 31 Aug 2026 09:40:43 +0000	[thread overview]
Message-ID: <20260831094044.1EE3A1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260831064942.315720-31-tejas.upadhyay@intel.com>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [Critical] Concurrent iteration and modification of `vm->exec_queues.list` without proper mutual exclusion causes stack-out-of-bounds access and infinite loops.
- [Medium] Missing smp_rmb() in guc_exec_queue_reset_status() allows load/store reordering, exposing an incorrect ban reason to userspace.
- [Medium] Non-LR queues are not killed synchronously by xe_vm_kill(), breaking the !exec_queue_killed() guard in the TDR and incorrectly tagging them with GPU_HANG.
--

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

drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN

This commit extends the DRM_XE_EXEC_QUEUE_GET_PROPERTY_BAN query to return a
bitmask indicating the reason for the queue ban. It adds a ban_reason field to
the queue state, updating it on GPU hang timeouts or when backing VRAM pages
are taken offline.

[ ... ]

> diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
> index 99d8c807ff056..0a6e2b81b5a53 100644
> --- a/drivers/gpu/drm/xe/xe_guc_submit.c
> +++ b/drivers/gpu/drm/xe/xe_guc_submit.c
[ ... ]
> @@ -1599,6 +1600,12 @@ guc_exec_queue_timedout_job(struct drm_sched_job *drm_job)
>  	else
>  		wedged = xe_device_wedged(xe);
>  
> +	/*
> +	 * Only tag as GPU hang if this is the original timeout, not a
> +	 * consequence of a prior kill (e.g., page-offline).
> +	 */
> +	if (!exec_queue_killed(q))
> +		atomic_or(DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG, &q->ban_reason);

[Severity: Medium]
Since xe_vm_kill() only synchronously kills LR queues by iterating over
vm->preempt.exec_queues, non-LR queues continue running after a page offline
event until they eventually hang. When the TDR executes for these non-LR
queues, won't this check evaluate to true because they were never formally
killed by xe_vm_kill()?

If so, this seems to incorrectly tag consequence timeouts on non-LR queues
as DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG, contradicting the intent of this
guard.

>  	set_exec_queue_banned(q);
>  
>  	/* Kick job / queue off hardware */
[ ... ]
> @@ -2580,13 +2590,29 @@ static void guc_exec_queue_multi_queue_drop_suspend(struct xe_exec_queue *q)
>  	}
>  }
>  
> -static bool guc_exec_queue_reset_status(struct xe_exec_queue *q)
> +static u64 guc_exec_queue_reset_status(struct xe_exec_queue *q)
>  {
> -	if (xe_exec_queue_is_multi_queue_secondary(q) &&
> -	    guc_exec_queue_reset_status(xe_exec_queue_multi_queue_primary(q)))
> -		return true;
> +	/* TODO: In case of multiqueue, if a secondary queue is banned due to
> +	 * page offlining, checking only the primary queue's GuC reset status
> +	 * may mask the true reason or race with it.
> +	 */
> +	if (xe_exec_queue_is_multi_queue_secondary(q)) {
> +		u64 status = guc_exec_queue_reset_status(xe_exec_queue_multi_queue_primary(q));
>  
> -	return exec_queue_reset(q) || exec_queue_killed_or_banned_or_wedged(q);
> +		if (status)
> +			return status;
> +	}
> +
> +	if (exec_queue_reset(q) || exec_queue_killed_or_banned_or_wedged(q)) {
> +		u64 reason = atomic_read_acquire(&q->ban_reason);

[Severity: Medium]
Is an smp_rmb() missing before this atomic_read_acquire()?

The writer side in xe_ttm_vram_purge_page() uses an smp_wmb() after setting
the ban_reason and before triggering the state change. However, on this
reader side, the relaxed reads in exec_queue_killed_or_banned_or_wedged() only
provide a control dependency, which does not guarantee load-load ordering.
Because atomic_read_acquire() does not prevent prior loads from being
reordered after it, couldn't the CPU speculatively read ban_reason before
checking the queue state?

If this reordering occurs, the reader would see a ban_reason of 0 and
incorrectly default to GPU_HANG, masking the PAGE_OFFLINE reason.

> +
> +		/* If no specific reason was recorded, default to GPU hang */
> +		if (!reason)
> +			reason = DRM_XE_EXEC_QUEUE_BAN_REASON_GPU_HANG;
> +		return reason;
> +	}
> +
> +	return 0;
>  }
>  
>  /*
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index 456ea78a31e2a..ca97fa8291c43 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
[ ... ]
> @@ -597,7 +599,22 @@ static int xe_ttm_vram_purge_page(struct xe_device *xe, struct xe_bo *bo)
>  	xe_bo_unlock(bo);
>  	/*  Ban VM if BO is PPGTT */
>  	if (vm && (flags & XE_BO_FLAG_PAGETABLE)) {
> +		struct xe_exec_queue *eq;
> +		int id;
> +
>  		down_write(&vm->lock);
> +		if (xe->info.has_ctx_tlb_inval) {
> +			down_read(&vm->exec_queues.lock);
> +			for (id = 0; id < ARRAY_SIZE(vm->exec_queues.list); id++)
> +				list_for_each_entry(eq, &vm->exec_queues.list[id],
> +						    vm_exec_queue_link)
> +					atomic_or(q_flag, &eq->ban_reason);
> +			up_read(&vm->exec_queues.lock);

[Severity: Critical]
Is it safe to iterate vm->exec_queues.list while holding only a read lock on
vm->exec_queues.lock?

It appears send_tlb_inval_ctx_ppgtt() also acquires only a read lock on
vm->exec_queues.lock, but it actively mutates this same list by temporarily
using list_move_tail() to move items to a stack-allocated list.

If xe_ttm_vram_purge_page() traverses the list under down_read() while
send_tlb_inval_ctx_ppgtt() is moving elements, could the traversal pointer
follow elements into the stack frame of send_tlb_inval_ctx_ppgtt(), causing
an out-of-bounds access or an infinite loop? Should this use down_write()
instead?

> +		} else {
> +			list_for_each_entry(eq, &vm->preempt.exec_queues, lr.link)
> +				atomic_or(q_flag, &eq->ban_reason);
> +		}
> +		smp_wmb(); /* Force all queue bits to be visible before killing the VM */
>  		xe_vm_kill(vm, true);
>  		up_write(&vm->lock);
>  	}

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

  reply	other threads:[~2026-08-31  9:40 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-31  6:49 [PATCH V19 00/15] Add memory page offlining support Tejas Upadhyay
2026-08-31  6:49 ` [PATCH V19 01/15] drm/xe: Link VRAM object with gpu buddy Tejas Upadhyay
2026-08-31  6:49 ` [PATCH V19 02/15] drm/xe: Link LRC BO and its execution Queue Tejas Upadhyay
2026-08-31  7:24   ` sashiko-bot
2026-08-31  6:49 ` [PATCH V19 03/15] drm/xe: Export xe_ttm_bo_purge() Tejas Upadhyay
2026-09-02  0:33   ` Matthew Brost
2026-08-31  6:49 ` [PATCH V19 04/15] drm/xe: Handle NULL resource and allow purging of VRAM pages Tejas Upadhyay
2026-08-31  6:52   ` Ghimiray, Himal Prasad
2026-08-31  7:42   ` sashiko-bot
2026-08-31  6:49 ` [PATCH V19 05/15] drm/xe/bo: Make xe_bo_is_user() public Tejas Upadhyay
2026-08-31  6:49 ` [PATCH V19 06/15] drm/xe: Guard teardown paths against purged BOs Tejas Upadhyay
2026-08-31  6:53   ` Ghimiray, Himal Prasad
2026-08-31  8:03   ` sashiko-bot
2026-09-01  5:05     ` Upadhyay, Tejas
2026-08-31  6:49 ` [PATCH V19 07/15] drm/xe/vram: Extract buddy alloc and free helpers Tejas Upadhyay
2026-08-31  8:08   ` sashiko-bot
2026-09-01  5:10     ` Upadhyay, Tejas
2026-08-31  6:49 ` [PATCH V19 08/15] drm/xe/vram: Add page offline data structures and lifecycle Tejas Upadhyay
2026-08-31  6:49 ` [PATCH V19 09/15] drm/xe/vram: Add VRAM page offline fault handler Tejas Upadhyay
2026-08-31  6:57   ` Ghimiray, Himal Prasad
2026-08-31  8:37   ` sashiko-bot
2026-09-01  5:48     ` Upadhyay, Tejas
2026-08-31  6:49 ` [PATCH V19 10/15] drm/xe/configfs: Add disable_vram_page_offline attribute Tejas Upadhyay
2026-08-31  8:45   ` sashiko-bot
2026-09-01  5:25     ` Upadhyay, Tejas
2026-08-31  6:49 ` [PATCH V19 11/15] drm/xe/ras: Cache disable_vram_page_offline policy at init Tejas Upadhyay
2026-08-31  9:02   ` sashiko-bot
2026-09-01  5:22     ` Upadhyay, Tejas
2026-08-31  6:49 ` [PATCH V19 12/15] drm/xe/vram: Check disable_vram_page_offline policy in fault handler Tejas Upadhyay
2026-08-31  6:49 ` [PATCH V19 13/15] drm/xe: Expose bad VRAM pages via debugfs Tejas Upadhyay
2026-08-31  6:55   ` Ghimiray, Himal Prasad
2026-08-31  9:18   ` sashiko-bot
2026-09-01  5:13     ` Upadhyay, Tejas
2026-08-31  6:49 ` [PATCH V19 14/15] drm/xe/uapi: Expose ban reason in EXEC_QUEUE_GET_PROPERTY_BAN Tejas Upadhyay
2026-08-31  9:40   ` sashiko-bot [this message]
2026-09-01  9:40     ` Upadhyay, Tejas
2026-08-31  6:49 ` [PATCH V19 15/15] drm/xe: Add fault-inject based VRAM page offline injection Tejas Upadhyay
2026-08-31  6:54   ` Ghimiray, Himal Prasad
2026-08-31 11:53 ` ✓ CI.KUnit: success for Add memory page offlining support (rev22) Patchwork
2026-08-31 13:28 ` ✓ Xe.CI.BAT: " Patchwork
2026-08-31 13:58 ` ✗ Xe.CI.FULL: failure " Patchwork
2026-08-31 14:04 ` [PATCH V19 00/15] Add memory page offlining support Rodrigo Vivi
2026-08-31 14:58   ` Matthew Brost
2026-09-01  4:09   ` Upadhyay, Tejas
2026-08-31 17:44 ` ✓ CI.KUnit: success for Add memory page offlining support (rev23) Patchwork
2026-08-31 18:32 ` ✓ Xe.CI.BAT: " Patchwork
2026-08-31 22:22 ` ✗ Xe.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=20260831094044.1EE3A1F000E9@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.