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 ?!

> +
>               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
> 

Reply via email to