[CI v5 18/22] drm/exec: Introduce drm_exec_sanitize_for_trylock
Thomas Hellström
thomas.hellstrom at linux.intel.com
Tue May 28 12:33:39 UTC 2024
In some situations, we don't want to allow memory allocation or locking
of a contended lock to cause a drm_exec_trylock_obj() to fail.
Introduce a function to move the point-of-failure if desired.
Signed-off-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>
---
drivers/gpu/drm/drm_exec.c | 33 +++++++++++++++++++++++++++++++++
include/drm/drm_exec.h | 2 +-
2 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/drm_exec.c b/drivers/gpu/drm/drm_exec.c
index c70d8b01effb..98c49d864984 100644
--- a/drivers/gpu/drm/drm_exec.c
+++ b/drivers/gpu/drm/drm_exec.c
@@ -189,6 +189,10 @@ static int drm_exec_obj_locked(struct drm_exec *exec,
exec->objects = tmp;
exec->max_objects += PAGE_SIZE / sizeof(void *);
}
+
+ if (!obj)
+ return 0;
+
drm_gem_object_get(obj);
exec->objects[exec->num_objects++] = obj;
@@ -241,6 +245,35 @@ static int drm_exec_lock_contended(struct drm_exec *exec)
return ret;
}
+/**
+ * drm_exec_sanitize_for_trylock() - Sanitize the drm_exec state for a
+ * traditional trylock.
+ * @exec: The drm_exec object.
+ *
+ * drm_exec_trylock_obj() might fail because there is a contended lock
+ * in the transaction, or because of memory allocation failure.
+ * Calling this function before a drm_exec_trylock_obj() and with no
+ * drm_exec interactions inbetween the calls, will ensure that does not
+ * happen. Any failures will be reported by this function.
+ *
+ * Return: -EINTR if a wait for contended lock was interrupted by a signal,
+ * -ENOMEM on memory allocation failure.
+ */
+int drm_exec_sanitize_for_trylock(struct drm_exec *exec)
+{
+ int ret;
+
+ might_sleep();
+ might_alloc(GFP_KERNEL);
+
+ ret = drm_exec_lock_contended(exec);
+ if (ret)
+ return ret;
+
+ return drm_exec_obj_locked(exec, NULL, GFP_KERNEL);
+}
+EXPORT_SYMBOL(drm_exec_sanitize_for_trylock);
+
/**
* drm_exec_trylock_obj - trylock a GEM object for use
* @exec: the drm_exec object with the state.
diff --git a/include/drm/drm_exec.h b/include/drm/drm_exec.h
index cafeec5dddfe..a236d2bf91a8 100644
--- a/include/drm/drm_exec.h
+++ b/include/drm/drm_exec.h
@@ -182,6 +182,6 @@ int drm_exec_prepare_array(struct drm_exec *exec,
unsigned int num_fences);
void drm_exec_snapshot(struct drm_exec *exec, struct drm_exec_snapshot *snap);
void drm_exec_restore(struct drm_exec *exec, struct drm_exec_snapshot *snap);
-
+int drm_exec_sanitize_for_trylock(struct drm_exec *exec);
#endif
--
2.44.0
More information about the Intel-xe
mailing list