Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Mika Kuoppala" <mika.kuoppala@linux.intel.com>
Cc: intel-xe@lists.freedesktop.org
Subject: Re: [PATCH v10 21/27] drm/xe/eudebug: Add read/count/compare helper for eu attention
Date: Thu, 03 Sep 2026 15:31:56 +0000	[thread overview]
Message-ID: <20260903153156.DA7861F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260903145952.848051-22-mika.kuoppala@linux.intel.com>

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [High] Unaligned memory access and endianness bugs due to incorrect type punning in `xe_eu_attentions_count`.
- [High] Unbounded CPU stall / soft lockup due to 1.5-second `udelay()` busy-waiting in `xe_gt_eu_attentions_read`.
- [Medium] Silent failure when reading hardware attentions causes the debugger to process zeroed memory as valid EU threads.
- [Medium] Meaningful code and commit message mismatch: The patch claims to add an EU thread compare function, but the implementation is completely missing.
--

commit a0b2cd07131e7090249ddf2ff617e3c4283b5549
Author: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>

drm/xe/eudebug: Add read/count/compare helper for eu attention

This commit adds the xe_eu_attentions structure to capture and store EU
attention bits. It also introduces functions to read and count the number of
EU threads that have triggered attentions.

>     drm/xe/eudebug: Add read/count/compare helper for eu attention
>     
>     Add xe_eu_attentions structure to capture and store eu attention bits.
>     Add a function to count the number of eu threads that have turned on from
>     eu attentions, and add a function to count the number of eu threads that
>     have changed on a state between eu attentions.

[Severity: Medium]
This isn't a bug, but the commit message states it adds a compare helper "to
count the number of eu threads that have changed on a state between eu
attentions." Does the patch actually include this function? It appears to be
missing from the implementation.

> diff --git a/drivers/gpu/drm/xe/xe_gt_debug.c b/drivers/gpu/drm/xe/xe_gt_debug.c
> index b20e42e66c5bc..bff78c0b232a8 100644
> --- a/drivers/gpu/drm/xe/xe_gt_debug.c
> +++ b/drivers/gpu/drm/xe/xe_gt_debug.c
[ ... ]
> @@ -199,3 +202,50 @@ int xe_gt_eu_threads_needing_attention(struct xe_gt *gt)
>  
>  	return err < 0 ? 0 : err;
>  }
> +
> +static inline unsigned int
> +xe_eu_attentions_count(const struct xe_eu_attentions *a)
> +{
> +	return bitmap_weight((void *)a->att, a->size * BITS_PER_BYTE);
> +}

[Severity: High]
Does casting this u8 array to an unsigned long pointer cause unaligned memory
accesses?

In drivers/gpu/drm/xe/xe_gt_debug_types.h, the xe_eu_attentions struct
declares att as a u8 array, meaning the struct has at most a 4-byte
alignment (dictated by unsigned int size). 

When xe_eu_attentions_count() in drivers/gpu/drm/xe/xe_gt_debug.c casts this
array to void * and passes it to bitmap_weight(), which expects an unsigned
long *, it can cause undefined behavior. Dereferencing a 4-byte aligned
address as an 8-byte unsigned long can cause faults on architectures with
strict alignment requirements, or incorrect bit counting on big-endian systems.

> +
> +void xe_gt_eu_attentions_read(struct xe_gt *gt,
> +			      struct xe_eu_attentions *a,
> +			      const unsigned int settle_time_ms)
> +{
> +	unsigned int attn, prev = 0;
> +	ktime_t end, now;
> +
> +	now = ktime_get_raw();
> +	/* Initially wait longer for attentions to appear */
> +	end = ktime_add_ms(now, settle_time_ms * 10);
> +
> +	a->size = min_t(int,
> +			xe_gt_eu_attention_bitmap_size(gt),
> +			sizeof(a->att));
> +
> +	do {
> +		if (xe_gt_eu_attention_bitmap(gt, a->att, a->size) < 0)
> +			return;

[Severity: Medium]
Will this early return swallow the error code and corrupt the debugger's
data flow?

If xe_gt_eu_attention_bitmap() fails in xe_gt_eu_attentions_read(), it
returns early but leaves a->size set to a positive value. Since the function
signature is void, the caller has no way of knowing a failure occurred.

Could the caller then process the structure's att array (which contains
zeroes) and falsely report that no threads triggered an attention?

> +
> +		if (!settle_time_ms)
> +			break;
> +
> +		attn = xe_eu_attentions_count(a);
> +
> +		now = ktime_get_raw();
> +
> +		if (attn > prev) {
> +			prev = attn;
> +			end = ktime_add_ms(now, settle_time_ms);
> +		}
> +
> +		udelay(15);
> +
> +		/*
> +		 * XXX We are gathering data for production SIP to find
> +		 * the upper limit of settle time. For now, we wait full
> +		 * timeout value regardless.
> +		 */
> +	} while ((attn < a->size * 8) && ktime_before(now, end));
> +}

