mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 16:13:19 +09:00
drm/scheduler: add drm_sched_job_add_resv_dependencies
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
This commit is contained in:
@@ -772,6 +772,41 @@ 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_resv_dependencies - add all fences from the resv to the job
|
||||||
|
* @job: scheduler job to add the dependencies to
|
||||||
|
* @resv: the dma_resv object to get the fences from
|
||||||
|
* @usage: the dma_resv_usage to use to filter the 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_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(resv);
|
||||||
|
|
||||||
|
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);
|
||||||
|
if (ret) {
|
||||||
|
dma_fence_put(fence);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_sched_job_add_resv_dependencies);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_sched_job_add_implicit_dependencies - adds implicit dependencies as job
|
* drm_sched_job_add_implicit_dependencies - adds implicit dependencies as job
|
||||||
* dependencies
|
* dependencies
|
||||||
@@ -791,27 +826,11 @@ 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)
|
||||||
{
|
{
|
||||||
struct dma_resv_iter cursor;
|
return drm_sched_job_add_resv_dependencies(job, obj->resv,
|
||||||
struct dma_fence *fence;
|
dma_resv_usage_rw(write));
|
||||||
int ret;
|
|
||||||
|
|
||||||
dma_resv_assert_held(obj->resv);
|
|
||||||
|
|
||||||
dma_resv_for_each_fence(&cursor, obj->resv, dma_resv_usage_rw(write),
|
|
||||||
fence) {
|
|
||||||
/* Make sure to grab an additional ref on the added fence */
|
|
||||||
dma_fence_get(fence);
|
|
||||||
ret = drm_sched_job_add_dependency(job, fence);
|
|
||||||
if (ret) {
|
|
||||||
dma_fence_put(fence);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_sched_job_add_implicit_dependencies);
|
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
|
||||||
* @job: scheduler job to clean up
|
* @job: scheduler job to clean up
|
||||||
|
|||||||
@@ -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,
|
|||||||
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user