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 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 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(vm); 170 } 171 172 /** 173 * msm_gem_vm_unusable() - Mark a VM as unusable 174 * @gpuvm: the VM to mark unusable 175 */ 176 void 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 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 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 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 */ 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 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 */ 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 * 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 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 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 * 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 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 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 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 * 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 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 * 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 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 * 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 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 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 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 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 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 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 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 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 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 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 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 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