[Severity: High]
Can this loop cause an unbounded CPU stall or soft lockup?

The loop in xe_gt_eu_attentions_read() waits for a timeout of
settle_time_ms * 10. When called from a pagefault handler with
XE_GT_ATTENTION_TIMEOUT_MS (150ms), the timeout is 1.5 seconds. Inside the
loop, it busy-waits using udelay(15) instead of a sleeping delay.

Additionally, if any DSS in the middle of the topology is fused off, attn
will never reach a->size * 8 because a->size overestimates the valid bits.
Does this guarantee the loop will always busy-wait for the full 1.5 seconds
per call?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260903145952.848051-1-mika.kuoppala@linux.intel.com?part=21

  reply	other threads:[~2026-09-03 15:31 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-03 14:59 [PATCH v10 00/27] Intel Xe GPU Debug Support (eudebug) v10 Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 01/27] drm/xe/eudebug: Introduce eudebug interface Mika Kuoppala
2026-09-03 15:16   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 02/27] drm/xe/eudebug: Add documentation Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 03/27] drm/xe/eudebug: Add connection establishment documentation Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 04/27] drm/xe/eudebug: Introduce discovery for resources Mika Kuoppala
2026-09-03 15:22   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 05/27] drm/xe: Add EUDEBUG_ENABLE exec queue property Mika Kuoppala
2026-09-03 15:14   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 06/27] drm/xe/eudebug: Introduce exec_queue events Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 07/27] drm/xe/eudebug: Mark guc contexts as debuggable Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 08/27] drm/xe: Remove ifdef in DRM_GPUVA_OP_DRIVER svm subop checking Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 09/27] drm/xe: Introduce ADD_DEBUG_DATA and REMOVE_DEBUG_DATA vm bind ops Mika Kuoppala
2026-09-03 15:22   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 10/27] drm/xe/eudebug: Introduce vm bind and vm bind debug data events Mika Kuoppala
2026-09-03 15:26   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 11/27] drm/xe/eudebug: Add ufence events with acks Mika Kuoppala
2026-09-03 15:20   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 12/27] drm/xe/eudebug: Add vm open/pread/pwrite Mika Kuoppala
2026-09-03 15:27   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 13/27] drm/xe/eudebug: Add userptr vm pread/pwrite Mika Kuoppala
2026-09-03 15:24   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 14/27] drm/xe/eudebug: Add hw enablement Mika Kuoppala
2026-09-03 15:15   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 15/27] drm/xe/eudebug: Introduce EU control interface Mika Kuoppala
2026-09-03 15:34   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 16/27] drm/xe/eudebug: Introduce per device attention scan worker Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 17/27] drm/xe/eudebug_test: Introduce eudebug live tests Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 18/27] drm/xe: Implement SR-IOV and eudebug exclusivity Mika Kuoppala
2026-09-03 15:32   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 19/27] drm/xe: Add xe_client_debugfs and introduce debug_data file Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 20/27] drm/xe/pagefault: export pagefault queue properties Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 21/27] drm/xe/eudebug: Add read/count/compare helper for eu attention Mika Kuoppala
2026-09-03 15:31   ` sashiko-bot [this message]
2026-09-03 14:59 ` [PATCH v10 22/27] drm/xe/vm: Support for adding null page VMA to VM on request Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 23/27] drm/xe/vm: Add xe_vm_svm_vma_subtract() to carve out a sub-range from an SVM VMA Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 24/27] drm/xe: Support for xe_vma_unbind() Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 25/27] drm/xe: export prep_vma_destroy as xe_vm_prep_vma_destroy Mika Kuoppala
2026-09-03 14:59 ` [PATCH v10 26/27] drm/xe/eudebug: Introduce EU pagefault handling interface Mika Kuoppala
2026-09-03 15:43   ` sashiko-bot
2026-09-03 14:59 ` [PATCH v10 27/27] drm/xe/eudebug: Enable EU pagefault handling Mika Kuoppala
2026-09-03 15:46   ` sashiko-bot
2026-09-03 15:35 ` ✗ CI.checkpatch: warning for Intel Xe GPU Debug Support (eudebug) v10 Patchwork
2026-09-03 15:37 ` ✓ CI.KUnit: success " Patchwork
2026-09-03 15:53 ` ✗ CI.checksparse: warning " Patchwork
2026-09-03 16:17 ` ✓ Xe.CI.BAT: success " Patchwork
2026-09-03 16:30 ` [PATCH v10 00/27] " Rodrigo Vivi
2026-09-04  3:21 ` ✗ Xe.CI.FULL: failure for " 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=20260903153156.DA7861F00A3A@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=mika.kuoppala@linux.intel.com \
    --cc=sashiko-reviews@lists.linux.dev \
    /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