r);
} else
- drm_sched_job_done(s_job);
+ drm_sched_job_done(s_job->s_fence);
}
if (full_recovery) {
@@ -1049,14 +1034,9 @@ static int drm_sched_main(void *param)
drm_sched_fence_scheduled(s_fence);
if (!IS_ERR_OR_NULL(fence)) {
- s_fence->parent = dma_fence_get(fence);
- /* Drop for original kref_init of the fence */
- dma_fence_put(fence);
-
- r = dma_fence_add_callback(fence, &sched_job->cb,
- drm_sched_job_done_cb);
+ r = drm_sched_fence_set_parent(fence, s_fence);
if (r == -ENOENT)
- drm_sched_job_done(sched_job);
+ drm_sched_job_done(s_fence);
else if (r)
DRM_DEV_ERROR(sched->dev, "fence add callback
failed (%d)\n",
r);
@@ -1064,7 +1044,7 @@ static int drm_sched_main(void *param)
if (IS_ERR(fence))
dma_fence_set_error(&s_fence->finished, PTR_ERR(fence));
- drm_sched_job_done(sched_job);
+ drm_sched_job_done(s_fence);
}
wake_up(&sched->job_scheduled);
diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h
index 1f7d9dd1a444..7258e2fa195f 100644
--- a/include/drm/gpu_scheduler.h
+++ b/include/drm/gpu_scheduler.h
@@ -281,6 +281,10 @@ struct drm_sched_fence {
* @owner: job owner for debugging
*/
void *owner;
+ /**
+ * @cb: callback
+ */
+ struct dma_fence_cb cb;
};
struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f);
@@ -300,7 +304,6 @@ struct drm_sched_fence
*to_drm_sched_fence(struct dma_fence *f);
* be scheduled further.
* @s_priority: the priority of the job.
* @entity: the entity to which this job belongs.
- * @cb: the callback for the parent fence in s_fence.
*
* A job is created by the driver using drm_sched_job_init(), and
* should call drm_sched_entity_push_job() once it wants the
scheduler
@@ -325,7 +328,6 @@ struct drm_sched_job {
atomic_t karma;
enum drm_sched_priority s_priority;
struct drm_sched_entity *entity;
- struct dma_fence_cb cb;
/**
* @dependencies:
*
@@ -559,6 +561,12 @@ void drm_sched_fence_free(struct
drm_sched_fence *fence);
void drm_sched_fence_scheduled(struct drm_sched_fence *fence);
void drm_sched_fence_finished(struct drm_sched_fence *fence);
+int drm_sched_fence_add_parent_cb(struct dma_fence *fence,
+ struct drm_sched_fence *s_fence);
+bool drm_sched_fence_remove_parent_cb(struct drm_sched_fence
*s_fence);
+int drm_sched_fence_set_parent(struct dma_fence *fence,
+ struct drm_sched_fence *s_fence);
+
unsigned long drm_sched_suspend_timeout(struct drm_gpu_scheduler
*sched);
void drm_sched_resume_timeout(struct drm_gpu_scheduler *sched,
unsigned long remaining);