Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Michael J. Ruhl" <michael.j.ruhl@intel.com>
Cc: intel-xe@lists.freedesktop.org
Subject: Re: [PATCH v9 17/20] drm/xe/vsec: Support late bind fw information
Date: Wed, 16 Sep 2026 20:29:02 +0000	[thread overview]
Message-ID: <20260916202902.ABAA31F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260916201139.2374531-39-michael.j.ruhl@intel.com>

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [High] devres: memory leak and dangling devices due to worker racing with devres_release_all
- [High] pm: non-freezable delayed work accesses MMIO during system suspend
- [Medium] pm: asynchronous pm_runtime_put() during device removal causes incorrect power state
- [Medium] pm: uninterruptible msleep in wait_for_fw() blocks task freezer and system suspend
--

commit 2311d189c57553ad608d675783c5e664a010f6ef
Author: Michael J. Ruhl <michael.j.ruhl@intel.com>

drm/xe/vsec: Support late bind fw information

CRI FW is loaded on power on.  Because of this, access to the FW cannot
be done until it is running.

Update the XE PMT probe and access to check for late bind devices,
verify, and wait for the appropriate FW state before probe or access.

> diff --git a/drivers/gpu/drm/xe/xe_vsec.c b/drivers/gpu/drm/xe/xe_vsec.c
> index d1427ec507285..f905ef51df656 100644
> --- a/drivers/gpu/drm/xe/xe_vsec.c
> +++ b/drivers/gpu/drm/xe/xe_vsec.c

[ ... ]

> @@ -281,6 +291,48 @@ static int xe_guid_decode(u32 guid, int *index, u32 *offset)
>  	return -ENODEV;
>  }
>  
> +static void cri_late_bind_probe_work(struct work_struct *work)
> +{
> +	struct xe_device *xe = container_of(work, struct xe_device, pmt.work.work);
> +
> +	if (xe_sysctrl_is_oobmsm_fw_ready(xe)) {
> +		cri_late_bind_probe(xe);
> +		xe_pm_runtime_put(xe);
> +		return;
> +	}
> +
> +	xe->pmt.retry_count++;
> +
> +	/* wait up to 20 seconds */
> +	if (xe->pmt.retry_count == VSEC_LATE_BIND_RETRY) {
> +		drm_warn(&xe->drm, "PMT probe: Late Binding failed to complete\n");
> +		xe_pm_runtime_put(xe);
> +		return;
> +	}
> +
> +	if (!schedule_delayed_work(&xe->pmt.work, msecs_to_jiffies(VSEC_LATE_BIND_DELAY_MSEC)))
> +		xe_pm_runtime_put(xe);
> +}

[Severity: High]
Does scheduling this delayed work on the default non-freezable workqueue risk
MMIO access during system suspend?

If the system enters suspend (S3) while the worker is in its polling loop,
the PCI device is put into the D3 state. Because the worker is on a
non-freezable workqueue, it continues running and calls
xe_sysctrl_is_oobmsm_fw_ready(), which performs MMIO reads on powered-down
hardware.

> +
> +static bool wait_for_fw(struct xe_device *xe)
> +{
> +	int retries = VSEC_LATE_BIND_RETRY;  /* wait up to 20 secs */
> +
> +	if (xe->info.platform != XE_CRESCENTISLAND)
> +		return true;
> +
> +	while (retries--) {
> +		if (xe_sysctrl_is_oobmsm_fw_ready(xe))
> +			return true;
> +
> +		msleep(VSEC_LATE_BIND_DELAY_MSEC);
> +	}

[Severity: Medium]
Could this uninterruptible sleep delay task freezing for up to 20 seconds
during system suspend?

If userspace initiates a read on the PMT telemetry sysfs file, calling
xe_pmt_telem_read(), it enters this wait_for_fw() loop. If a system suspend is
triggered concurrently, the uninterruptible msleep() loop prevents the task
from handling the freeze signal before the 20-second freezer timeout expires.

[ ... ]

> @@ -476,12 +544,46 @@ static enum xe_vsec get_platform_info(struct xe_device *xe)
>  	return vsec_platforms[xe->info.platform];
>  }
>  
> +static void cri_late_bind_probe(struct xe_device *xe)
> +{
> +	struct intel_vsec_platform_info *info;
> +	struct device *dev = xe->drm.dev;
> +	enum xe_vsec platform;
> +
> +	platform = get_platform_info(xe);
> +	if (platform != XE_VSEC_CRI)
> +		return;
> +
> +	info = &xe_vsec_info[platform];
> +	if (!info->headers)
> +		return;
> +
> +	guard(mutex)(&xe->pmt.lock);
> +
> +	info->priv_data = &xe_cri_pmt_cb;
> +	xe->soc_remapper.set_telem_region(xe, CRI_IDX_TELEM_DISCOVERY);
> +
> +	intel_vsec_register(dev, info);
> +}
> +
> +static void vsec_disable_late_bind_work(void *arg)
> +{
> +	struct xe_device *xe = arg;
> +
> +	/*
> +	 * If the queued work is canceled, the runtime reference needs to be
> +	 * released here.
> +	 */
> +	if (disable_delayed_work_sync(&xe->pmt.work))
> +		xe_pm_runtime_put(xe);
> +}

