All of lore.kernel.org
 help / color / mirror / Atom feed
From: Raag Jadav <raag.jadav@intel.com>
To: intel-xe@lists.freedesktop.org
Cc: riana.tauro@intel.com, michal.wajdeczko@intel.com,
	lukasz.laguna@intel.com, matthew.d.roper@intel.com,
	matthew.brost@intel.com, mallesh.koujalagi@intel.com,
	rodrigo.vivi@intel.com
Subject: Re: [PATCH v4 3/5] drm/xe: Make xe_device_declare_wedged() IRQ safe
Date: Mon, 12 Oct 2026 17:09:13 +0200	[thread overview]
Message-ID: <asz4GazPFrdggzig@black.igk.intel.com> (raw)
In-Reply-To: <20261010090718.68308-4-raag.jadav@intel.com>

On Sat, Oct 10, 2026 at 02:36:20PM +0530, Raag Jadav wrote:
> Currently, xe_device_declare_wedged() implementation wedges the GTs and
> sends wedged uevent to userspace. This is problematic for usecases which
> require declaring the device as wedged in IRQ context, as it allocates
> memory for event buffer and acquires mutexes deep into it's call path.
> 
> Fix this by deferring wedge handling into its dedicated worker, so that
> xe_device_declare_wedged() can be called in IRQ context.
> 
> First user of this requirement is introduced in commit def675cf3f10
> ("drm/xe/mert: Improve handling of MERT CAT errors"), which declares the
> device as wedged on catastrophic errors received in form of an IRQ.

I just realized that this is fundamentally flawed. IRQ just means the
device is in D0 state and doesn't necessarily indicate non-zero refcount
which is a prerequisite for xe_device_declare_wedged() call.

I'll be dropping this patch in next revision but the rest of the series
still needs to land for other long standing stable fixes and debt cleanup.

Raag

