[CI v4 15/21] drm/exec: Add a snapshot capability.
Thomas Hellström
thomas.hellstrom at linux.intel.com
Fri May 17 07:41:24 UTC 2024
Signed-off-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>
---
drivers/gpu/drm/drm_exec.c | 39 +++++++++++++++++++++++++++++++++++++-
include/drm/drm_exec.h | 11 ++++++++++-
2 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_exec.c b/drivers/gpu/drm/drm_exec.c
index 1a62ee24c1b8..334d2f9109a6 100644
--- a/drivers/gpu/drm/drm_exec.c
+++ b/drivers/gpu/drm/drm_exec.c
@@ -57,6 +57,7 @@ static void drm_exec_unlock_all(struct drm_exec *exec)
struct drm_gem_object *obj;
unsigned long index;
+ WARN_ON(exec->snap);
drm_exec_for_each_locked_object_reverse(exec, index, obj) {
dma_resv_unlock(obj->resv);
drm_gem_object_put(obj);
@@ -90,6 +91,7 @@ void drm_exec_init(struct drm_exec *exec, u32 flags, unsigned nr)
exec->num_objects = 0;
exec->contended = DRM_EXEC_DUMMY;
exec->prelocked = NULL;
+ exec->snap = NULL;
}
EXPORT_SYMBOL(drm_exec_init);
@@ -289,7 +291,6 @@ int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj)
goto error_unlock;
return 0;
-
error_unlock:
dma_resv_unlock(obj->resv);
return ret;
@@ -383,5 +384,41 @@ int drm_exec_prepare_array(struct drm_exec *exec,
}
EXPORT_SYMBOL(drm_exec_prepare_array);
+void drm_exec_restore(struct drm_exec *exec, struct drm_exec_snapshot *snap)
+{
+ struct drm_gem_object *obj;
+ unsigned int index;
+
+ exec->snap = snap->saved_snap;
+
+ drm_exec_for_each_locked_object_reverse(exec, index, obj) {
+ if (index + 1 == snap->num_locked)
+ break;
+
+ dma_resv_unlock(obj->resv);
+ drm_gem_object_put(obj);
+ exec->objects[index] = NULL;
+ }
+
+ exec->num_objects = snap->num_locked;
+
+ if (!exec->prelocked)
+ exec->prelocked = snap->prelocked;
+ else
+ drm_gem_object_put(snap->prelocked);
+}
+EXPORT_SYMBOL(drm_exec_restore);
+
+void drm_exec_snapshot(struct drm_exec *exec, struct drm_exec_snapshot *snap)
+{
+ snap->num_locked = exec->num_objects;
+ snap->prelocked = exec->prelocked;
+ if (snap->prelocked)
+ drm_gem_object_get(snap->prelocked);
+ snap->saved_snap = exec->snap;
+ exec->snap = snap;
+}
+EXPORT_SYMBOL(drm_exec_snapshot);
+
MODULE_DESCRIPTION("DRM execution context");
MODULE_LICENSE("Dual MIT/GPL");
diff --git a/include/drm/drm_exec.h b/include/drm/drm_exec.h
index a37c851a178b..0ef326f2f5f0 100644
--- a/include/drm/drm_exec.h
+++ b/include/drm/drm_exec.h
@@ -19,7 +19,6 @@ struct drm_exec {
* @flags: Flags to control locking behavior
*/
u32 flags;
-
/**
* @ticket: WW ticket used for acquiring locks
*/
@@ -49,6 +48,13 @@ struct drm_exec {
* @prelocked: already locked GEM object due to contention
*/
struct drm_gem_object *prelocked;
+ struct drm_exec_snapshot *snap;
+};
+
+struct drm_exec_snapshot {
+ struct drm_exec_snapshot *saved_snap;
+ struct drm_gem_object *prelocked;
+ unsigned long num_locked;
};
int drm_exec_handle_contended(struct drm_exec *exec);
@@ -156,5 +162,8 @@ int drm_exec_prepare_array(struct drm_exec *exec,
struct drm_gem_object **objects,
unsigned int num_objects,
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);
+
#endif
--
2.44.0
More information about the Intel-xe
mailing list