1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (C) 2016 Red Hat
4 * Author: Rob Clark <robdclark@gmail.com>
5 */
6
7 #include "drm/drm_file.h"
8 #include "drm/msm_drm.h"
9 #include "linux/file.h"
10 #include "linux/sync_file.h"
11
12 #include "msm_drv.h"
13 #include "msm_gem.h"
14 #include "msm_gpu.h"
15 #include "msm_mmu.h"
16 #include "msm_syncobj.h"
17
18 #define vm_dbg(fmt, ...) pr_debug("%s:%d: "fmt"\n", __func__, __LINE__, ##__VA_ARGS__)
19
20 static uint vm_log_shift = 0;
21 MODULE_PARM_DESC(vm_log_shift, "Length of VM op log");
22 module_param_named(vm_log_shift, vm_log_shift, uint, 0600);
23
24 /**
25 * struct msm_vm_map_op - create new pgtable mapping
26 */
27 struct msm_vm_map_op {
28 /** @iova: start address for mapping */
29 uint64_t iova;
30 /** @range: size of the region to map */
31 uint64_t range;
32 /** @offset: offset into @sgt to map */
33 uint64_t offset;
34 /** @sgt: pages to map, or NULL for a PRR mapping */
35 struct sg_table *sgt;
36 /** @prot: the mapping protection flags */
37 int prot;
38
39 /**
40 * @queue_id: The id of the submitqueue the operation is performed
41 * on, or zero for (in particular) UNMAP ops triggered outside of
42 * a submitqueue (ie. process cleanup)
43 */
44 int queue_id;
45 };
46
47 /**
48 * struct msm_vm_unmap_op - unmap a range of pages from pgtable
49 */
50 struct msm_vm_unmap_op {
51 /** @iova: start address for unmap */
52 uint64_t iova;
53 /** @range: size of region to unmap */
54 uint64_t range;
55
56 /** @reason: The reason for the unmap */
57 const char *reason;
58
59 /**
60 * @queue_id: The id of the submitqueue the operation is performed
61 * on, or zero for (in particular) UNMAP ops triggered outside of
62 * a submitqueue (ie. process cleanup)
63 */
64 int queue_id;
65 };
66
67 /**
68 * struct msm_vm_op - A MAP or UNMAP operation
69 */
70 struct msm_vm_op {
71 /** @op: The operation type */
72 enum {
73 MSM_VM_OP_MAP = 1,
74 MSM_VM_OP_UNMAP,
75 } op;
76 union {
77 /** @map: Parameters used if op == MSM_VMA_OP_MAP */
78 struct msm_vm_map_op map;
79 /** @unmap: Parameters used if op == MSM_VMA_OP_UNMAP */
80 struct msm_vm_unmap_op unmap;
81 };
82 /** @node: list head in msm_vm_bind_job::vm_ops */
83 struct list_head node;
84
85 /**
86 * @obj: backing object for pages to be mapped/unmapped
87 *
88 * Async unmap ops, in particular, must hold a reference to the
89 * original GEM object backing the mapping that will be unmapped.
90 * But the same can be required in the map path, for example if
91 * there is not a corresponding unmap op, such as process exit.
92 *
93 * This ensures that the pages backing the mapping are not freed
94 * before the mapping is torn down.
95 */
96 struct drm_gem_object *obj;
97 };
98
99 /**
100 * struct msm_vm_bind_job - Tracking for a VM_BIND ioctl
101 *
102 * A table of userspace requested VM updates (MSM_VM_BIND_OP_UNMAP/MAP/MAP_NULL)
103 * gets applied to the vm, generating a list of VM ops (MSM_VM_OP_MAP/UNMAP)
104 * which are applied to the pgtables asynchronously. For example a userspace
105 * requested MSM_VM_BIND_OP_MAP could end up generating both an MSM_VM_OP_UNMAP
106 * to unmap an existing mapping, and a MSM_VM_OP_MAP to apply the new mapping.
107 */
108 struct msm_vm_bind_job {
109 /** @base: base class for drm_sched jobs */
110 struct drm_sched_job base;
111 /** @vm: The VM being operated on */
112 struct drm_gpuvm *vm;
113 /** @fence: The fence that is signaled when job completes */
114 struct dma_fence *fence;
115 /** @queue: The queue that the job runs on */
116 struct msm_gpu_submitqueue *queue;
117 /** @prealloc: Tracking for pre-allocated MMU pgtable pages */
118 struct msm_mmu_prealloc prealloc;
119 /** @vm_ops: a list of struct msm_vm_op */
120 struct list_head vm_ops;
121 /** @bos_pinned: are the GEM objects being bound pinned? */
122 bool bos_pinned;
123 /** @nr_ops: the number of userspace requested ops */
124 unsigned int nr_ops;
125 /**
126 * @ops: the userspace requested ops
127 *
128 * The userspace requested ops are copied/parsed and validated
129 * before we start applying the updates to try to do as much up-
130 * front error checking as possible, to avoid the VM being in an
131 * undefined state due to partially executed VM_BIND.
132 *
133 * This table also serves to hold a reference to the backing GEM
134 * objects.
135 */
136 struct msm_vm_bind_op {
137 uint32_t op;
138 uint32_t flags;
139 union {
140 struct drm_gem_object *obj;
141 uint32_t handle;
142 };
143 uint64_t obj_offset;
144 uint64_t iova;
145 uint64_t range;
146 } ops[];
147 };
148
149 #define job_foreach_bo(obj, _job) \
150 for (unsigned i = 0; i < (_job)->nr_ops; i++) \
151 if ((obj = (_job)->ops[i].obj))
152
to_msm_vm_bind_job(struct drm_sched_job * job)153 static inline struct msm_vm_bind_job *to_msm_vm_bind_job(struct drm_sched_job *job)
154 {
155 return container_of(job, struct msm_vm_bind_job, base);
156 }
157
158 static void
msm_gem_vm_free(struct drm_gpuvm * gpuvm)159 msm_gem_vm_free(struct drm_gpuvm *gpuvm)
160 {
161 struct msm_gem_vm *vm = container_of(gpuvm, struct msm_gem_vm, base);
162
163 drm_mm_takedown(&vm->mm);
164 if (vm->mmu)
165 vm->mmu->funcs->destroy(vm->mmu);
166 dma_fence_put(vm->last_fence);
167 put_pid(vm->pid);
168 kfree(vm->log);
169 kfree_rcu(vm, rcu);
170 }
171
172 /**
173 * msm_gem_vm_unusable() - Mark a VM as unusable
174 * @gpuvm: the VM to mark unusable
175 */
176 void
msm_gem_vm_unusable(struct drm_gpuvm * gpuvm)177 msm_gem_vm_unusable(struct drm_gpuvm *gpuvm)
178 {
179 struct msm_gem_vm *vm = to_msm_vm(gpuvm);
180 uint32_t vm_log_len = (1 << vm->log_shift);
181 uint32_t vm_log_mask = vm_log_len - 1;
182 uint32_t nr_vm_logs;
183 int first;
184
185 vm->unusable = true;
186
187 /* Bail if no log, or empty log: */
188 if (!vm->log || !vm->log[0].op)
189 return;
190
191 mutex_lock(&vm->mmu_lock);
192
193 /*
194 * log_idx is the next entry to overwrite, meaning it is the oldest, or
195 * first, entry (other than the special case handled below where the
196 * log hasn't wrapped around yet)
197 */
198 first = vm->log_idx;
199
200 if (!vm->log[first].op) {
201 /*
202 * If the next log entry has not been written yet, then only
203 * entries 0 to idx-1 are valid (ie. we haven't wrapped around
204 * yet)
205 */
206 nr_vm_logs = MAX(0, first - 1);
207 first = 0;
208 } else {
209 nr_vm_logs = vm_log_len;
210 }
211
212 pr_err("vm-log:\n");
213 for (int i = 0; i < nr_vm_logs; i++) {
214 int idx = (i + first) & vm_log_mask;
215 struct msm_gem_vm_log_entry *e = &vm->log[idx];
216 pr_err(" - %s:%d: 0x%016llx-0x%016llx\n",
217 e->op, e->queue_id, e->iova,
218 e->iova + e->range);
219 }
220
221 mutex_unlock(&vm->mmu_lock);
222 }
223
224 static void
vm_log(struct msm_gem_vm * vm,const char * op,uint64_t iova,uint64_t range,int queue_id)225 vm_log(struct msm_gem_vm *vm, const char *op, uint64_t iova, uint64_t range, int queue_id)
226 {
227 int idx;
228
229 if (!vm->managed)
230 lockdep_assert_held(&vm->mmu_lock);
231
232 vm_dbg("%s:%p:%d: %016llx %016llx", op, vm, queue_id, iova, iova + range);
233
234 if (!vm->log)
235 return;
236
237 idx = vm->log_idx;
238 vm->log[idx].op = op;
239 vm->log[idx].iova = iova;
240 vm->log[idx].range = range;
241 vm->log[idx].queue_id = queue_id;
242 vm->log_idx = (vm->log_idx + 1) & ((1 << vm->log_shift) - 1);
243 }
244
245 static void
vm_unmap_op(struct msm_gem_vm * vm,const struct msm_vm_unmap_op * op)246 vm_unmap_op(struct msm_gem_vm *vm, const struct msm_vm_unmap_op *op)
247 {
248 const char *reason = op->reason;
249
250 if (!reason)
251 reason = "unmap";
252
253 vm_log(vm, reason, op->iova, op->range, op->queue_id);
254
255 vm->mmu->funcs->unmap(vm->mmu, op->iova, op->range);
256 }
257
258 static int
vm_map_op(struct msm_gem_vm * vm,const struct msm_vm_map_op * op)259 vm_map_op(struct msm_gem_vm *vm, const struct msm_vm_map_op *op)
260 {
261 vm_log(vm, "map", op->iova, op->range, op->queue_id);
262
263 return vm->mmu->funcs->map(vm->mmu, op->iova, op->sgt, op->offset,
264 op->range, op->prot);
265 }
266
267 /* Actually unmap memory for the vma */
msm_gem_vma_unmap(struct drm_gpuva * vma,const char * reason)268 void msm_gem_vma_unmap(struct drm_gpuva *vma, const char *reason)
269 {
270 struct msm_gem_vm *vm = to_msm_vm(vma->vm);
271 struct msm_gem_vma *msm_vma = to_msm_vma(vma);
272
273 /* Don't do anything if the memory isn't mapped */
274 if (!msm_vma->mapped)
275 return;
276
277 /*
278 * The mmu_lock is only needed when preallocation is used. But
279 * in that case we don't need to worry about recursion into
280 * shrinker
281 */
282 if (!vm->managed)
283 mutex_lock(&vm->mmu_lock);
284
285 vm_unmap_op(vm, &(struct msm_vm_unmap_op){
286 .iova = vma->va.addr,
287 .range = vma->va.range,
288 .reason = reason,
289 });
290
291 if (!vm->managed)
292 mutex_unlock(&vm->mmu_lock);
293
294 msm_vma->mapped = false;
295 }
296
297 /* Map and pin vma: */
298 int
msm_gem_vma_map(struct drm_gpuva * vma,int prot,struct sg_table * sgt)299 msm_gem_vma_map(struct drm_gpuva *vma, int prot, struct sg_table *sgt)
300 {
301 struct msm_gem_vm *vm = to_msm_vm(vma->vm);
302 struct msm_gem_vma *msm_vma = to_msm_vma(vma);
303 int ret;
304
305 if (GEM_WARN_ON(!vma->va.addr))
306 return -EINVAL;
307
308 if (msm_vma->mapped)
309 return 0;
310
311 msm_vma->mapped = true;
312
313 /*
314 * The mmu_lock is only needed when preallocation is used. But
315 * in that case we don't need to worry about recursion into
316 * shrinker
317 */
318 if (!vm->managed)
319 mutex_lock(&vm->mmu_lock);
320
321 /*
322 * NOTE: if not using pgtable preallocation, we cannot hold
323 * a lock across map/unmap which is also used in the job_run()
324 * path, as this can cause deadlock in job_run() vs shrinker/
325 * reclaim.
326 */
327 ret = vm_map_op(vm, &(struct msm_vm_map_op){
328 .iova = vma->va.addr,
329 .range = vma->va.range,
330 .offset = vma->gem.offset,
331 .sgt = sgt,
332 .prot = prot,
333 });
334
335 if (!vm->managed)
336 mutex_unlock(&vm->mmu_lock);
337
338 if (ret)
339 msm_vma->mapped = false;
340
341 return ret;
342 }
343
344 /* Close an iova. Warn if it is still in use */
msm_gem_vma_close(struct drm_gpuva * vma)345 void msm_gem_vma_close(struct drm_gpuva *vma)
346 {
347 struct msm_gem_vm *vm = to_msm_vm(vma->vm);
348 struct msm_gem_vma *msm_vma = to_msm_vma(vma);
349
350 GEM_WARN_ON(msm_vma->mapped);
351
352 drm_gpuvm_resv_assert_held(&vm->base);
353
354 if (vma->gem.obj)
355 msm_gem_assert_locked(vma->gem.obj);
356
357 if (vma->va.addr && vm->managed)
358 drm_mm_remove_node(&msm_vma->node);
359
360 drm_gpuva_remove(vma);
361 drm_gpuva_unlink(vma);
362
363 kfree(vma);
364 }
365
366 /* Create a new vma and allocate an iova for it */
367 struct drm_gpuva *
msm_gem_vma_new(struct drm_gpuvm * gpuvm,struct drm_gem_object * obj,u64 offset,u64 range_start,u64 range_end)368 msm_gem_vma_new(struct drm_gpuvm *gpuvm, struct drm_gem_object *obj,
369 u64 offset, u64 range_start, u64 range_end)
370 {
371 struct msm_gem_vm *vm = to_msm_vm(gpuvm);
372 struct drm_gpuvm_bo *vm_bo;
373 struct msm_gem_vma *vma;
374 int ret;
375
376 /* _NO_SHARE objs cannot be mapped outside of their "host" vm: */
377 if (obj && (to_msm_bo(obj)->flags & MSM_BO_NO_SHARE) &&
378 GEM_WARN_ON(obj->resv != drm_gpuvm_resv(gpuvm))) {
379 return ERR_PTR(-EINVAL);
380 }
381
382 drm_gpuvm_resv_assert_held(&vm->base);
383
384 vma = kzalloc_obj(*vma);
385 if (!vma)
386 return ERR_PTR(-ENOMEM);
387
388 if (vm->managed) {
389 BUG_ON(offset != 0);
390 BUG_ON(!obj); /* NULL mappings not valid for kernel managed VM */
391 ret = drm_mm_insert_node_in_range(&vm->mm, &vma->node,
392 obj->size, PAGE_SIZE, 0,
393 range_start, range_end, 0);
394
395 if (ret)
396 goto err_free_vma;
397
398 range_start = vma->node.start;
399 range_end = range_start + obj->size;
400 }
401
402 if (obj)
403 GEM_WARN_ON((range_end - range_start) > obj->size);
404
405 struct drm_gpuva_op_map op_map = {
406 .va.addr = range_start,
407 .va.range = range_end - range_start,
408 .gem.obj = obj,
409 .gem.offset = offset,
410 };
411
412 drm_gpuva_init_from_op(&vma->base, &op_map);
413 vma->mapped = false;
414
415 ret = drm_gpuva_insert(&vm->base, &vma->base);
416 if (ret)
417 goto err_free_range;
418
419 if (!obj)
420 return &vma->base;
421
422 vm_bo = drm_gpuvm_bo_obtain_locked(&vm->base, obj);
423 if (IS_ERR(vm_bo)) {
424 ret = PTR_ERR(vm_bo);
425 goto err_va_remove;
426 }
427
428 drm_gpuvm_bo_extobj_add(vm_bo);
429 drm_gpuva_link(&vma->base, vm_bo);
430 GEM_WARN_ON(drm_gpuvm_bo_put(vm_bo));
431
432 return &vma->base;
433
434 err_va_remove:
435 drm_gpuva_remove(&vma->base);
436 err_free_range:
437 if (vm->managed)
438 drm_mm_remove_node(&vma->node);
439 err_free_vma:
440 kfree(vma);
441 return ERR_PTR(ret);
442 }
443
444 static int
msm_gem_vm_bo_validate(struct drm_gpuvm_bo * vm_bo,struct drm_exec * exec)445 msm_gem_vm_bo_validate(struct drm_gpuvm_bo *vm_bo, struct drm_exec *exec)
446 {
447 struct drm_gem_object *obj = vm_bo->obj;
448 struct drm_gpuva *vma;
449 int ret;
450
451 vm_dbg("validate: %p", obj);
452
453 msm_gem_assert_locked(obj);
454
455 drm_gpuvm_bo_for_each_va (vma, vm_bo) {
456 ret = msm_gem_pin_vma_locked(obj, vma);
457 if (ret)
458 return ret;
459 }
460
461 drm_gpuvm_bo_evict(vm_bo, false);
462
463 return 0;
464 }
465
466 struct op_arg {
467 unsigned flags;
468 struct msm_vm_bind_job *job;
469 const struct msm_vm_bind_op *op;
470 bool kept;
471 };
472
473 static int
vm_op_enqueue(struct op_arg * arg,struct msm_vm_op _op)474 vm_op_enqueue(struct op_arg *arg, struct msm_vm_op _op)
475 {
476 struct msm_vm_op *op = kmalloc_obj(*op);
477 if (!op)
478 return -ENOMEM;
479
480 *op = _op;
481 list_add_tail(&op->node, &arg->job->vm_ops);
482
483 if (op->obj)
484 drm_gem_object_get(op->obj);
485
486 return 0;
487 }
488
489 static struct drm_gpuva *
vma_from_op(struct op_arg * arg,struct drm_gpuva_op_map * op)490 vma_from_op(struct op_arg *arg, struct drm_gpuva_op_map *op)
491 {
492 return msm_gem_vma_new(arg->job->vm, op->gem.obj, op->gem.offset,
493 op->va.addr, op->va.addr + op->va.range);
494 }
495
496 static int
msm_gem_vm_sm_step_map(struct drm_gpuva_op * op,void * _arg)497 msm_gem_vm_sm_step_map(struct drm_gpuva_op *op, void *_arg)
498 {
499 struct op_arg *arg = _arg;
500 struct msm_vm_bind_job *job = arg->job;
501 struct drm_gem_object *obj = op->map.gem.obj;
502 struct drm_gpuva *vma;
503 struct sg_table *sgt;
504 unsigned prot;
505 int ret;
506
507 if (arg->kept)
508 return 0;
509
510 vma = vma_from_op(arg, &op->map);
511 if (WARN_ON(IS_ERR(vma)))
512 return PTR_ERR(vma);
513
514 vm_dbg("%p:%p:%p: %016llx %016llx", vma->vm, vma, vma->gem.obj,
515 vma->va.addr, vma->va.range);
516
517 if (obj) {
518 sgt = to_msm_bo(obj)->sgt;
519 prot = msm_gem_prot(obj);
520 } else {
521 sgt = NULL;
522 prot = IOMMU_READ | IOMMU_WRITE;
523 }
524
525 ret = vm_op_enqueue(arg, (struct msm_vm_op){
526 .op = MSM_VM_OP_MAP,
527 .map = {
528 .sgt = sgt,
529 .iova = vma->va.addr,
530 .range = vma->va.range,
531 .offset = vma->gem.offset,
532 .prot = prot,
533 .queue_id = job->queue->id,
534 },
535 .obj = vma->gem.obj,
536 });
537
538 if (ret)
539 return ret;
540
541 vma->flags = ((struct op_arg *)arg)->flags;
542 to_msm_vma(vma)->mapped = true;
543
544 return 0;
545 }
546
547 static int
msm_gem_vm_sm_step_remap(struct drm_gpuva_op * op,void * arg)548 msm_gem_vm_sm_step_remap(struct drm_gpuva_op *op, void *arg)
549 {
550 struct msm_vm_bind_job *job = ((struct op_arg *)arg)->job;
551 struct drm_gpuvm *vm = job->vm;
552 struct drm_gpuva *orig_vma = op->remap.unmap->va;
553 struct drm_gpuva *prev_vma = NULL, *next_vma = NULL;
554 struct drm_gpuvm_bo *vm_bo = orig_vma->vm_bo;
555 bool mapped = to_msm_vma(orig_vma)->mapped;
556 unsigned flags;
557 int ret;
558
559 vm_dbg("orig_vma: %p:%p:%p: %016llx %016llx", vm, orig_vma,
560 orig_vma->gem.obj, orig_vma->va.addr, orig_vma->va.range);
561
562 if (mapped) {
563 uint64_t unmap_start, unmap_range;
564
565 drm_gpuva_op_remap_to_unmap_range(&op->remap, &unmap_start, &unmap_range);
566
567 ret = vm_op_enqueue(arg, (struct msm_vm_op){
568 .op = MSM_VM_OP_UNMAP,
569 .unmap = {
570 .iova = unmap_start,
571 .range = unmap_range,
572 .queue_id = job->queue->id,
573 },
574 .obj = orig_vma->gem.obj,
575 });
576
577 if (ret)
578 return ret;
579
580 /*
581 * Part of this GEM obj is still mapped, but we're going to kill the
582 * existing VMA and replace it with one or two new ones (ie. two if
583 * the unmapped range is in the middle of the existing (unmap) VMA).
584 * So just set the state to unmapped:
585 */
586 to_msm_vma(orig_vma)->mapped = false;
587 }
588
589 /*
590 * Hold a ref to the vm_bo between the msm_gem_vma_close() and the
591 * creation of the new prev/next vma's, in case the vm_bo is tracked
592 * in the VM's evict list:
593 */
594 if (vm_bo)
595 drm_gpuvm_bo_get(vm_bo);
596
597 /*
598 * The prev_vma and/or next_vma are replacing the unmapped vma, and
599 * therefore should preserve it's flags:
600 */
601 flags = orig_vma->flags;
602
603 msm_gem_vma_close(orig_vma);
604
605 if (op->remap.prev) {
606 prev_vma = vma_from_op(arg, op->remap.prev);
607 if (WARN_ON(IS_ERR(prev_vma)))
608 return PTR_ERR(prev_vma);
609
610 vm_dbg("prev_vma: %p:%p: %016llx %016llx", vm, prev_vma, prev_vma->va.addr, prev_vma->va.range);
611 to_msm_vma(prev_vma)->mapped = mapped;
612 prev_vma->flags = flags;
613 }
614
615 if (op->remap.next) {
616 next_vma = vma_from_op(arg, op->remap.next);
617 if (WARN_ON(IS_ERR(next_vma)))
618 return PTR_ERR(next_vma);
619
620 vm_dbg("next_vma: %p:%p: %016llx %016llx", vm, next_vma, next_vma->va.addr, next_vma->va.range);
621 to_msm_vma(next_vma)->mapped = mapped;
622 next_vma->flags = flags;
623 }
624
625 if (!mapped)
626 drm_gpuvm_bo_evict(vm_bo, true);
627
628 /* Drop the previous ref: */
629 drm_gpuvm_bo_put(vm_bo);
630
631 return 0;
632 }
633
634 static int
msm_gem_vm_sm_step_unmap(struct drm_gpuva_op * op,void * _arg)635 msm_gem_vm_sm_step_unmap(struct drm_gpuva_op *op, void *_arg)
636 {
637 struct op_arg *arg = _arg;
638 struct msm_vm_bind_job *job = arg->job;
639 struct drm_gpuva *vma = op->unmap.va;
640 struct msm_gem_vma *msm_vma = to_msm_vma(vma);
641 int ret;
642
643 vm_dbg("%p:%p:%p: %016llx %016llx", vma->vm, vma, vma->gem.obj,
644 vma->va.addr, vma->va.range);
645
646 /*
647 * Detect in-place remap. Turnip does this to change the vma flags,
648 * in particular MSM_VMA_DUMP. In this case we want to avoid actually
649 * touching the page tables, as that would require synchronization
650 * against SUBMIT jobs running on the GPU.
651 */
652 if (op->unmap.keep &&
653 (arg->op->op == MSM_VM_BIND_OP_MAP) &&
654 (vma->gem.obj == arg->op->obj) &&
655 (vma->gem.offset == arg->op->obj_offset) &&
656 (vma->va.addr == arg->op->iova) &&
657 (vma->va.range == arg->op->range)) {
658 /* We are only expecting a single in-place unmap+map cb pair: */
659 WARN_ON(arg->kept);
660
661 /* Leave the existing VMA in place, but signal that to the map cb: */
662 arg->kept = true;
663
664 /* Only flags are changing, so update that in-place: */
665 unsigned orig_flags = vma->flags & (DRM_GPUVA_USERBITS - 1);
666 vma->flags = orig_flags | arg->flags;
667
668 return 0;
669 }
670
671 if (!msm_vma->mapped)
672 goto out_close;
673
674 ret = vm_op_enqueue(arg, (struct msm_vm_op){
675 .op = MSM_VM_OP_UNMAP,
676 .unmap = {
677 .iova = vma->va.addr,
678 .range = vma->va.range,
679 .queue_id = job->queue->id,
680 },
681 .obj = vma->gem.obj,
682 });
683
684 if (ret)
685 return ret;
686
687 msm_vma->mapped = false;
688
689 out_close:
690 msm_gem_vma_close(vma);
691
692 return 0;
693 }
694
695 static const struct drm_gpuvm_ops msm_gpuvm_ops = {
696 .vm_free = msm_gem_vm_free,
697 .vm_bo_validate = msm_gem_vm_bo_validate,
698 .sm_step_map = msm_gem_vm_sm_step_map,
699 .sm_step_remap = msm_gem_vm_sm_step_remap,
700 .sm_step_unmap = msm_gem_vm_sm_step_unmap,
701 };
702
703 static struct dma_fence *
msm_vma_job_run(struct drm_sched_job * _job)704 msm_vma_job_run(struct drm_sched_job *_job)
705 {
706 struct msm_vm_bind_job *job = to_msm_vm_bind_job(_job);
707 struct drm_device *dev = job->vm->drm;
708 struct msm_gem_vm *vm = to_msm_vm(job->vm);
709 struct drm_gem_object *obj;
710 int ret = vm->unusable ? -EINVAL : 0;
711
712 vm_dbg("");
713
714 mutex_lock(&vm->mmu_lock);
715 vm->mmu->prealloc = &job->prealloc;
716
717 while (!list_empty(&job->vm_ops)) {
718 struct msm_vm_op *op =
719 list_first_entry(&job->vm_ops, struct msm_vm_op, node);
720
721 switch (op->op) {
722 case MSM_VM_OP_MAP:
723 /*
724 * On error, stop trying to map new things.. but we
725 * still want to process the unmaps (or in particular,
726 * the drm_gem_object_put()s)
727 */
728 if (!ret)
729 ret = vm_map_op(vm, &op->map);
730 break;
731 case MSM_VM_OP_UNMAP:
732 vm_unmap_op(vm, &op->unmap);
733 break;
734 }
735 drm_gem_object_put(op->obj);
736 list_del(&op->node);
737 kfree(op);
738 }
739
740 vm->mmu->prealloc = NULL;
741 mutex_unlock(&vm->mmu_lock);
742
743 /*
744 * We failed to perform at least _some_ of the pgtable updates, so
745 * now the VM is in an undefined state. Game over!
746 */
747 if (ret)
748 msm_gem_vm_unusable(job->vm);
749
750 mutex_lock(&dev->gem_lru_mutex);
751
752 job_foreach_bo (obj, job) {
753 msm_gem_unpin_active(obj);
754 }
755
756 mutex_unlock(&dev->gem_lru_mutex);
757
758 /* VM_BIND ops are synchronous, so no fence to wait on: */
759 return NULL;
760 }
761
762 static void
msm_vma_job_free(struct drm_sched_job * _job)763 msm_vma_job_free(struct drm_sched_job *_job)
764 {
765 struct msm_vm_bind_job *job = to_msm_vm_bind_job(_job);
766 struct msm_gem_vm *vm = to_msm_vm(job->vm);
767 struct drm_gem_object *obj;
768
769 vm->mmu->funcs->prealloc_cleanup(vm->mmu, &job->prealloc);
770
771 atomic_sub(job->prealloc.count, &vm->prealloc_throttle.in_flight);
772
773 drm_sched_job_cleanup(_job);
774
775 job_foreach_bo (obj, job)
776 drm_gem_object_put(obj);
777
778 msm_submitqueue_put(job->queue);
779 dma_fence_put(job->fence);
780
781 /* In error paths, we could have unexecuted ops: */
782 while (!list_empty(&job->vm_ops)) {
783 struct msm_vm_op *op =
784 list_first_entry(&job->vm_ops, struct msm_vm_op, node);
785 list_del(&op->node);
786 kfree(op);
787 }
788
789 wake_up(&vm->prealloc_throttle.wait);
790
791 kfree(job);
792 }
793
794 static const struct drm_sched_backend_ops msm_vm_bind_ops = {
795 .run_job = msm_vma_job_run,
796 .free_job = msm_vma_job_free
797 };
798
799 /**
800 * msm_gem_vm_create() - Create and initialize a &msm_gem_vm
801 * @drm: the drm device
802 * @mmu: the backing MMU objects handling mapping/unmapping
803 * @name: the name of the VM
804 * @va_start: the start offset of the VA space
805 * @va_size: the size of the VA space
806 * @managed: is it a kernel managed VM?
807 *
808 * In a kernel managed VM, the kernel handles address allocation, and only
809 * synchronous operations are supported. In a user managed VM, userspace
810 * handles virtual address allocation, and both async and sync operations
811 * are supported.
812 *
813 * Returns: pointer to the created &struct drm_gpuvm on success
814 * or an ERR_PTR(-errno) on failure.
815 */
816 struct drm_gpuvm *
msm_gem_vm_create(struct drm_device * drm,struct msm_mmu * mmu,const char * name,u64 va_start,u64 va_size,bool managed)817 msm_gem_vm_create(struct drm_device *drm, struct msm_mmu *mmu, const char *name,
818 u64 va_start, u64 va_size, bool managed)
819 {
820 /*
821 * We mostly want to use DRM_GPUVM_RESV_PROTECTED, except that
822 * makes drm_gpuvm_bo_evict() a no-op for extobjs (ie. we loose
823 * tracking that an extobj is evicted) :facepalm:
824 */
825 enum drm_gpuvm_flags flags = 0;
826 struct msm_gem_vm *vm;
827 struct drm_gem_object *dummy_gem;
828 int ret = 0;
829
830 if (IS_ERR(mmu))
831 return ERR_CAST(mmu);
832
833 vm = kzalloc_obj(*vm);
834 if (!vm)
835 return ERR_PTR(-ENOMEM);
836
837 dummy_gem = drm_gpuvm_resv_object_alloc(drm);
838 if (!dummy_gem) {
839 ret = -ENOMEM;
840 goto err_free_vm;
841 }
842
843 if (!managed) {
844 struct drm_sched_init_args args = {
845 .ops = &msm_vm_bind_ops,
846 .num_rqs = 1,
847 .credit_limit = 1,
848 .timeout = MAX_SCHEDULE_TIMEOUT,
849 .name = "msm-vm-bind",
850 .dev = drm->dev,
851 };
852
853 ret = drm_sched_init(&vm->sched, &args);
854 if (ret)
855 goto err_free_dummy;
856
857 init_waitqueue_head(&vm->prealloc_throttle.wait);
858 }
859
860 drm_gpuvm_init(&vm->base, name, flags, drm, dummy_gem,
861 va_start, va_size, 0, 0, &msm_gpuvm_ops);
862 drm_gem_object_put(dummy_gem);
863
864 vm->mmu = mmu;
865 mutex_init(&vm->mmu_lock);
866 vm->managed = managed;
867
868 drm_mm_init(&vm->mm, va_start, va_size);
869
870 /*
871 * We don't really need vm log for kernel managed VMs, as the kernel
872 * is responsible for ensuring that GEM objs are mapped if they are
873 * used by a submit. Furthermore we piggyback on mmu_lock to serialize
874 * access to the log.
875 *
876 * Limit the max log_shift to 8 to prevent userspace from asking us
877 * for an unreasonable log size.
878 */
879 if (!managed)
880 vm->log_shift = MIN(vm_log_shift, 8);
881
882 if (vm->log_shift) {
883 vm->log = kmalloc_objs(vm->log[0], 1 << vm->log_shift,
884 GFP_KERNEL | __GFP_ZERO);
885 }
886
887 return &vm->base;
888
889 err_free_dummy:
890 drm_gem_object_put(dummy_gem);
891
892 err_free_vm:
893 kfree(vm);
894 return ERR_PTR(ret);
895 }
896
897 /**
898 * msm_gem_vm_close() - Close a VM
899 * @gpuvm: The VM to close
900 *
901 * Called when the drm device file is closed, to tear down VM related resources
902 * (which will drop refcounts to GEM objects that were still mapped into the
903 * VM at the time).
904 */
905 void
msm_gem_vm_close(struct drm_gpuvm * gpuvm)906 msm_gem_vm_close(struct drm_gpuvm *gpuvm)
907 {
908 struct msm_gem_vm *vm = to_msm_vm(gpuvm);
909 struct drm_gpuva *vma, *tmp;
910 struct drm_exec exec;
911
912 /*
913 * For kernel managed VMs, the VMAs are torn down when the handle is
914 * closed, so nothing more to do.
915 */
916 if (vm->managed)
917 return;
918
919 if (vm->last_fence)
920 dma_fence_wait(vm->last_fence, false);
921
922 /* Kill the scheduler now, so we aren't racing with it for cleanup: */
923 drm_sched_stop(&vm->sched, NULL);
924 drm_sched_fini(&vm->sched);
925
926 /* Tear down any remaining mappings: */
927 drm_exec_init(&exec, 0, 2);
928 drm_exec_until_all_locked (&exec) {
929 drm_exec_lock_obj(&exec, drm_gpuvm_resv_obj(gpuvm));
930 drm_exec_retry_on_contention(&exec);
931
932 drm_gpuvm_for_each_va_safe (vma, tmp, gpuvm) {
933 struct drm_gem_object *obj = vma->gem.obj;
934
935 /*
936 * MSM_BO_NO_SHARE objects share the same resv as the
937 * VM, in which case the obj is already locked:
938 */
939 if (obj && (obj->resv == drm_gpuvm_resv(gpuvm)))
940 obj = NULL;
941
942 if (obj) {
943 drm_exec_lock_obj(&exec, obj);
944 drm_exec_retry_on_contention(&exec);
945 }
946
947 msm_gem_vma_unmap(vma, "close");
948 msm_gem_vma_close(vma);
949
950 if (obj) {
951 drm_exec_unlock_obj(&exec, obj);
952 }
953 }
954 }
955 drm_exec_fini(&exec);
956 }
957
958
959 static struct msm_vm_bind_job *
vm_bind_job_create(struct drm_device * dev,struct drm_file * file,struct drm_gpuvm * vm,struct msm_gpu_submitqueue * queue,uint32_t nr_ops)960 vm_bind_job_create(struct drm_device *dev, struct drm_file *file, struct drm_gpuvm *vm,
961 struct msm_gpu_submitqueue *queue, uint32_t nr_ops)
962 {
963 struct msm_vm_bind_job *job;
964 int ret;
965
966 job = kzalloc_flex(*job, ops, nr_ops, GFP_KERNEL | __GFP_NOWARN);
967 if (!job)
968 return ERR_PTR(-ENOMEM);
969
970 ret = drm_sched_job_init(&job->base, queue->entity, 1, queue,
971 file->client_id);
972 if (ret) {
973 kfree(job);
974 return ERR_PTR(ret);
975 }
976
977 job->vm = vm;
978 job->queue = queue;
979 INIT_LIST_HEAD(&job->vm_ops);
980
981 return job;
982 }
983
invalid_alignment(uint64_t addr)984 static bool invalid_alignment(uint64_t addr)
985 {
986 /*
987 * Technically this is about GPU alignment, not CPU alignment. But
988 * I've not seen any qcom SoC where the SMMU does not support the
989 * CPU's smallest page size.
990 */
991 return !PAGE_ALIGNED(addr);
992 }
993
994 static int
lookup_op(struct msm_vm_bind_job * job,const struct drm_msm_vm_bind_op * op)995 lookup_op(struct msm_vm_bind_job *job, const struct drm_msm_vm_bind_op *op)
996 {
997 struct drm_device *dev = job->vm->drm;
998 struct msm_drm_private *priv = dev->dev_private;
999 int i = job->nr_ops++;
1000 int ret = 0;
1001
1002 job->ops[i].op = op->op;
1003 job->ops[i].handle = op->handle;
1004 job->ops[i].obj_offset = op->obj_offset;
1005 job->ops[i].iova = op->iova;
1006 job->ops[i].range = op->range;
1007 job->ops[i].flags = op->flags;
1008
1009 if (op->flags & ~MSM_VM_BIND_OP_FLAGS)
1010 ret = UERR(EINVAL, dev, "invalid flags: %x\n", op->flags);
1011
1012 if (invalid_alignment(op->iova))
1013 ret = UERR(EINVAL, dev, "invalid address: %016llx\n", op->iova);
1014
1015 if (invalid_alignment(op->obj_offset))
1016 ret = UERR(EINVAL, dev, "invalid bo_offset: %016llx\n", op->obj_offset);
1017
1018 if (invalid_alignment(op->range))
1019 ret = UERR(EINVAL, dev, "invalid range: %016llx\n", op->range);
1020
1021 if (!drm_gpuvm_range_valid(job->vm, op->iova, op->range))
1022 ret = UERR(EINVAL, dev, "invalid range: %016llx, %016llx\n", op->iova, op->range);
1023
1024 /*
1025 * MAP must specify a valid handle. But the handle MBZ for
1026 * UNMAP or MAP_NULL.
1027 */
1028 if (op->op == MSM_VM_BIND_OP_MAP) {
1029 if (!op->handle)
1030 ret = UERR(EINVAL, dev, "invalid handle\n");
1031 } else if (op->handle) {
1032 ret = UERR(EINVAL, dev, "handle must be zero\n");
1033 }
1034
1035 switch (op->op) {
1036 case MSM_VM_BIND_OP_MAP:
1037 case MSM_VM_BIND_OP_MAP_NULL:
1038 case MSM_VM_BIND_OP_UNMAP:
1039 break;
1040 default:
1041 ret = UERR(EINVAL, dev, "invalid op: %u\n", op->op);
1042 break;
1043 }
1044
1045 if ((op->op == MSM_VM_BIND_OP_MAP_NULL) &&
1046 !adreno_smmu_has_prr(priv->gpu)) {
1047 ret = UERR(EINVAL, dev, "PRR not supported\n");
1048 }
1049
1050 return ret;
1051 }
1052
1053 /*
1054 * ioctl parsing, parameter validation, and GEM handle lookup
1055 */
1056 static int
vm_bind_job_lookup_ops(struct msm_vm_bind_job * job,struct drm_msm_vm_bind * args,struct drm_file * file,int * nr_bos)1057 vm_bind_job_lookup_ops(struct msm_vm_bind_job *job, struct drm_msm_vm_bind *args,
1058 struct drm_file *file, int *nr_bos)
1059 {
1060 struct drm_device *dev = job->vm->drm;
1061 int ret = 0;
1062 int cnt = 0;
1063 int i = -1;
1064
1065 if (args->nr_ops == 1) {
1066 /* Single op case, the op is inlined: */
1067 ret = lookup_op(job, &args->op);
1068 } else {
1069 for (unsigned i = 0; i < args->nr_ops; i++) {
1070 struct drm_msm_vm_bind_op op;
1071 void __user *userptr =
1072 u64_to_user_ptr(args->ops + (i * sizeof(op)));
1073
1074 /* make sure we don't have garbage flags, in case we hit
1075 * error path before flags is initialized:
1076 */
1077 job->ops[i].flags = 0;
1078
1079 if (copy_from_user(&op, userptr, sizeof(op))) {
1080 ret = -EFAULT;
1081 break;
1082 }
1083
1084 ret = lookup_op(job, &op);
1085 if (ret)
1086 break;
1087 }
1088 }
1089
1090 if (ret) {
1091 job->nr_ops = 0;
1092 goto out;
1093 }
1094
1095 spin_lock(&file->table_lock);
1096
1097 for (i = 0; i < args->nr_ops; i++) {
1098 struct msm_vm_bind_op *op = &job->ops[i];
1099 struct drm_gem_object *obj;
1100
1101 if (!op->handle) {
1102 op->obj = NULL;
1103 continue;
1104 }
1105
1106 /*
1107 * normally use drm_gem_object_lookup(), but for bulk lookup
1108 * all under single table_lock just hit object_idr directly:
1109 */
1110 obj = idr_find(&file->object_idr, op->handle);
1111 if (!obj) {
1112 ret = UERR(EINVAL, dev, "invalid handle %u at index %u\n", op->handle, i);
1113 goto out_unlock;
1114 }
1115
1116 drm_gem_object_get(obj);
1117
1118 op->obj = obj;
1119 cnt++;
1120
1121 if ((op->range + op->obj_offset) > obj->size) {
1122 ret = UERR(EINVAL, dev, "invalid range: %016llx + %016llx > %016zx\n",
1123 op->range, op->obj_offset, obj->size);
1124 goto out_unlock;
1125 }
1126 }
1127
1128 *nr_bos = cnt;
1129
1130 out_unlock:
1131 spin_unlock(&file->table_lock);
1132
1133 if (ret) {
1134 for (; i >= 0; i--) {
1135 struct msm_vm_bind_op *op = &job->ops[i];
1136
1137 if (!op->obj)
1138 continue;
1139
1140 drm_gem_object_put(op->obj);
1141 op->obj = NULL;
1142 }
1143 }
1144 out:
1145 return ret;
1146 }
1147
1148 static void
prealloc_count(struct msm_vm_bind_job * job,struct msm_vm_bind_op * first,struct msm_vm_bind_op * last)1149 prealloc_count(struct msm_vm_bind_job *job,
1150 struct msm_vm_bind_op *first,
1151 struct msm_vm_bind_op *last)
1152 {
1153 struct msm_mmu *mmu = to_msm_vm(job->vm)->mmu;
1154
1155 if (!first)
1156 return;
1157
1158 uint64_t start_iova = first->iova;
1159 uint64_t end_iova = last->iova + last->range;
1160
1161 mmu->funcs->prealloc_count(mmu, &job->prealloc, start_iova, end_iova - start_iova);
1162 }
1163
1164 static bool
ops_are_same_pte(struct msm_vm_bind_op * first,struct msm_vm_bind_op * next)1165 ops_are_same_pte(struct msm_vm_bind_op *first, struct msm_vm_bind_op *next)
1166 {
1167 /*
1168 * Last level pte covers 2MB.. so we should merge two ops, from
1169 * the PoV of figuring out how much pgtable pages to pre-allocate
1170 * if they land in the same 2MB range:
1171 */
1172 uint64_t pte_mask = ~(SZ_2M - 1);
1173 return ((first->iova + first->range) & pte_mask) == (next->iova & pte_mask);
1174 }
1175
1176 /*
1177 * Determine the amount of memory to prealloc for pgtables. For sparse images,
1178 * in particular, userspace plays some tricks with the order of page mappings
1179 * to get the desired swizzle pattern, resulting in a large # of tiny MAP ops.
1180 * So detect when multiple MAP operations are physically contiguous, and count
1181 * them as a single mapping. Otherwise the prealloc_count() will not realize
1182 * they can share pagetable pages and vastly overcount.
1183 */
1184 static int
vm_bind_prealloc_count(struct msm_vm_bind_job * job)1185 vm_bind_prealloc_count(struct msm_vm_bind_job *job)
1186 {
1187 struct msm_vm_bind_op *first = NULL, *last = NULL;
1188 struct msm_gem_vm *vm = to_msm_vm(job->vm);
1189 int ret;
1190
1191 for (int i = 0; i < job->nr_ops; i++) {
1192 struct msm_vm_bind_op *op = &job->ops[i];
1193
1194 /* We only care about MAP/MAP_NULL: */
1195 if (op->op == MSM_VM_BIND_OP_UNMAP)
1196 continue;
1197
1198 /*
1199 * If op is contiguous with last in the current range, then
1200 * it becomes the new last in the range and we continue
1201 * looping:
1202 */
1203 if (last && ops_are_same_pte(last, op)) {
1204 last = op;
1205 continue;
1206 }
1207
1208 /*
1209 * If op is not contiguous with the current range, flush
1210 * the current range and start anew:
1211 */
1212 prealloc_count(job, first, last);
1213 first = last = op;
1214 }
1215
1216 /* Flush the remaining range: */
1217 prealloc_count(job, first, last);
1218
1219 /*
1220 * Now that we know the needed amount to pre-alloc, throttle on pending
1221 * VM_BIND jobs if we already have too much pre-alloc memory in flight
1222 */
1223 ret = wait_event_interruptible(
1224 vm->prealloc_throttle.wait,
1225 atomic_read(&vm->prealloc_throttle.in_flight) <= 1024);
1226 if (ret)
1227 return ret;
1228
1229 atomic_add(job->prealloc.count, &vm->prealloc_throttle.in_flight);
1230
1231 return 0;
1232 }
1233
1234 /*
1235 * Lock VM and GEM objects
1236 */
1237 static int
vm_bind_job_lock_objects(struct msm_vm_bind_job * job,struct drm_exec * exec)1238 vm_bind_job_lock_objects(struct msm_vm_bind_job *job, struct drm_exec *exec)
1239 {
1240 int ret;
1241
1242 /* Lock VM and objects: */
1243 drm_exec_until_all_locked (exec) {
1244 ret = drm_exec_lock_obj(exec, drm_gpuvm_resv_obj(job->vm));
1245 drm_exec_retry_on_contention(exec);
1246 if (ret)
1247 return ret;
1248
1249 for (unsigned i = 0; i < job->nr_ops; i++) {
1250 const struct msm_vm_bind_op *op = &job->ops[i];
1251
1252 switch (op->op) {
1253 case MSM_VM_BIND_OP_UNMAP:
1254 ret = drm_gpuvm_sm_unmap_exec_lock(job->vm, exec,
1255 op->iova,
1256 op->range);
1257 break;
1258 case MSM_VM_BIND_OP_MAP:
1259 case MSM_VM_BIND_OP_MAP_NULL: {
1260 struct drm_gpuvm_map_req map_req = {
1261 .map.va.addr = op->iova,
1262 .map.va.range = op->range,
1263 .map.gem.obj = op->obj,
1264 .map.gem.offset = op->obj_offset,
1265 };
1266
1267 ret = drm_gpuvm_sm_map_exec_lock(job->vm, exec, 1, &map_req);
1268 break;
1269 }
1270 default:
1271 /*
1272 * lookup_op() should have already thrown an error for
1273 * invalid ops
1274 */
1275 WARN_ON("unreachable");
1276 }
1277
1278 drm_exec_retry_on_contention(exec);
1279 if (ret)
1280 return ret;
1281 }
1282 }
1283
1284 return 0;
1285 }
1286
1287 /*
1288 * Pin GEM objects, ensuring that we have backing pages. Pinning will move
1289 * the object to the pinned LRU so that the shrinker knows to first consider
1290 * other objects for evicting.
1291 */
1292 static int
vm_bind_job_pin_objects(struct msm_vm_bind_job * job)1293 vm_bind_job_pin_objects(struct msm_vm_bind_job *job)
1294 {
1295 struct drm_gem_object *obj;
1296
1297 /*
1298 * First loop, before holding the LRU lock, avoids holding the
1299 * LRU lock while calling msm_gem_pin_vma_locked (which could
1300 * trigger get_pages())
1301 */
1302 job_foreach_bo (obj, job) {
1303 struct page **pages;
1304
1305 pages = msm_gem_get_pages_locked(obj, MSM_MADV_WILLNEED);
1306 if (IS_ERR(pages))
1307 return PTR_ERR(pages);
1308 }
1309
1310 struct drm_device *dev = job->vm->drm;
1311
1312 /*
1313 * A second loop while holding the LRU lock (a) avoids acquiring/dropping
1314 * the LRU lock for each individual bo, while (b) avoiding holding the
1315 * LRU lock while calling msm_gem_pin_vma_locked() (which could trigger
1316 * get_pages() which could trigger reclaim.. and if we held the LRU lock
1317 * could trigger deadlock with the shrinker).
1318 */
1319 mutex_lock(&dev->gem_lru_mutex);
1320 job_foreach_bo (obj, job)
1321 msm_gem_pin_obj_locked(obj);
1322 mutex_unlock(&dev->gem_lru_mutex);
1323
1324 job->bos_pinned = true;
1325
1326 return 0;
1327 }
1328
1329 /*
1330 * Unpin GEM objects. Normally this is done after the bind job is run.
1331 */
1332 static void
vm_bind_job_unpin_objects(struct msm_vm_bind_job * job)1333 vm_bind_job_unpin_objects(struct msm_vm_bind_job *job)
1334 {
1335 struct drm_gem_object *obj;
1336
1337 if (!job->bos_pinned)
1338 return;
1339
1340 job_foreach_bo (obj, job)
1341 msm_gem_unpin_locked(obj);
1342
1343 job->bos_pinned = false;
1344 }
1345
1346 /*
1347 * Pre-allocate pgtable memory, and translate the VM bind requests into a
1348 * sequence of pgtable updates to be applied asynchronously.
1349 */
1350 static int
vm_bind_job_prepare(struct msm_vm_bind_job * job)1351 vm_bind_job_prepare(struct msm_vm_bind_job *job)
1352 {
1353 struct msm_gem_vm *vm = to_msm_vm(job->vm);
1354 struct msm_mmu *mmu = vm->mmu;
1355 int ret;
1356
1357 ret = mmu->funcs->prealloc_allocate(mmu, &job->prealloc);
1358 if (ret)
1359 return ret;
1360
1361 for (unsigned i = 0; i < job->nr_ops; i++) {
1362 const struct msm_vm_bind_op *op = &job->ops[i];
1363 struct op_arg arg = {
1364 .job = job,
1365 .op = op,
1366 };
1367
1368 switch (op->op) {
1369 case MSM_VM_BIND_OP_UNMAP:
1370 ret = drm_gpuvm_sm_unmap(job->vm, &arg, op->iova,
1371 op->range);
1372 break;
1373 case MSM_VM_BIND_OP_MAP:
1374 if (op->flags & MSM_VM_BIND_OP_DUMP)
1375 arg.flags |= MSM_VMA_DUMP;
1376 fallthrough;
1377 case MSM_VM_BIND_OP_MAP_NULL: {
1378 struct drm_gpuvm_map_req map_req = {
1379 .map.va.addr = op->iova,
1380 .map.va.range = op->range,
1381 .map.gem.obj = op->obj,
1382 .map.gem.offset = op->obj_offset,
1383 };
1384
1385 ret = drm_gpuvm_sm_map(job->vm, &arg, &map_req);
1386 break;
1387 }
1388 default:
1389 /*
1390 * lookup_op() should have already thrown an error for
1391 * invalid ops
1392 */
1393 BUG_ON("unreachable");
1394 }
1395
1396 if (ret) {
1397 /*
1398 * If we've already started modifying the vm, we can't
1399 * adequetly describe to userspace the intermediate
1400 * state the vm is in. So throw up our hands!
1401 */
1402 if (i > 0)
1403 msm_gem_vm_unusable(job->vm);
1404 return ret;
1405 }
1406 }
1407
1408 return 0;
1409 }
1410
1411 /*
1412 * Attach fences to the GEM objects being bound. This will signify to
1413 * the shrinker that they are busy even after dropping the locks (ie.
1414 * drm_exec_fini())
1415 */
1416 static void
vm_bind_job_attach_fences(struct msm_vm_bind_job * job)1417 vm_bind_job_attach_fences(struct msm_vm_bind_job *job)
1418 {
1419 for (unsigned i = 0; i < job->nr_ops; i++) {
1420 struct drm_gem_object *obj = job->ops[i].obj;
1421
1422 if (!obj)
1423 continue;
1424
1425 dma_resv_add_fence(obj->resv, job->fence,
1426 DMA_RESV_USAGE_KERNEL);
1427 }
1428 }
1429
1430 int
msm_ioctl_vm_bind(struct drm_device * dev,void * data,struct drm_file * file)1431 msm_ioctl_vm_bind(struct drm_device *dev, void *data, struct drm_file *file)
1432 {
1433 struct msm_drm_private *priv = dev->dev_private;
1434 struct drm_msm_vm_bind *args = data;
1435 struct msm_context *ctx = file->driver_priv;
1436 struct drm_gpuvm *vm = msm_context_vm(dev, ctx);
1437 struct msm_vm_bind_job *job = NULL;
1438 struct msm_gpu *gpu = priv->gpu;
1439 struct msm_gpu_submitqueue *queue;
1440 struct msm_syncobj_post_dep *post_deps = NULL;
1441 struct drm_syncobj **syncobjs_to_reset = NULL;
1442 struct sync_file *sync_file = NULL;
1443 struct dma_fence *fence;
1444 int out_fence_fd = -1;
1445 int ret, nr_bos = 0;
1446 unsigned i;
1447
1448 if (!gpu)
1449 return -ENXIO;
1450
1451 if (!vm)
1452 return UERR(ENOMEM, dev, "no VM");
1453
1454 /*
1455 * Maybe we could allow just UNMAP ops? OTOH userspace should just
1456 * immediately close the device file and all will be torn down.
1457 */
1458 if (to_msm_vm(vm)->unusable)
1459 return UERR(EPIPE, dev, "context is unusable");
1460
1461 /*
1462 * Technically, you cannot create a VM_BIND submitqueue in the first
1463 * place, if you haven't opted in to VM_BIND context. But it is
1464 * cleaner / less confusing, to check this case directly.
1465 */
1466 if (!msm_context_is_vmbind(ctx))
1467 return UERR(EINVAL, dev, "context does not support vmbind");
1468
1469 if (args->flags & ~MSM_VM_BIND_FLAGS)
1470 return UERR(EINVAL, dev, "invalid flags");
1471
1472 queue = msm_submitqueue_get(ctx, args->queue_id);
1473 if (!queue)
1474 return -ENOENT;
1475
1476 if (!(queue->flags & MSM_SUBMITQUEUE_VM_BIND)) {
1477 ret = UERR(EINVAL, dev, "Invalid queue type");
1478 goto out_post_unlock;
1479 }
1480
1481 if (args->flags & MSM_VM_BIND_FENCE_FD_OUT) {
1482 out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
1483 if (out_fence_fd < 0) {
1484 ret = out_fence_fd;
1485 goto out_post_unlock;
1486 }
1487 }
1488
1489 job = vm_bind_job_create(dev, file, vm, queue, args->nr_ops);
1490 if (IS_ERR(job)) {
1491 ret = PTR_ERR(job);
1492 goto out_post_unlock;
1493 }
1494
1495 ret = mutex_lock_interruptible(&queue->lock);
1496 if (ret)
1497 goto out_post_unlock;
1498
1499 if (args->flags & MSM_VM_BIND_FENCE_FD_IN) {
1500 struct dma_fence *in_fence;
1501
1502 in_fence = sync_file_get_fence(args->fence_fd);
1503
1504 if (!in_fence) {
1505 ret = UERR(EINVAL, dev, "invalid in-fence");
1506 goto out_unlock;
1507 }
1508
1509 ret = drm_sched_job_add_dependency(&job->base, in_fence);
1510 if (ret)
1511 goto out_unlock;
1512 }
1513
1514 if (args->in_syncobjs > 0) {
1515 syncobjs_to_reset = msm_syncobj_parse_deps(dev, &job->base,
1516 file, args->in_syncobjs,
1517 args->nr_in_syncobjs,
1518 args->syncobj_stride);
1519 if (IS_ERR(syncobjs_to_reset)) {
1520 ret = PTR_ERR(syncobjs_to_reset);
1521 goto out_unlock;
1522 }
1523 }
1524
1525 if (args->out_syncobjs > 0) {
1526 post_deps = msm_syncobj_parse_post_deps(dev, file,
1527 args->out_syncobjs,
1528 args->nr_out_syncobjs,
1529 args->syncobj_stride);
1530 if (IS_ERR(post_deps)) {
1531 ret = PTR_ERR(post_deps);
1532 goto out_unlock;
1533 }
1534 }
1535
1536 ret = vm_bind_job_lookup_ops(job, args, file, &nr_bos);
1537 if (ret)
1538 goto out_unlock;
1539
1540 ret = vm_bind_prealloc_count(job);
1541 if (ret)
1542 goto out_unlock;
1543
1544 struct drm_exec exec;
1545 unsigned flags = DRM_EXEC_IGNORE_DUPLICATES | DRM_EXEC_INTERRUPTIBLE_WAIT;
1546 drm_exec_init(&exec, flags, nr_bos + 1);
1547
1548 ret = vm_bind_job_lock_objects(job, &exec);
1549 if (ret)
1550 goto out;
1551
1552 ret = vm_bind_job_pin_objects(job);
1553 if (ret)
1554 goto out;
1555
1556 ret = vm_bind_job_prepare(job);
1557 if (ret)
1558 goto out;
1559
1560 drm_sched_job_arm(&job->base);
1561
1562 job->fence = dma_fence_get(&job->base.s_fence->finished);
1563
1564 if (args->flags & MSM_VM_BIND_FENCE_FD_OUT) {
1565 sync_file = sync_file_create(job->fence);
1566 if (!sync_file)
1567 ret = -ENOMEM;
1568 }
1569
1570 if (ret)
1571 goto out;
1572
1573 vm_bind_job_attach_fences(job);
1574
1575 /*
1576 * The job can be free'd (and fence unref'd) at any point after
1577 * drm_sched_entity_push_job(), so we need to hold our own ref
1578 */
1579 fence = dma_fence_get(job->fence);
1580
1581 drm_sched_entity_push_job(&job->base);
1582
1583 msm_syncobj_reset(syncobjs_to_reset, args->nr_in_syncobjs);
1584 msm_syncobj_process_post_deps(post_deps, args->nr_out_syncobjs, fence);
1585
1586 dma_fence_put(fence);
1587
1588 out:
1589 if (ret)
1590 vm_bind_job_unpin_objects(job);
1591
1592 drm_exec_fini(&exec);
1593 out_unlock:
1594 mutex_unlock(&queue->lock);
1595 out_post_unlock:
1596 if (ret) {
1597 if (out_fence_fd >= 0)
1598 put_unused_fd(out_fence_fd);
1599 if (sync_file)
1600 fput(sync_file->file);
1601 } else if (sync_file) {
1602 fd_install(out_fence_fd, sync_file->file);
1603 args->fence_fd = out_fence_fd;
1604 }
1605
1606 if (!IS_ERR_OR_NULL(job)) {
1607 if (ret)
1608 msm_vma_job_free(&job->base);
1609 } else {
1610 /*
1611 * If the submit hasn't yet taken ownership of the queue
1612 * then we need to drop the reference ourself:
1613 */
1614 msm_submitqueue_put(queue);
1615 }
1616
1617 if (!IS_ERR_OR_NULL(post_deps)) {
1618 for (i = 0; i < args->nr_out_syncobjs; ++i) {
1619 kfree(post_deps[i].chain);
1620 drm_syncobj_put(post_deps[i].syncobj);
1621 }
1622 kfree(post_deps);
1623 }
1624
1625 if (!IS_ERR_OR_NULL(syncobjs_to_reset)) {
1626 for (i = 0; i < args->nr_in_syncobjs; ++i) {
1627 if (syncobjs_to_reset[i])
1628 drm_syncobj_put(syncobjs_to_reset[i]);
1629 }
1630 kfree(syncobjs_to_reset);
1631 }
1632
1633 return ret;
1634 }
1635