On Tue, Sep 01, 2026 at 12:33:24PM +0530, Yadav, Arvind wrote:
>
> On 01-09-2026 02:30, Rodrigo Vivi wrote:
> > On Thu, Aug 27, 2026 at 03:48:00PM +0530, Arvind Yadav wrote:
> > > The system PM notifier runs before the PCI suspend callback and may evict
> > > BOs or submit migration work. This work must not start after the device
> > > has been declared wedged.
> > >
> > > Skip PM preparation for a wedged device. Track whether preparation ran
> > > so the post callback only performs matching cleanup and releases the
> > > runtime PM reference when needed.
> > >
> > > Cc: Matthew Brost <[email protected]>
> > > Cc: Thomas Hellström <[email protected]>
> > > Cc: Himal Prasad Ghimiray <[email protected]>
> > > Cc: Rodrigo Vivi <[email protected]>
> > > Assisted-by: Claude:claude-opus-4-8
> > > Signed-off-by: Arvind Yadav <[email protected]>
> > > ---
> > > drivers/gpu/drm/xe/xe_device_types.h | 2 ++
> > > drivers/gpu/drm/xe/xe_pm.c | 10 ++++++++++
> > > 2 files changed, 12 insertions(+)
> > >
> > > diff --git a/drivers/gpu/drm/xe/xe_device_types.h
> > > b/drivers/gpu/drm/xe/xe_device_types.h
> > > index 508ba3872e72..c9dc417878e7 100644
> > > --- a/drivers/gpu/drm/xe/xe_device_types.h
> > > +++ b/drivers/gpu/drm/xe/xe_device_types.h
> > > @@ -471,6 +471,8 @@ struct xe_device {
> > > /** @pm_notifier: Our PM notifier to perform actions in
> > > response to various PM events. */
> > > struct notifier_block pm_notifier;
> > > + /** @pm_notifier_active: PM notifier prepare work was performed */
> > > + bool pm_notifier_active;
> > > /** @pm_block: Completion to block validating tasks on suspend
> > > / hibernate prepare */
> > > struct completion pm_block;
> > > /** @rebind_resume_list: List of wq items to kick on resume. */
> > > diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
> > > index 720e083cd279..dd7fd170bc94 100644
> > > --- a/drivers/gpu/drm/xe/xe_pm.c
> > > +++ b/drivers/gpu/drm/xe/xe_pm.c
> > > @@ -457,9 +457,14 @@ static int xe_pm_notifier_callback(struct
> > > notifier_block *nb,
> > > {
> > > struct xe_validation_ctx ctx;
> > > + /* Do not start PM preparation after a wedge is declared. */
> > > + if (xe_device_wedged(xe))
> > > + break;
> > perhaps we need to return NOTIFY_BAD ?!
>
>
> Thanks for the review.
> I do not think `NOTIFY_BAD` is needed here. A permanently wedged device
> should not prevent system suspend.
> pm_notifier_call_chain_robust() passes the notifier result to
> notifier_to_errno(). NOTIFY_BAD becomes -EPERM, which will aborts system
> suspend.
ack
>
> ~Arvind
>
> >
> > > +
> > > reinit_completion(&xe->pm_block);
> > > xe_pm_block_begin_signalling();
> > > xe_pm_runtime_get(xe);
> > > + xe->pm_notifier_active = true;
> > > (void)xe_validation_ctx_init(&ctx, &xe->val, NULL,
> > > (struct xe_val_flags)
> > > {.exclusive = true});
> > > err = xe_bo_evict_all_user(xe);
> > > @@ -480,6 +485,11 @@ static int xe_pm_notifier_callback(struct
> > > notifier_block *nb,
> > > }
> > > case PM_POST_HIBERNATION:
> > > case PM_POST_SUSPEND:
> > > + if (!xe->pm_notifier_active)
> > > + break;
> > > +
> > > + xe->pm_notifier_active = false;
> > > +
> > > complete_all(&xe->pm_block);
> > > xe_pm_wake_rebind_workers(xe);
> > > xe_bo_notifier_unprepare_all_pinned(xe);
> > > --
> > > 2.43.0
> > >