Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Nilawar, Badal" <badal.nilawar@intel.com>
To: <sashiko-reviews@lists.linux.dev>
Cc: <intel-xe@lists.freedesktop.org>
Subject: Re: [PATCH v2 07/11] drm/xe/cper: Allow hardware error CPER reporting from xe_log
Date: Sun, 6 Sep 2026 21:48:49 +0530	[thread overview]
Message-ID: <6a0b15ac-473d-45f6-9bd8-71a5b681b7c2@intel.com> (raw)
In-Reply-To: <20260825175419.377F21F000E9@smtp.kernel.org>


On 25-08-2026 23:24, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
> - [High] Blindly casting and passing the optional `data` parameter in `log_emit_cper` to hardware CPER emission paths causes kernel crashes if the pointer is NULL or an ERR_PTR.
> - [High] Synchronous hardware CPER emission inside the `xe_log` backend introduces blocking and sleepable operations into general-purpose logging paths, leading to deadlocks and panics when called from atomic contexts.
> - [Medium] Missing payload length validation before casting `data` to `struct xe_ras_error_class *` allows out-of-bounds memory access.
> --
>
> commit cde7fec12b9f07e68b4ed966ff02eeef7dd8e6db
> Author: Badal Nilawar <badal.nilawar@intel.com>
>
> drm/xe/cper: Allow hardware error CPER reporting from xe_log
>      
> Add a public wrapper xe_emit_hardware_error_cper() to enable xe_log.c to
> emit hardware error CPER records. This hooks into log_emit_cper() to report
> hardware signatures.
>
>> diff --git a/drivers/gpu/drm/xe/xe_log.c b/drivers/gpu/drm/xe/xe_log.c
>> index 5549ef6966fd8..c78fc195c55bd 100644
>> --- a/drivers/gpu/drm/xe/xe_log.c
>> +++ b/drivers/gpu/drm/xe/xe_log.c
> [ ... ]
>> @@ -10,15 +10,25 @@
>>   
>>   #include "xe_device.h"
>>   #include "xe_log.h"
>> +#include "xe_ras.h"
>>   #include "xe_printk.h"
>>   
>> +static bool is_hw_sigid(enum xe_sigid sigid)
>> +{
>> +	return (int)sigid >= INTEL_SIGID_GPU_XE_HARDWARE_START;
>> +}
>> +
>>   static void log_emit_cper(struct pci_dev *pdev, int cper_sev, enum xe_sigid sigid,
>>   			  u32 component, u32 location, const void *data, size_t len,
>>   			  struct va_format *vaf)
>>   {
>>   	KUNIT_STATIC_STUB_REDIRECT(log_emit_cper, pdev, cper_sev, sigid,
>>   				   component, location, data, len, vaf);
>> -	/* TODO */
>> +	/* TODO software CPER */
>> +
>> +	if (is_hw_sigid(sigid))
>> +		xe_emit_hardware_error_cper(pdev, cper_sev, sigid,
>> +					    (struct xe_ras_error_class *)data);
> [Severity: High]
> Will this block or sleep when called from atomic contexts?
>
> When a caller invokes xe_log macros (such as xe_log_comp_fatal()) from an
> interrupt handler or while holding a spinlock, this synchronously invokes
> xe_emit_hardware_error_cper() from a general-purpose logging path.
>
> The underlying hardware CPER emission path eventually calls get_counter(),
> which invokes xe_sysctrl_send_command(). That function explicitly checks
> for sleep and acquires a mutex:
>
> drivers/gpu/drm/xe/xe_sysctrl_mailbox.c:xe_sysctrl_send_command() {
>      might_sleep();
>      ...
>      guard(mutex)(&sc->cmd_lock);
>      ...
> }
>
> Should this operation be deferred to a workqueue to avoid deadlocks when
> logging from atomic contexts?

Current HW CPER users (xe_ras_counter_threshold_crossed() and 
xe_ras_process_errors()) are not IRQ-context paths and already issue 
mailbox commands through xe_sysctrl_send_command() before reaching the 
logging code.

As such, the CPER emission path does not introduce a new sleepable 
context requirement.

>
> [Severity: Medium]
> Could this cause an out-of-bounds read if the provided payload is smaller
> than the expected structure?
>
> The __xe_log_emit() API accepts an opaque data pointer alongside a length
> parameter. Since this cast ignores the len parameter, if a caller provides a
> valid payload that is smaller than sizeof(struct xe_ras_error_class),
> downstream functions like get_counter() will read past the end of the buffer
> when dereferencing it:
>
> drivers/gpu/drm/xe/xe_ras.c:get_counter() {
>      ...
>      request.counter = *counter;
>      ...
> }
This will be fixed in next rev.
>
>>   }
> [ ... ]
>> diff --git a/drivers/gpu/drm/xe/xe_ras.c b/drivers/gpu/drm/xe/xe_ras.c
>> index ff9d917b8e29c..b4cdb5ec64915 100644
>> --- a/drivers/gpu/drm/xe/xe_ras.c
>> +++ b/drivers/gpu/drm/xe/xe_ras.c
>> @@ -837,6 +837,29 @@ static void emit_hw_error_cper(struct xe_device *xe,
>>   	}
>>   }
>>   
>> +/**
>> + * xe_emit_hardware_error_cper() - Emit a hardware error CPER record
>> + * @pdev: PCI device associated with the Xe device
>> + * @cper_sev: CPER severity
>> + * @sigid: Error signature identifier
>> + * @error_class: Hardware error classification details
>> + *
>> + * Emit a CPER record for a hardware error
>> + */
>> +void xe_emit_hardware_error_cper(struct pci_dev *pdev, int cper_sev, enum xe_sigid sigid,
>> +				 struct xe_ras_error_class *counter)
>> +{
>> +	struct xe_device *xe = pdev_to_xe_device(pdev);
>> +
>> +	if (!xe)
>> +		return;
>> +
>> +	if (counter && !ras_counter_is_valid(xe, counter))
>> +		return;
> [Severity: High]
> Does this check handle error pointers or NULL pointers safely?
>
> The xe_log_err() macro permits the data parameter to be an ERR_PTR
> (e.g., ERR_PTR(-EIO)). Because an error pointer is not NULL, this check
> will pass it directly to ras_counter_is_valid(), which will dereference it
> and cause a kernel panic:
>
> drivers/gpu/drm/xe/xe_ras.c:ras_counter_is_valid() {
>      u8 severity = counter->common.severity;
>      ...
> }
>
> Furthermore, if counter is NULL, this check is bypassed entirely, but the
> pointer is later unconditionally dereferenced inside get_counter() when
> emit_hw_error_cper() is called:
>
> drivers/gpu/drm/xe/xe_ras.c:get_counter() {
>      ...
>      request.counter = *counter;
>      ...
> }

This will be fixed in next rev.

Thanks,

Badal

>
>> +
>> +	emit_hw_error_cper(xe, counter, NULL, sigid, cper_sev);
>> +}
>> +
>>   /**
>>    * xe_ras_process_errors() - Process and contain hardware errors
>>    * @xe: xe device instance
> [ ... ]
>

  reply	other threads:[~2026-09-06 16:19 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-25 17:59 [PATCH v2 00/11] Add CPER logging support for CRI Badal Nilawar
2026-08-25 17:59 ` [PATCH v2 01/11] drm/xe/xe_ras: Add support to retrieve info queue data " Badal Nilawar
2026-08-25 17:53   ` sashiko-bot
2026-08-26  0:54     ` Rodrigo Vivi
2026-09-06  5:56     ` Nilawar, Badal
2026-08-25 20:48   ` Michal Wajdeczko
2026-08-25 17:59 ` [PATCH v2 02/11] drm/xe/xe_ras: Refactor get_counter() to return response structure Badal Nilawar
2026-08-25 17:59 ` [PATCH v2 03/11] drm/xe/cper: Add CPER structures and trace event Badal Nilawar
2026-08-25 17:51   ` sashiko-bot
2026-09-06  5:36     ` Nilawar, Badal
2026-08-28 15:23   ` Rodrigo Vivi
2026-08-25 17:59 ` [PATCH v2 04/11] drm/xe/cper: APIs to prepare and log CPER record Badal Nilawar
2026-08-25 18:02   ` sashiko-bot
2026-08-26  0:59     ` Rodrigo Vivi
2026-08-25 17:59 ` [PATCH v2 05/11] drm/xe/cper: Prepare Intel CPER error info from info queue Badal Nilawar
2026-08-25 17:54   ` sashiko-bot
2026-09-06 14:15     ` Nilawar, Badal
2026-08-25 17:59 ` [PATCH v2 06/11] drm/xe/cper: Log CPER records for aggregate counter retrival Badal Nilawar
2026-08-25 17:55   ` sashiko-bot
2026-08-26  1:01   ` Rodrigo Vivi
2026-08-25 17:59 ` [PATCH v2 07/11] drm/xe/cper: Allow hardware error CPER reporting from xe_log Badal Nilawar
2026-08-25 17:54   ` sashiko-bot
2026-09-06 16:18     ` Nilawar, Badal [this message]
2026-08-27 21:27   ` Michal Wajdeczko
2026-08-25 17:59 ` [PATCH v2 08/11] drm/xe/ras: Report device memory errors using SIGID Badal Nilawar
2026-08-25 17:58   ` sashiko-bot
2026-08-27 20:25   ` Michal Wajdeczko
2026-08-25 17:59 ` [PATCH v2 09/11] drm/xe/ras: Report core compute " Badal Nilawar
2026-08-25 17:55   ` sashiko-bot
2026-08-25 17:59 ` [PATCH v2 10/11] drm/xe/ras: Report soc internal " Badal Nilawar
2026-08-28 15:20   ` Rodrigo Vivi
2026-08-25 17:59 ` [PATCH v2 11/11] drm/xe/ras: Report correctable " Badal Nilawar
2026-08-25 18:03   ` sashiko-bot
2026-08-25 18:29 ` ✗ CI.checkpatch: warning for Add CPER logging support for CRI (rev2) Patchwork
2026-08-25 18:31 ` ✓ CI.KUnit: success " Patchwork
2026-08-25 19:25 ` ✓ Xe.CI.BAT: " Patchwork
2026-08-25 22:06 ` ✗ Xe.CI.FULL: failure " Patchwork
2026-08-26 19:50 ` [PATCH v2 00/11] Add CPER logging support for CRI Matt Roper
2026-08-27 20:12   ` Rodrigo Vivi

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=6a0b15ac-473d-45f6-9bd8-71a5b681b7c2@intel.com \
    --to=badal.nilawar@intel.com \
    --cc=intel-xe@lists.freedesktop.org \
    --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