summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorThomas Hellström <thomas.hellstrom@linux.intel.com>2026-05-20 12:16:15 +0200
committerThomas Hellström <thomas.hellstrom@linux.intel.com>2026-05-25 10:45:38 +0200
commitbba175a2d4be400312a64bd3d1e0481ef28a1681 (patch)
treea01fd03086a07091d8a2027b7320bcd8609dce6b /include
parent25331d9d40d093dfe2805ab558e8ad238bd2a2dc (diff)
downloadlinux-next-bba175a2d4be400312a64bd3d1e0481ef28a1681.tar.gz
linux-next-bba175a2d4be400312a64bd3d1e0481ef28a1681.zip
drm/exec, drm/xe: Avoid abusing the drm_exec retry pointer
The xe driver was using the drm_exec retry pointer directly to restart the locking loop after out-of-memory errors. This is relying on undocumented behaviour. Instead add a drm_exec_retry() macro that can be used in this situation, and that also warns if the struct drm_exec is not newly (re-)initialized. Use that macro in xe. v2: - Only allow if the drm_exec context is newly initialized. (Christian) Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com> Reviewed-by: Christian König <christian.koenig@amd.com> Link: https://patch.msgid.link/20260520101616.41284-4-thomas.hellstrom@linux.intel.com
Diffstat (limited to 'include')
-rw-r--r--include/drm/drm_exec.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/include/drm/drm_exec.h b/include/drm/drm_exec.h
index 18f84faabbb9..99c7e1bb3c5b 100644
--- a/include/drm/drm_exec.h
+++ b/include/drm/drm_exec.h
@@ -9,6 +9,12 @@
#define DRM_EXEC_INTERRUPTIBLE_WAIT BIT(0)
#define DRM_EXEC_IGNORE_DUPLICATES BIT(1)
+/*
+ * Dummy value used to initially enter the retry loop.
+ * internal use only.
+ */
+#define DRM_EXEC_DUMMY ((void *)~0)
+
struct drm_gem_object;
/**
@@ -142,6 +148,19 @@ static inline bool drm_exec_is_contended(struct drm_exec *exec)
return !!exec->contended;
}
+/**
+ * drm_exec_retry() - Unconditionally restart the loop to grab all locks.
+ * @exec: drm_exec object
+ *
+ * Unconditionally retry the loop to lock all objects. For consistency,
+ * the exec object needs to be newly initialized.
+ */
+#define drm_exec_retry(_exec) \
+ do { \
+ WARN_ON((_exec)->contended != DRM_EXEC_DUMMY); \
+ goto *__drm_exec_retry_ptr; \
+ } while (0)
+
void drm_exec_init(struct drm_exec *exec, u32 flags, unsigned nr);
void drm_exec_fini(struct drm_exec *exec);
bool drm_exec_cleanup(struct drm_exec *exec);