Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/xe/hw_engine_group: Fix double write lock release in error path

In xe_hw_engine_group_get_mode(), a write lock is acquired before
calling switch_mode(), which in turn invokes
xe_hw_engine_group_suspend_faulting_lr_jobs().

On failure inside xe_hw_engine_group_suspend_faulting_lr_jobs(),
the write lock is released there, and then again in
xe_hw_engine_group_get_mode(), leading to a double release.

Fix this by keeping both acquire and release operation in
xe_hw_engine_group_get_mode().

Fixes: 770bd1d34113 ("drm/xe/hw_engine_group: Ensure safe transition between execution modes")
Cc: Francois Dugast <francois.dugast@intel.com>
Signed-off-by: Shuicheng Lin <shuicheng.lin@intel.com>
Reviewed-by: Francois Dugast <francois.dugast@intel.com>
Link: https://lore.kernel.org/r/20250925023145.1203004-2-shuicheng.lin@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
(cherry picked from commit 662d98b8b373007fa1b08ba93fee11f6fd3e387c)
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>

authored by

Shuicheng Lin and committed by
Lucas De Marchi
08fdfd26 2d1684a0

+1 -5
+1 -5
drivers/gpu/drm/xe/xe_hw_engine_group.c
··· 213 213 214 214 err = q->ops->suspend_wait(q); 215 215 if (err) 216 - goto err_suspend; 216 + return err; 217 217 } 218 218 219 219 if (need_resume) 220 220 xe_hw_engine_group_resume_faulting_lr_jobs(group); 221 221 222 222 return 0; 223 - 224 - err_suspend: 225 - up_write(&group->mode_sem); 226 - return err; 227 223 } 228 224 229 225 /**