diff options
| author | Eric Anholt <eric@anholt.net> | 2019-04-01 15:26:35 -0700 | 
|---|---|---|
| committer | Eric Anholt <eric@anholt.net> | 2019-04-16 15:53:48 -0700 | 
| commit | f3fb20074e02865e1724c586eae46a77a7f2266b (patch) | |
| tree | 3cb39d3e0a295f22b43beaadd635501f6a8a62e2 /drivers/gpu/drm/lima/lima_sched.c | |
| parent | 5d5a179d3e90a8385b115e4bd19826ea0bcc6d11 (diff) | |
drm/lima: Use the drm_gem_fence_array_add helpers for our deps.
It's a pretty direct port of what I did for v3d.
Signed-off-by: Eric Anholt <eric@anholt.net>
Link: https://patchwork.freedesktop.org/patch/msgid/20190401222635.25013-8-eric@anholt.net
Reviewed-and-tested-by: Qiang Yu <yuq825@gmail.com>
Diffstat (limited to 'drivers/gpu/drm/lima/lima_sched.c')
| -rw-r--r-- | drivers/gpu/drm/lima/lima_sched.c | 66 | 
1 files changed, 12 insertions, 54 deletions
diff --git a/drivers/gpu/drm/lima/lima_sched.c b/drivers/gpu/drm/lima/lima_sched.c index 97bd9c1deb87..e253d031fb3d 100644 --- a/drivers/gpu/drm/lima/lima_sched.c +++ b/drivers/gpu/drm/lima/lima_sched.c @@ -3,6 +3,7 @@  #include <linux/kthread.h>  #include <linux/slab.h> +#include <linux/xarray.h>  #include "lima_drv.h"  #include "lima_sched.h" @@ -126,19 +127,24 @@ int lima_sched_task_init(struct lima_sched_task *task,  	task->num_bos = num_bos;  	task->vm = lima_vm_get(vm); + +	xa_init_flags(&task->deps, XA_FLAGS_ALLOC); +  	return 0;  }  void lima_sched_task_fini(struct lima_sched_task *task)  { +	struct dma_fence *fence; +	unsigned long index;  	int i;  	drm_sched_job_cleanup(&task->base); -	for (i = 0; i < task->num_dep; i++) -		dma_fence_put(task->dep[i]); - -	kfree(task->dep); +	xa_for_each(&task->deps, index, fence) { +		dma_fence_put(fence); +	} +	xa_destroy(&task->deps);  	if (task->bos) {  		for (i = 0; i < task->num_bos; i++) @@ -149,42 +155,6 @@ void lima_sched_task_fini(struct lima_sched_task *task)  	lima_vm_put(task->vm);  } -int lima_sched_task_add_dep(struct lima_sched_task *task, struct dma_fence *fence) -{ -	int i, new_dep = 4; - -	/* same context's fence is definitly earlier then this task */ -	if (fence->context == task->base.s_fence->finished.context) { -		dma_fence_put(fence); -		return 0; -	} - -	if (task->dep && task->num_dep == task->max_dep) -		new_dep = task->max_dep * 2; - -	if (task->max_dep < new_dep) { -		void *dep = krealloc(task->dep, sizeof(*task->dep) * new_dep, GFP_KERNEL); - -		if (!dep) -			return -ENOMEM; - -		task->max_dep = new_dep; -		task->dep = dep; -	} - -	for (i = 0; i < task->num_dep; i++) { -		if (task->dep[i]->context == fence->context && -		    dma_fence_is_later(fence, task->dep[i])) { -			dma_fence_put(task->dep[i]); -			task->dep[i] = fence; -			return 0; -		} -	} - -	task->dep[task->num_dep++] = fence; -	return 0; -} -  int lima_sched_context_init(struct lima_sched_pipe *pipe,  			    struct lima_sched_context *context,  			    atomic_t *guilty) @@ -213,21 +183,9 @@ static struct dma_fence *lima_sched_dependency(struct drm_sched_job *job,  					       struct drm_sched_entity *entity)  {  	struct lima_sched_task *task = to_lima_task(job); -	int i; - -	for (i = 0; i < task->num_dep; i++) { -		struct dma_fence *fence = task->dep[i]; - -		if (!task->dep[i]) -			continue; - -		task->dep[i] = NULL; -		if (!dma_fence_is_signaled(fence)) -			return fence; - -		dma_fence_put(fence); -	} +	if (!xa_empty(&task->deps)) +		return xa_erase(&task->deps, task->last_dep++);  	return NULL;  }  | 
