lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250601232937.3510379-46-sashal@kernel.org>
Date: Sun,  1 Jun 2025 19:28:38 -0400
From: Sasha Levin <sashal@...nel.org>
To: patches@...ts.linux.dev,
	stable@...r.kernel.org
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@...el.com>,
	Michal Wajdeczko <michal.wajdeczko@...el.com>,
	Lukasz Laguna <lukasz.laguna@...el.com>,
	Sasha Levin <sashal@...nel.org>,
	lucas.demarchi@...el.com,
	thomas.hellstrom@...ux.intel.com,
	rodrigo.vivi@...el.com,
	airlied@...il.com,
	simona@...ll.ch,
	intel-xe@...ts.freedesktop.org,
	dri-devel@...ts.freedesktop.org,
	linux-kernel@...r.kernel.org
Subject: [PATCH AUTOSEL 6.14 046/102] drm/xe/vf: Fix guc_info debugfs for VFs

From: Daniele Ceraolo Spurio <daniele.ceraolospurio@...el.com>

[ Upstream commit dba7d17d50b4488c697e991d18a0e55669d9fa59 ]

The guc_info debugfs attempts to read a bunch of registers that the VFs
doesn't have access to, so fix it by skipping the reads.

Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/4775
Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@...el.com>
Cc: Michal Wajdeczko <michal.wajdeczko@...el.com>
Cc: Lukasz Laguna <lukasz.laguna@...el.com>
Reviewed-by: Lukasz Laguna <lukasz.laguna@...el.com>
Link: https://lore.kernel.org/r/20250423173908.1571412-1-daniele.ceraolospurio@intel.com
Signed-off-by: Sasha Levin <sashal@...nel.org>
---

**YES** This commit should be backported to stable kernel trees. Here's
my analysis: ## Bug Fix Analysis The commit addresses a **specific
runtime failure** in VF (Virtual Function) environments where the
`guc_info` debugfs interface attempts to read hardware registers that
VFs don't have access to. This is a clear bug fix that prevents crashes
or access violations. ## Code Change Assessment The fix is **minimal and
surgical**: ```c - fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT); -
if (!fw_ref) - return; + if (!IS_SRIOV_VF(gt_to_xe(gt))) { + fw_ref =
xe_force_wake_get(gt_to_fw(gt), XE_FW_GT); + if (!fw_ref) + return; ```
The change wraps the problematic register access code in a VF check,
only executing the register reads for non-VF environments. This is
exactly the right approach for hardware access restrictions. ## Backport
Suitability Criteria ✅ **Fixes user-affecting bug**: VFs attempting to
use debugfs would fail/crash ✅ **Small and contained**: Only 4 lines
changed, wrapping existing code in a conditional ✅ **No architectural
changes**: Maintains existing functionality for PF, just skips for VF ✅
**Minimal regression risk**: The conditional is well-established
(`IS_SRIOV_VF`) and used throughout the codebase ✅ **Clear issue
reference**: Closes GitLab issue #4775 ✅ **Debugfs-specific**: Non-
critical path, but important for system stability ## Similar Commit
Pattern Analysis This follows the same pattern as other VF-related fixes
in the xe driver, where hardware access is conditional based on
`IS_SRIOV_VF()` checks. The kernel tree shows numerous similar patterns
where VF access restrictions are handled this way. ## Risk Assessment
**Very Low Risk**: The change only affects the debugfs interface,
doesn't modify core functionality, and uses an established conditional
pattern. For VF environments, it prevents access violations; for non-VF
environments, behavior is unchanged. This is a textbook stable backport
candidate: it fixes a clear bug with minimal, contained changes and
near-zero regression risk.

 drivers/gpu/drm/xe/xe_guc.c | 44 +++++++++++++++++++------------------
 1 file changed, 23 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
index 408365dfe4eed..2208bb528d76d 100644
--- a/drivers/gpu/drm/xe/xe_guc.c
+++ b/drivers/gpu/drm/xe/xe_guc.c
@@ -1506,30 +1506,32 @@ void xe_guc_print_info(struct xe_guc *guc, struct drm_printer *p)
 
 	xe_uc_fw_print(&guc->fw, p);
 
-	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
-	if (!fw_ref)
-		return;
+	if (!IS_SRIOV_VF(gt_to_xe(gt))) {
+		fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
+		if (!fw_ref)
+			return;
+
+		status = xe_mmio_read32(&gt->mmio, GUC_STATUS);
+
+		drm_printf(p, "\nGuC status 0x%08x:\n", status);
+		drm_printf(p, "\tBootrom status = 0x%x\n",
+			   REG_FIELD_GET(GS_BOOTROM_MASK, status));
+		drm_printf(p, "\tuKernel status = 0x%x\n",
+			   REG_FIELD_GET(GS_UKERNEL_MASK, status));
+		drm_printf(p, "\tMIA Core status = 0x%x\n",
+			   REG_FIELD_GET(GS_MIA_MASK, status));
+		drm_printf(p, "\tLog level = %d\n",
+			   xe_guc_log_get_level(&guc->log));
+
+		drm_puts(p, "\nScratch registers:\n");
+		for (i = 0; i < SOFT_SCRATCH_COUNT; i++) {
+			drm_printf(p, "\t%2d: \t0x%x\n",
+				   i, xe_mmio_read32(&gt->mmio, SOFT_SCRATCH(i)));
+		}
 
-	status = xe_mmio_read32(&gt->mmio, GUC_STATUS);
-
-	drm_printf(p, "\nGuC status 0x%08x:\n", status);
-	drm_printf(p, "\tBootrom status = 0x%x\n",
-		   REG_FIELD_GET(GS_BOOTROM_MASK, status));
-	drm_printf(p, "\tuKernel status = 0x%x\n",
-		   REG_FIELD_GET(GS_UKERNEL_MASK, status));
-	drm_printf(p, "\tMIA Core status = 0x%x\n",
-		   REG_FIELD_GET(GS_MIA_MASK, status));
-	drm_printf(p, "\tLog level = %d\n",
-		   xe_guc_log_get_level(&guc->log));
-
-	drm_puts(p, "\nScratch registers:\n");
-	for (i = 0; i < SOFT_SCRATCH_COUNT; i++) {
-		drm_printf(p, "\t%2d: \t0x%x\n",
-			   i, xe_mmio_read32(&gt->mmio, SOFT_SCRATCH(i)));
+		xe_force_wake_put(gt_to_fw(gt), fw_ref);
 	}
 
-	xe_force_wake_put(gt_to_fw(gt), fw_ref);
-
 	drm_puts(p, "\n");
 	xe_guc_ct_print(&guc->ct, p, false);
 
-- 
2.39.5


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