> Fixes: def675cf3f10 ("drm/xe/mert: Improve handling of MERT CAT errors")
> Signed-off-by: Raag Jadav <raag.jadav@intel.com>
> Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
> v2: Split fixes into separate patches (Rodrigo, Michal)
> ---
>  drivers/gpu/drm/xe/xe_device.c       | 51 +++++++++++++++++-----------
>  drivers/gpu/drm/xe/xe_device_types.h |  2 ++
>  2 files changed, 34 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index 6ae1da578bda..2a7794aa71f9 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -697,8 +697,16 @@ static int xe_device_vram_alloc(struct xe_device *xe)
>  	return 0;
>  }
>  
> +static void wedged_work(struct work_struct *work);
>  static void xe_device_wedged_fini(struct drm_device *drm, void *arg);
>  
> +static int xe_device_wedged_init(struct xe_device *xe)
> +{
> +	INIT_WORK(&xe->wedged.work, wedged_work);
> +
> +	return drmm_add_action_or_reset(&xe->drm, xe_device_wedged_fini, xe);
> +}
> +
>  /**
>   * xe_device_probe_early: Device early probe
>   * @xe: xe device instance
> @@ -767,7 +775,7 @@ int xe_device_probe_early(struct xe_device *xe)
>  	if (err)
>  		return err;
>  
> -	err = drmm_add_action_or_reset(&xe->drm, xe_device_wedged_fini, xe);
> +	err = xe_device_wedged_init(xe);
>  	if (err)
>  		return err;
>  
> @@ -1392,6 +1400,26 @@ void xe_device_set_wedged_method(struct xe_device *xe, unsigned long method)
>  	xe->wedged.method = method;
>  }
>  
> +static void wedged_work(struct work_struct *work)
> +{
> +	struct xe_device *xe = container_of(work, struct xe_device, wedged.work);
> +
> +	/*
> +	 * XE_WEDGED_MODE_UPON_ANY_HANG_NO_RESET is intended for debugging
> +	 * hangs, so wedge the device with 'none' recovery method and have
> +	 * it available to the user for debugging.
> +	 */
> +	if (xe->wedged.mode == XE_WEDGED_MODE_UPON_ANY_HANG_NO_RESET)
> +		xe_device_set_wedged_method(xe, DRM_WEDGE_RECOVERY_NONE);
> +	/* If no wedge recovery method is set, use default */
> +	else if (!xe->wedged.method)
> +		xe_device_set_wedged_method(xe, DRM_WEDGE_RECOVERY_REBIND |
> +					    DRM_WEDGE_RECOVERY_BUS_RESET);
> +
> +	/* Notify userspace of wedged device */
> +	drm_dev_wedged_event(&xe->drm, xe->wedged.method, NULL);
> +}
> +
>  #define WEDGED_URL	"https://docs.kernel.org/gpu/drm-uapi.html#device-wedging"
>  #define XE_BUG_URL	"https://gitlab.freedesktop.org/drm/xe/kernel/issues/new"
>  
> @@ -1432,26 +1460,11 @@ void xe_device_declare_wedged(struct xe_device *xe)
>  			    "For recovery procedure, refer to %s\n"
>  			    "Please file a _new_ bug report at %s\n",
>  			    WEDGED_URL, XE_BUG_URL);
> -	}
>  
> -	for_each_initialized_gt(gt, xe, id)
> -		xe_gt_declare_wedged(gt);
> +		for_each_initialized_gt(gt, xe, id)
> +			xe_gt_declare_wedged(gt);
>  
> -	if (xe_device_wedged(xe)) {
> -		/*
> -		 * XE_WEDGED_MODE_UPON_ANY_HANG_NO_RESET is intended for debugging
> -		 * hangs, so wedge the device with 'none' recovery method and have
> -		 * it available to the user for debugging.
> -		 */
> -		if (xe->wedged.mode == XE_WEDGED_MODE_UPON_ANY_HANG_NO_RESET)
> -			xe_device_set_wedged_method(xe, DRM_WEDGE_RECOVERY_NONE);
> -		/* If no wedge recovery method is set, use default */
> -		else if (!xe->wedged.method)
> -			xe_device_set_wedged_method(xe, DRM_WEDGE_RECOVERY_REBIND |
> -						    DRM_WEDGE_RECOVERY_BUS_RESET);
> -
> -		/* Notify userspace of wedged device */
> -		drm_dev_wedged_event(&xe->drm, xe->wedged.method, NULL);
> +		schedule_work(&xe->wedged.work);
>  	}
>  }
>  
> diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
> index 4e0e1bc040c1..ec5c1f0b8f00 100644
> --- a/drivers/gpu/drm/xe/xe_device_types.h
> +++ b/drivers/gpu/drm/xe/xe_device_types.h
> @@ -547,6 +547,8 @@ struct xe_device {
>  		unsigned long method;
>  		/** @wedged.inconsistent_reset: Inconsistent reset policy state between GTs */
>  		bool inconsistent_reset;
> +		/** @wedged.work: Worker for wedge handling */
> +		struct work_struct work;
>  	} wedged;
>  
>  	/** @devres_group: devres group */
> -- 
> 2.43.0
> 

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

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-10  9:06 [PATCH v4 0/5] Introduce xe_wedge Raag Jadav
2026-10-10  9:06 ` [PATCH v4 1/5] drm/xe/gt: Use GT ordered workqueue for wedging Raag Jadav
2026-10-10  9:17   ` sashiko-bot
2026-10-12 20:43   ` Matthew Brost
2026-10-10  9:06 ` [PATCH v4 2/5] drm/xe: Move xe_device_wedged_fini() registration to xe_device_probe_early() Raag Jadav
2026-10-10  9:06 ` [PATCH v4 3/5] drm/xe: Make xe_device_declare_wedged() IRQ safe Raag Jadav
2026-10-10  9:19   ` sashiko-bot
2026-10-12 15:09   ` Raag Jadav [this message]
2026-10-10  9:06 ` [PATCH v4 4/5] drm/xe: Introduce xe_wedge Raag Jadav
2026-10-12 20:46   ` Matthew Brost
2026-10-10  9:06 ` [PATCH v4 5/5] drm/xe/ras: Move xe_ras_process_errors() to xe_ras Raag Jadav
2026-10-10  9:28   ` sashiko-bot
2026-10-10  9:15 ` ✗ CI.checkpatch: warning for Introduce xe_wedge (rev3) Patchwork
2026-10-10  9:17 ` ✓ CI.KUnit: success " Patchwork
2026-10-10 10:06 ` ✓ Xe.CI.BAT: " Patchwork
2026-10-10 11:29 ` ✓ Xe.CI.FULL: " 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=asz4GazPFrdggzig@black.igk.intel.com \
    --to=raag.jadav@intel.com \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=lukasz.laguna@intel.com \
    --cc=mallesh.koujalagi@intel.com \
    --cc=matthew.brost@intel.com \
    --cc=matthew.d.roper@intel.com \
    --cc=michal.wajdeczko@intel.com \
    --cc=riana.tauro@intel.com \
    --cc=rodrigo.vivi@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.