Am 05.12.23 um 20:02 schrieb Rob Clark:
From: Rob Clark robdclark@chromium.org
Container fences have burner contexts, which makes the trick to store at most one fence per context somewhat useless if we don't unwrap array or chain fences.
Signed-off-by: Rob Clark robdclark@chromium.org
Reviewed-by: Christian König christian.koenig@amd.com
drivers/gpu/drm/scheduler/sched_main.c | 47 ++++++++++++++++++-------- 1 file changed, 32 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c index 9762464e3f99..16b550949c57 100644 --- a/drivers/gpu/drm/scheduler/sched_main.c +++ b/drivers/gpu/drm/scheduler/sched_main.c @@ -52,6 +52,7 @@ #include <linux/wait.h> #include <linux/sched.h> #include <linux/completion.h> +#include <linux/dma-fence-unwrap.h> #include <linux/dma-resv.h> #include <uapi/linux/sched/types.h> @@ -684,27 +685,14 @@ void drm_sched_job_arm(struct drm_sched_job *job) } EXPORT_SYMBOL(drm_sched_job_arm); -/**
- drm_sched_job_add_dependency - adds the fence as a job dependency
- @job: scheduler job to add the dependencies to
- @fence: the dma_fence to add to the list of dependencies.
- Note that @fence is consumed in both the success and error cases.
- Returns:
- 0 on success, or an error on failing to expand the array.
- */
-int drm_sched_job_add_dependency(struct drm_sched_job *job,
struct dma_fence *fence)
+static int drm_sched_job_add_single_dependency(struct drm_sched_job *job,
{ struct dma_fence *entry; unsigned long index; u32 id = 0; int ret;struct dma_fence *fence)
- if (!fence)
return 0;
- /* Deduplicate if we already depend on a fence from the same context.
- This lets the size of the array of deps scale with the number of
- engines involved, rather than the number of BOs.
@@ -728,6 +716,35 @@ int drm_sched_job_add_dependency(struct drm_sched_job *job, return ret; }
+/**
- drm_sched_job_add_dependency - adds the fence as a job dependency
- @job: scheduler job to add the dependencies to
- @fence: the dma_fence to add to the list of dependencies.
- Note that @fence is consumed in both the success and error cases.
- Returns:
- 0 on success, or an error on failing to expand the array.
- */
+int drm_sched_job_add_dependency(struct drm_sched_job *job,
struct dma_fence *fence)
+{
- struct dma_fence_unwrap iter;
- struct dma_fence *f;
- int ret = 0;
- dma_fence_unwrap_for_each (f, &iter, fence) {
dma_fence_get(f);
ret = drm_sched_job_add_single_dependency(job, f);
if (ret)
break;
- }
- dma_fence_put(fence);
- return ret;
+} EXPORT_SYMBOL(drm_sched_job_add_dependency); /**