OSDN Git Service

drm/scheduler: add drm_sched_job_add_resv_dependencies
authorChristian König <christian.koenig@amd.com>
Wed, 28 Sep 2022 08:17:40 +0000 (10:17 +0200)
committerChristian König <christian.koenig@amd.com>
Thu, 3 Nov 2022 11:45:19 +0000 (12:45 +0100)
Add a new function to update job dependencies from a resv obj.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Luben Tuikov <luben.tuikov@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221014084641.128280-3-christian.koenig@amd.com
drivers/gpu/drm/scheduler/sched_main.c
include/drm/gpu_scheduler.h

index d0ff9e1..6e17cdb 100644 (file)
@@ -773,32 +773,28 @@ int drm_sched_job_add_dependency(struct drm_sched_job *job,
 EXPORT_SYMBOL(drm_sched_job_add_dependency);
 
 /**
- * drm_sched_job_add_implicit_dependencies - adds implicit dependencies as job
- *   dependencies
+ * drm_sched_job_add_resv_dependencies - add all fences from the resv to the job
  * @job: scheduler job to add the dependencies to
- * @obj: the gem object to add new dependencies from.
- * @write: whether the job might write the object (so we need to depend on
- * shared fences in the reservation object).
+ * @resv: the dma_resv object to get the fences from
+ * @usage: the dma_resv_usage to use to filter the fences
  *
- * This should be called after drm_gem_lock_reservations() on your array of
- * GEM objects used in the job but before updating the reservations with your
- * own fences.
+ * This adds all fences matching the given usage from @resv to @job.
+ * Must be called with the @resv lock held.
  *
  * Returns:
  * 0 on success, or an error on failing to expand the array.
  */
-int drm_sched_job_add_implicit_dependencies(struct drm_sched_job *job,
-                                           struct drm_gem_object *obj,
-                                           bool write)
+int drm_sched_job_add_resv_dependencies(struct drm_sched_job *job,
+                                       struct dma_resv *resv,
+                                       enum dma_resv_usage usage)
 {
        struct dma_resv_iter cursor;
        struct dma_fence *fence;
        int ret;
 
-       dma_resv_assert_held(obj->resv);
+       dma_resv_assert_held(resv);
 
-       dma_resv_for_each_fence(&cursor, obj->resv, dma_resv_usage_rw(write),
-                               fence) {
+       dma_resv_for_each_fence(&cursor, resv, usage, fence) {
                /* Make sure to grab an additional ref on the added fence */
                dma_fence_get(fence);
                ret = drm_sched_job_add_dependency(job, fence);
@@ -809,8 +805,31 @@ int drm_sched_job_add_implicit_dependencies(struct drm_sched_job *job,
        }
        return 0;
 }
-EXPORT_SYMBOL(drm_sched_job_add_implicit_dependencies);
+EXPORT_SYMBOL(drm_sched_job_add_resv_dependencies);
 
+/**
+ * drm_sched_job_add_implicit_dependencies - adds implicit dependencies as job
+ *   dependencies
+ * @job: scheduler job to add the dependencies to
+ * @obj: the gem object to add new dependencies from.
+ * @write: whether the job might write the object (so we need to depend on
+ * shared fences in the reservation object).
+ *
+ * This should be called after drm_gem_lock_reservations() on your array of
+ * GEM objects used in the job but before updating the reservations with your
+ * own fences.
+ *
+ * Returns:
+ * 0 on success, or an error on failing to expand the array.
+ */
+int drm_sched_job_add_implicit_dependencies(struct drm_sched_job *job,
+                                           struct drm_gem_object *obj,
+                                           bool write)
+{
+       return drm_sched_job_add_resv_dependencies(job, obj->resv,
+                                                  dma_resv_usage_rw(write));
+}
+EXPORT_SYMBOL(drm_sched_job_add_implicit_dependencies);
 
 /**
  * drm_sched_job_cleanup - clean up scheduler job resources
index 1f7d9dd..8d1747f 100644 (file)
@@ -32,6 +32,8 @@
 
 #define MAX_WAIT_SCHED_ENTITY_Q_EMPTY msecs_to_jiffies(1000)
 
+enum dma_resv_usage;
+struct dma_resv;
 struct drm_gem_object;
 
 struct drm_gpu_scheduler;
@@ -505,6 +507,9 @@ int drm_sched_job_init(struct drm_sched_job *job,
 void drm_sched_job_arm(struct drm_sched_job *job);
 int drm_sched_job_add_dependency(struct drm_sched_job *job,
                                 struct dma_fence *fence);
+int drm_sched_job_add_resv_dependencies(struct drm_sched_job *job,
+                                       struct dma_resv *resv,
+                                       enum dma_resv_usage usage);
 int drm_sched_job_add_implicit_dependencies(struct drm_sched_job *job,
                                            struct drm_gem_object *obj,
                                            bool write);