Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+16 -93
+2 -35
drivers/gpu/drm/lima/lima_gem.c
··· 145 145 if (explicit) 146 146 return 0; 147 147 148 - /* implicit sync use bo fence in resv obj */ 149 - if (write) { 150 - unsigned nr_fences; 151 - struct dma_fence **fences; 152 - int i; 153 - 154 - err = reservation_object_get_fences_rcu( 155 - bo->gem.resv, NULL, &nr_fences, &fences); 156 - if (err || !nr_fences) 157 - return err; 158 - 159 - for (i = 0; i < nr_fences; i++) { 160 - err = lima_sched_task_add_dep(task, fences[i]); 161 - if (err) 162 - break; 163 - } 164 - 165 - /* for error case free remaining fences */ 166 - for ( ; i < nr_fences; i++) 167 - dma_fence_put(fences[i]); 168 - 169 - kfree(fences); 170 - } else { 171 - struct dma_fence *fence; 172 - 173 - fence = reservation_object_get_excl_rcu(bo->gem.resv); 174 - if (fence) { 175 - err = lima_sched_task_add_dep(task, fence); 176 - if (err) 177 - dma_fence_put(fence); 178 - } 179 - } 180 - 181 - return err; 148 + return drm_gem_fence_array_add_implicit(&task->deps, &bo->gem, write); 182 149 } 183 150 184 151 static int lima_gem_lock_bos(struct lima_bo **bos, u32 nr_bos, ··· 218 251 if (err) 219 252 return err; 220 253 221 - err = lima_sched_task_add_dep(submit->task, fence); 254 + err = drm_gem_fence_array_add(&submit->task->deps, fence); 222 255 if (err) { 223 256 dma_fence_put(fence); 224 257 return err;
+12 -54
drivers/gpu/drm/lima/lima_sched.c
··· 3 3 4 4 #include <linux/kthread.h> 5 5 #include <linux/slab.h> 6 + #include <linux/xarray.h> 6 7 7 8 #include "lima_drv.h" 8 9 #include "lima_sched.h" ··· 127 126 128 127 task->num_bos = num_bos; 129 128 task->vm = lima_vm_get(vm); 129 + 130 + xa_init_flags(&task->deps, XA_FLAGS_ALLOC); 131 + 130 132 return 0; 131 133 } 132 134 133 135 void lima_sched_task_fini(struct lima_sched_task *task) 134 136 { 137 + struct dma_fence *fence; 138 + unsigned long index; 135 139 int i; 136 140 137 141 drm_sched_job_cleanup(&task->base); 138 142 139 - for (i = 0; i < task->num_dep; i++) 140 - dma_fence_put(task->dep[i]); 141 - 142 - kfree(task->dep); 143 + xa_for_each(&task->deps, index, fence) { 144 + dma_fence_put(fence); 145 + } 146 + xa_destroy(&task->deps); 143 147 144 148 if (task->bos) { 145 149 for (i = 0; i < task->num_bos; i++) ··· 153 147 } 154 148 155 149 lima_vm_put(task->vm); 156 - } 157 - 158 - int lima_sched_task_add_dep(struct lima_sched_task *task, struct dma_fence *fence) 159 - { 160 - int i, new_dep = 4; 161 - 162 - /* same context's fence is definitly earlier then this task */ 163 - if (fence->context == task->base.s_fence->finished.context) { 164 - dma_fence_put(fence); 165 - return 0; 166 - } 167 - 168 - if (task->dep && task->num_dep == task->max_dep) 169 - new_dep = task->max_dep * 2; 170 - 171 - if (task->max_dep < new_dep) { 172 - void *dep = krealloc(task->dep, sizeof(*task->dep) * new_dep, GFP_KERNEL); 173 - 174 - if (!dep) 175 - return -ENOMEM; 176 - 177 - task->max_dep = new_dep; 178 - task->dep = dep; 179 - } 180 - 181 - for (i = 0; i < task->num_dep; i++) { 182 - if (task->dep[i]->context == fence->context && 183 - dma_fence_is_later(fence, task->dep[i])) { 184 - dma_fence_put(task->dep[i]); 185 - task->dep[i] = fence; 186 - return 0; 187 - } 188 - } 189 - 190 - task->dep[task->num_dep++] = fence; 191 - return 0; 192 150 } 193 151 194 152 int lima_sched_context_init(struct lima_sched_pipe *pipe, ··· 183 213 struct drm_sched_entity *entity) 184 214 { 185 215 struct lima_sched_task *task = to_lima_task(job); 186 - int i; 187 216 188 - for (i = 0; i < task->num_dep; i++) { 189 - struct dma_fence *fence = task->dep[i]; 190 - 191 - if (!task->dep[i]) 192 - continue; 193 - 194 - task->dep[i] = NULL; 195 - 196 - if (!dma_fence_is_signaled(fence)) 197 - return fence; 198 - 199 - dma_fence_put(fence); 200 - } 217 + if (!xa_empty(&task->deps)) 218 + return xa_erase(&task->deps, task->last_dep++); 201 219 202 220 return NULL; 203 221 }
+2 -4
drivers/gpu/drm/lima/lima_sched.h
··· 14 14 struct lima_vm *vm; 15 15 void *frame; 16 16 17 - struct dma_fence **dep; 18 - int num_dep; 19 - int max_dep; 17 + struct xarray deps; 18 + unsigned long last_dep; 20 19 21 20 struct lima_bo **bos; 22 21 int num_bos; ··· 77 78 struct lima_bo **bos, int num_bos, 78 79 struct lima_vm *vm); 79 80 void lima_sched_task_fini(struct lima_sched_task *task); 80 - int lima_sched_task_add_dep(struct lima_sched_task *task, struct dma_fence *fence); 81 81 82 82 int lima_sched_context_init(struct lima_sched_pipe *pipe, 83 83 struct lima_sched_context *context,