From: sashiko-bot@kernel.org
To: "Michael J. Ruhl" <michael.j.ruhl@intel.com>
Cc: intel-xe@lists.freedesktop.org
Subject: Re: [PATCH v11 17/20] drm/xe/vsec: Support late bind fw information
Date: Wed, 23 Sep 2026 18:31:29 +0000 [thread overview]
Message-ID: <20260923183130.2503E1F00893@smtp.kernel.org> (raw)
In-Reply-To: <20260923181115.2514193-39-michael.j.ruhl@intel.com>
Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
- [High] core: devres leak and UAF due to concurrent delayed work
- [High] pm: invalid hardware access during suspend from non-freezable workqueue
- [Medium] locking: SRCU read lock held across 20s msleep blocks hotunplug
- [Medium] locking: lock inversion between pmt.lock and device core locks
- [Medium] task: 20s uninterruptible msleep enables local DoS
--
commit 0381c7581cc6bd07b52526c81bae84b56ea49be4
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. This commit updates 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 0f6e3be520c09..5384fef5e5ac5 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)) {
[Severity: High]
Can this result in hardware hangs or master aborts during system suspend?
This delayed work is queued on system_wq, which lacks the WQ_FREEZABLE flag.
Because the driver's system suspend path does not cancel or flush this work,
the worker thread could wake up during or after suspend.
If that happens, xe_sysctrl_is_oobmsm_fw_ready() will attempt to read MMIO
registers while the PCI device is powered down in D3cold.
> + 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);
> +}
> +
> +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 cause localized task lockups?
If user-space initiates a read on PMT telemetry and the firmware never
completes, this will loop on msleep() for up to 20 seconds. The thread
will be blocked in uninterruptible sleep (TASK_UNINTERRUPTIBLE) and will
ignore all signals, including SIGKILL, until the timeout expires.
Could this be exploited by a local user to intentionally block multiple
threads, leading to inflated load averages or resource exhaustion?
> + }
> +
> + drm_warn(&xe->drm, "Late Binding failed to complete\n");
> +
> + return false;
> +}
> +
> /**
> * xe_pmt_telem_read - Given a device and a PMT GUID, read data into a buffer
> * @dev: valid Xe device
[ ... ]
> @@ -343,6 +395,11 @@ int xe_pmt_telem_read(struct device *dev, u32 guid, u64 *data, loff_t user_offse
> goto dev_exit;
> }
>
> + if (!wait_for_fw(xe)) {
[Severity: Medium]
Does holding the DRM SRCU read lock across this 20-second wait block
device hot-unplug?
User-space reads to PMT telemetry enter xe_pmt_telem_read(), which calls
drm_dev_enter() and acquires the SRCU read lock before reaching here.
If a device hot-unplug occurs while wait_for_fw() is sleeping for 20
seconds, drm_dev_unplug() will call synchronize_srcu(). This will block
the unplug process and critical kernel teardown paths until the timeout
expires and the SRCU reader exits.
> + ret = -ENODATA;
> + goto runtime_exit;
> + }
> +
> scoped_guard(mutex, &xe->pmt.lock) {
> /* set SoC re-mapper index register based on GUID memory region */
> xe->soc_remapper.set_telem_region(xe, mem_region);
[ ... ]
> @@ -477,12 +545,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);
[Severity: Medium]
Is there a lock inversion here between pmt.lock and the driver core locks?
This function acquires xe->pmt.lock via guard(mutex) and then calls
intel_vsec_register(), which interacts with the driver core to add
devices and trigger probes, acquiring driver core locks like device_lock.
When user-space accesses PMT sysfs files, the driver core acquires its
locks first (e.g., kernfs and device_lock), and then calls
xe_pmt_telem_read(), which acquires pmt.lock.
This circular dependency could lead to a lockdep splat or an AB-BA
self-deadlock.
> +}
> +
> +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))
[Severity: High]
Can this concurrent delayed work cause a devres leak and a Use-After-Free
of the parent device?
During device unbind, devres_release_all() splices the devres_head list
and iterates over it. It calls this devm action, which blocks here on
disable_delayed_work_sync().
Meanwhile, the delayed work can call cri_late_bind_probe(), which calls
intel_vsec_register(). This dynamically allocates and appends new devm
resources to the now-empty devres_head.
When the work finishes, devres_release_all() returns without checking
devres_head again. The new resources are permanently leaked. Also, because
the parent device is freed, the orphaned auxiliary devices will hold
dangling pointers to it.
> + xe_pm_runtime_put(xe);
> +}
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260923181115.2514193-22-michael.j.ruhl@intel.com?part=17
next prev parent reply other threads:[~2026-09-23 18:31 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-23 18:11 [PATCH v11 00/20] Crescent Island PMT support Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 01/20] platform/x86/intel/pmt: complete pcidev to device update Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 02/20] platform/x86/intel/pmt: refactor rmw with a return value Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 03/20] platform/x86/intel/pmt: refactor rc " Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 04/20] platform/x86/intel/pmt: Add register access callbacks Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 05/20] platform/x86/intel/pmt: Do not remap when using callbacks Michael J. Ruhl
2026-09-23 18:29 ` sashiko-bot
2026-09-29 13:12 ` Rodrigo Vivi
2026-09-23 18:11 ` [PATCH v11 06/20] drm/xe/vsec: Do not register BMG PMT for VF Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 07/20] drm/xe/vsec: Correct locking order Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 08/20] drm/xe/vsec: Use correct pm state get Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 09/20] drm/xe/vsec: Add DOC text for VSEC Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 10/20] drm/xe/vsec: Support possible hotplug exit Michael J. Ruhl
2026-09-23 18:18 ` sashiko-bot
2026-09-23 18:11 ` [PATCH v11 11/20] drm/xe/vsec: Refactor BattleMage PMT defines Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 12/20] drm/xe/vsec: Update VSEC probe order Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 13/20] drm/xe/vsec: Add base_offset to allow for more flexibilty Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 14/20] drm/xe/vsec: Support Crescent Island PMT Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 15/20] drm/xe/vsec: Crescent Island PMT decode Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 16/20] drm/xe/vsec: Crescent Island PMT callbacks Michael J. Ruhl
2026-09-23 18:28 ` sashiko-bot
2026-09-23 18:11 ` [PATCH v11 17/20] drm/xe/vsec: Support late bind fw information Michael J. Ruhl
2026-09-23 18:31 ` sashiko-bot [this message]
2026-09-30 4:09 ` Rodrigo Vivi
2026-09-30 12:57 ` Ruhl, Michael J
2026-09-30 13:04 ` Rodrigo Vivi
2026-09-23 18:11 ` [PATCH v11 18/20] drm/xe/vsec: Add PMT GUID internal access Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 19/20] drm/xe/vsec: Update PMT " Michael J. Ruhl
2026-09-23 18:11 ` [PATCH v11 20/20] drm/xe/vsec: Refactor platform check Michael J. Ruhl
2026-09-23 18:20 ` ✗ CI.checkpatch: warning for Crescent Island PMT support (rev13) Patchwork
2026-09-23 18:22 ` ✓ CI.KUnit: success " Patchwork
2026-09-23 20:26 ` ✓ Xe.CI.BAT: " Patchwork
2026-09-24 8:49 ` ✗ Xe.CI.FULL: failure " Patchwork
2026-09-29 8:12 ` [PATCH v11 00/20] Crescent Island PMT support Ilpo Järvinen
2026-09-29 13:20 ` Rodrigo Vivi
2026-09-30 6:23 ` Ilpo Järvinen
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=20260923183130.2503E1F00893@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