Commit 4d5230b5 authored by Christian König's avatar Christian König

drm/scheduler: add drm_sched_job_add_resv_dependencies

Add a new function to update job dependencies from a resv obj.
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarLuben Tuikov <luben.tuikov@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221014084641.128280-3-christian.koenig@amd.com
parent 5345b86c
...@@ -773,32 +773,28 @@ int drm_sched_job_add_dependency(struct drm_sched_job *job, ...@@ -773,32 +773,28 @@ int drm_sched_job_add_dependency(struct drm_sched_job *job,
EXPORT_SYMBOL(drm_sched_job_add_dependency); EXPORT_SYMBOL(drm_sched_job_add_dependency);
/** /**
* drm_sched_job_add_implicit_dependencies - adds implicit dependencies as job * drm_sched_job_add_resv_dependencies - add all fences from the resv to the job
* dependencies
* @job: scheduler job to add the dependencies to * @job: scheduler job to add the dependencies to
* @obj: the gem object to add new dependencies from. * @resv: the dma_resv object to get the fences from
* @write: whether the job might write the object (so we need to depend on * @usage: the dma_resv_usage to use to filter the fences
* shared fences in the reservation object).
* *
* This should be called after drm_gem_lock_reservations() on your array of * This adds all fences matching the given usage from @resv to @job.
* GEM objects used in the job but before updating the reservations with your * Must be called with the @resv lock held.
* own fences.
* *
* Returns: * Returns:
* 0 on success, or an error on failing to expand the array. * 0 on success, or an error on failing to expand the array.
*/ */
int drm_sched_job_add_implicit_dependencies(struct drm_sched_job *job, int drm_sched_job_add_resv_dependencies(struct drm_sched_job *job,
struct drm_gem_object *obj, struct dma_resv *resv,
bool write) enum dma_resv_usage usage)
{ {
struct dma_resv_iter cursor; struct dma_resv_iter cursor;
struct dma_fence *fence; struct dma_fence *fence;
int ret; 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), dma_resv_for_each_fence(&cursor, resv, usage, fence) {
fence) {
/* Make sure to grab an additional ref on the added fence */ /* Make sure to grab an additional ref on the added fence */
dma_fence_get(fence); dma_fence_get(fence);
ret = drm_sched_job_add_dependency(job, 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, ...@@ -809,8 +805,31 @@ int drm_sched_job_add_implicit_dependencies(struct drm_sched_job *job,
} }
return 0; 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 * drm_sched_job_cleanup - clean up scheduler job resources
......
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
#define MAX_WAIT_SCHED_ENTITY_Q_EMPTY msecs_to_jiffies(1000) #define MAX_WAIT_SCHED_ENTITY_Q_EMPTY msecs_to_jiffies(1000)
enum dma_resv_usage;
struct dma_resv;
struct drm_gem_object; struct drm_gem_object;
struct drm_gpu_scheduler; struct drm_gpu_scheduler;
...@@ -505,6 +507,9 @@ int drm_sched_job_init(struct drm_sched_job *job, ...@@ -505,6 +507,9 @@ int drm_sched_job_init(struct drm_sched_job *job,
void drm_sched_job_arm(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, int drm_sched_job_add_dependency(struct drm_sched_job *job,
struct dma_fence *fence); 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, int drm_sched_job_add_implicit_dependencies(struct drm_sched_job *job,
struct drm_gem_object *obj, struct drm_gem_object *obj,
bool write); bool write);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment