Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Maciej Patelczyk <maciej.patelczyk@intel.com>
To: <intel-xe@lists.freedesktop.org>
Subject: Re: [PATCH v10 26/27] drm/xe/eudebug: Introduce EU pagefault handling interface
Date: Tue, 8 Sep 2026 17:12:10 +0200	[thread overview]
Message-ID: <3e4e7482-2810-4154-ba8c-a27fef5b47f1@intel.com> (raw)
In-Reply-To: <20260903154320.266C71F00A3A@smtp.kernel.org>

On 03/09/2026 17:43, sashiko-bot@kernel.org wrote:
 > Thank you for your contribution! Sashiko AI review found 6 potential 
issue(s) to consider:
 > - [Critical] Race condition in `queue_pagefault` when accessing 
`epf->d` after unlocking causes Use-After-Free and double-put.
True. Addressed.
 >
 > - [High] Unverified ASID in `xe_eudebug_pagefault_start` groups 
unrelated pagefaults, causing VMA destruction under the wrong VM lock 
and triggering lockdep failures.
Addressed, but not sure it's valid.
 >
 > - [High] Missing NULL check for `vm->xef` in 
`xe_eudebug_pagefault_start` and `xe_eudebug_pagefault_creatable` causes 
a kernel panic for kernel/migrate VMs.
Addressed.
 >
 > - [High] Non-recoverable error in `send_queued_pagefaults` triggers a 
full GPU reset, enabling a Denial of Service via queue destruction.
If EU Debugger fails at later stages of processing given page fault, a 
GPU reset is actually required.
 >
 > - [High] Deferring finalization in `xe_eudebug_pagefault_end` hangs 
the state machine if subsequent pagefaults fail to initialize.
Not really sure if this is an issue.
 >
 > - [Medium] Failure to clear `TD_CTL_FORCE_EXCEPTION` in 
`eudebug_pagefault_finalize` ignores a hardware timeout without 
triggering a recovery reset.

Addressed.


 > [ ... ]
 >
 >> +void xe_eudebug_pagefault_end(void *private, int err)
 >> +{
 >> +    struct xe_eudebug_pagefault *epf = _get_epf(private);
 >> +    struct xe_eudebug_pagefault *first_epf = NULL;
 >> +    struct xe_pagefault_queue *pf_queue;
 >> +    struct xe_device *xe;
 >> +    struct xe_eudebug *d;
 >> +    struct xe_vm *vm;
 >> +    int resume_attn = 0, destroy_pf = 0;
 >> +
 >> +    if (!epf)
 >> +        return;
 >> +
 >> +    xe = epf->q->xef->xe;
 >> +    pf_queue = &xe->usm.pf_queue;
 >> +
 >> +    d = epf->d;
 >> +    vm = xe_vm_get(epf->q->vm);
 >> +    /* Need to have outher vm lock for eudebug lock as for pf start */
 >> +    down_write(&vm->lock);
 >> +    mutex_lock(&d->xe->eudebug.lock);
 >> +    if (!--d->pf.active) {
 >> +        /*
 >> +         * This will also catch entries that are popped from pagefault
 >> +         * queue and moved to worker but not yet processed.
 >> +         * xe_eudebug_pagefault_start() will catch later it and 
increase
 >> +         * the pf.active counter.
 >> +         */
 >> +        if (!xe_eudebug_pagefault_queue_has_asid(pf_queue, 
d->pf.asid)) {
 >> +            if (!err)
 >> + xe_eudebug_pagefault_process(d->pf.first);
 >> +
 >> +            destroy_pf = eudebug_pagefault_finalize(d->pf.first, err);
 >> +            /* If d->pf.first was queued the epf shall be removed. */
 >> +            if (epf != d->pf.first) {
 >> +                if (destroy_pf)
 >> +                    first_epf = d->pf.first;
 >> +                else
 >> +                    destroy_pf = 1;
 >> +            }
 >> +            d->pf.first = NULL;
 >> +            d->pf.asid = 0;
 >> +            resume_attn = 1;
 >> +        } else {
 >> +            /* page faults still queued */
 >> +            if (epf != d->pf.first)
 >> +                destroy_pf = 1;
 >> +        }
 >
 > [Severity: High]
 > Does deferring finalization when page faults are still queued risk 
deadlocking
 > the state machine?
 >
 > If xe_eudebug_pagefault_queue_has_asid() is true, 
eudebug_pagefault_finalize()
 > is deferred on the assumption that the next queued page fault will 
successfully
 > attach to the eudebug state machine.
 >
 > If the next page fault fails in xe_eudebug_pagefault_start() (for 
example, if
 > the exec queue is no longer debuggable), eudebug setup is skipped.  
When that
 > fault completes, xe_eudebug_pagefault_end() will receive a NULL 
private pointer
 > and return early.
 >
 > Could this leave pf.active at 0 while eudebug_pagefault_finalize() is 
never
 > called, permanently hanging the GPU with TD_CTL_FORCE_EXCEPTION still 
active
 > and deadlocking EU_CONTROL ioctls waiting on the unsignaled pf.fence?
 >
 > [ ... ]

Exec queue cannot stop being debuggable.

VMs without 'xef' don't have 'asid'. They will not be detected by 
xe_eudebug_pagefault_queue_has_asid().

And debugging a workload on GPU is a specific job which has severe side 
effects, including GPU reprogramming and reset. So only a workload under 
debug should be on GT.

  Therefore, despite the fact that issue is technically correct, should 
not appear.


Maciej


  reply	other threads:[~2026-09-08 15:12 UTC|newest]

Thread overview: 61+ 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-07 13:24     ` Joonas Lahtinen
2026-09-09 10:00       ` FUSE deadlocks vs. copy_from_user() and locks (Was: Re: [PATCH v10 04/27] drm/xe/eudebug: Introduce discovery for resources) Joonas Lahtinen
2026-09-09 10:21         ` Simona Vetter
2026-09-09 11:02           ` Christian König
2026-09-09 11:24             ` Joonas Lahtinen
2026-09-09 11:44               ` Miklos Szeredi
2026-09-09 13:03               ` Christian König
2026-09-09 14:51                 ` Joonas Lahtinen
2026-09-09 10:30         ` Miklos Szeredi
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
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-08 15:12     ` Maciej Patelczyk [this message]
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-08  9:35     ` Joonas Lahtinen
2026-09-08 15:28     ` Maciej Patelczyk
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-07  5:32   ` Joonas Lahtinen
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=3e4e7482-2810-4154-ba8c-a27fef5b47f1@intel.com \
    --to=maciej.patelczyk@intel.com \
    --cc=intel-xe@lists.freedesktop.org \
    /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