[Severity: Medium]
Is it safe to use an asynchronous runtime put here during the device removal
path?

When device removal triggers this function via devres cleanup, the pending
async idle/suspend work can be cancelled by pm_runtime_disable(), leaving
the hardware in an active power state indefinitely. Should this be a
synchronous put (xe_pm_runtime_put_sync()) instead?

[ ... ]

> @@ -489,11 +591,11 @@ void xe_vsec_init(struct xe_device *xe)
[ ... ]
>  	case XE_VSEC_CRI:
>  		xe->pmt.base_offset = CRI_PMT_OFFSET;
> +
> +		xe->pmt.retry_count = 0;
> +		INIT_DELAYED_WORK(&xe->pmt.work, cri_late_bind_probe_work);
> +
> +		xe_pm_runtime_get_noresume(xe);
> +		if (!xe_sysctrl_is_oobmsm_fw_ready(xe)) {
> +			schedule_delayed_work(&xe->pmt.work,
> +					      msecs_to_jiffies(VSEC_LATE_BIND_DELAY_MSEC));
> +			return devm_add_action_or_reset(xe->drm.dev,
> +							vsec_disable_late_bind_work,
> +							xe);
> +		}
> +

[Severity: High]
Can this worker thread race with devres_release_all() during device unbind?

If the driver is unbound while the worker is in its polling loop,
devres_release_all() splices the devres list and executes
vsec_disable_late_bind_work(), which waits for the worker to finish.

However, the worker calls intel_vsec_register() in cri_late_bind_probe(),
which adds new devres items to the device. Since devres_release_all() only
splices the list once before executing it, any devres items added by the
worker are permanently leaked.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260916201139.2374531-22-michael.j.ruhl@intel.com?part=17

  reply	other threads:[~2026-09-16 20:29 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-16 20:11 [PATCH v9 00/20] Crescent Island PMT support Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 01/20] platform/x86/intel/pmt: complete pcidev to device update Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 02/20] platform/x86/intel/pmt: refactor rmw with a return value Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 03/20] platform/x86/intel/pmt: refactor rc " Michael J. Ruhl
2026-09-16 20:20   ` sashiko-bot
2026-09-17  9:55   ` Ilpo Järvinen
2026-09-16 20:11 ` [PATCH v9 04/20] platform/x86/intel/pmt: Add register access callbacks Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 05/20] platform/x86/intel/pmt: Do not remap when using callbacks Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 06/20] drm/xe/vsec: Do not register BMG PMT for VF Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 07/20] drm/xe/vsec: Correct locking order Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 08/20] drm/xe/vsec: Use correct pm state get Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 09/20] drm/xe/vsec: Add DOC text for VSEC Michael J. Ruhl
2026-09-16 20:29   ` sashiko-bot
2026-09-17  9:56   ` Ilpo Järvinen
2026-09-17  9:57   ` Ilpo Järvinen
2026-09-17 12:55     ` Ruhl, Michael J
2026-09-16 20:11 ` [PATCH v9 10/20] drm/xe/vsec: Support possible hotplug exit Michael J. Ruhl
2026-09-16 20:21   ` sashiko-bot
2026-09-16 20:11 ` [PATCH v9 11/20] drm/xe/vsec: Refactor BattleMage PMT defines Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 12/20] drm/xe/vsec: Update VSEC probe order Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 13/20] drm/xe/vsec: Add base_offset to allow for more flexibilty Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 14/20] drm/xe/vsec: Support Crescent Island PMT Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 15/20] drm/xe/vsec: Crescent Island PMT decode Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 16/20] drm/xe/vsec: Crescent Island PMT callbacks Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 17/20] drm/xe/vsec: Support late bind fw information Michael J. Ruhl
2026-09-16 20:29   ` sashiko-bot [this message]
2026-09-17 12:30     ` Ruhl, Michael J
2026-09-16 20:11 ` [PATCH v9 18/20] drm/xe/vsec: Add PMT GUID internal access Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 19/20] drm/xe/vsec: Update PMT " Michael J. Ruhl
2026-09-16 20:11 ` [PATCH v9 20/20] drm/xe/vsec: Refactor platform check Michael J. Ruhl
2026-09-16 20:44 ` ✗ CI.checkpatch: warning for Crescent Island PMT support (rev11) Patchwork
2026-09-16 20:46 ` ✓ CI.KUnit: success " Patchwork
2026-09-16 22:00 ` ✗ Xe.CI.BAT: failure " Patchwork
2026-09-17  1:39 ` ✗ 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=20260916202902.ABAA31F000FF@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=michael.j.ruhl@intel.com \
    --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