1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright 2023 Advanced Micro Devices, Inc. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in 13 * all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 * 23 */ 24 25 #include <linux/kref.h> 26 #include <linux/slab.h> 27 #include <linux/dma-fence-unwrap.h> 28 29 #include <drm/drm_exec.h> 30 #include <drm/drm_syncobj.h> 31 32 #include "amdgpu.h" 33 #include "amdgpu_trace.h" 34 35 #define AMDGPU_USERQ_MAX_HANDLES (1U << 16) 36 37 static const struct dma_fence_ops amdgpu_userq_fence_ops; 38 39 static inline struct amdgpu_userq_fence *to_amdgpu_userq_fence(struct dma_fence *f) 40 { 41 if (!f || f->ops != &amdgpu_userq_fence_ops) 42 return NULL; 43 44 return container_of(f, struct amdgpu_userq_fence, base); 45 } 46 47 static u64 amdgpu_userq_fence_read(struct amdgpu_userq_fence_driver *fence_drv) 48 { 49 return le64_to_cpu(*fence_drv->cpu_addr); 50 } 51 52 static void 53 amdgpu_userq_fence_write(struct amdgpu_userq_fence_driver *fence_drv, 54 u64 seq) 55 { 56 if (fence_drv->cpu_addr) 57 *fence_drv->cpu_addr = cpu_to_le64(seq); 58 } 59 60 int amdgpu_userq_fence_driver_alloc(struct amdgpu_device *adev, 61 struct amdgpu_userq_fence_driver **fence_drv_req) 62 { 63 struct amdgpu_userq_fence_driver *fence_drv; 64 int r; 65 66 if (!fence_drv_req) 67 return -EINVAL; 68 *fence_drv_req = NULL; 69 70 fence_drv = kzalloc_obj(*fence_drv); 71 if (!fence_drv) 72 return -ENOMEM; 73 74 /* Acquire seq64 memory */ 75 r = amdgpu_seq64_alloc(adev, &fence_drv->va, &fence_drv->gpu_addr, 76 &fence_drv->cpu_addr); 77 if (r) 78 goto free_fence_drv; 79 80 memset(fence_drv->cpu_addr, 0, sizeof(u64)); 81 82 kref_init(&fence_drv->refcount); 83 INIT_LIST_HEAD(&fence_drv->fences); 84 spin_lock_init(&fence_drv->fence_list_lock); 85 86 fence_drv->adev = adev; 87 fence_drv->context = dma_fence_context_alloc(1); 88 get_task_comm(fence_drv->timeline_name, current); 89 90 *fence_drv_req = fence_drv; 91 92 return 0; 93 94 free_fence_drv: 95 kfree(fence_drv); 96 97 return r; 98 } 99 100 static void amdgpu_userq_walk_and_drop_fence_drv(struct xarray *xa) 101 { 102 struct amdgpu_userq_fence_driver *fence_drv; 103 unsigned long index; 104 105 if (xa_empty(xa)) 106 return; 107 108 xa_lock(xa); 109 xa_for_each(xa, index, fence_drv) { 110 __xa_erase(xa, index); 111 amdgpu_userq_fence_driver_put(fence_drv); 112 } 113 114 xa_unlock(xa); 115 } 116 117 void 118 amdgpu_userq_fence_driver_free(struct amdgpu_usermode_queue *userq) 119 { 120 dma_fence_put(userq->last_fence); 121 userq->last_fence = NULL; 122 amdgpu_userq_walk_and_drop_fence_drv(&userq->fence_drv_xa); 123 xa_destroy(&userq->fence_drv_xa); 124 mutex_destroy(&userq->fence_drv_lock); 125 /* Drop the queue's ownership reference to fence_drv explicitly */ 126 amdgpu_userq_fence_driver_put(userq->fence_drv); 127 } 128 129 static void 130 amdgpu_userq_fence_put_fence_drv_array(struct amdgpu_userq_fence *userq_fence) 131 { 132 unsigned long i; 133 for (i = 0; i < userq_fence->fence_drv_array_count; i++) 134 amdgpu_userq_fence_driver_put(userq_fence->fence_drv_array[i]); 135 userq_fence->fence_drv_array_count = 0; 136 } 137 138 /* 139 * Returns: 140 * -ENOENT when no fences were processes 141 * 1 when more fences are pending 142 * 0 when no fences are pending any more 143 */ 144 int 145 amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_drv) 146 { 147 struct amdgpu_userq_fence *userq_fence, *tmp; 148 LIST_HEAD(to_be_signaled); 149 struct dma_fence *fence; 150 unsigned long flags; 151 u64 fence_val; 152 153 spin_lock_irqsave(&fence_drv->fence_list_lock, flags); 154 fence_val = amdgpu_userq_fence_read(fence_drv); 155 156 list_for_each_entry(userq_fence, &fence_drv->fences, link) { 157 if (fence_val < userq_fence->base.seqno) 158 break; 159 } 160 161 list_cut_before(&to_be_signaled, &fence_drv->fences, 162 &userq_fence->link); 163 spin_unlock_irqrestore(&fence_drv->fence_list_lock, flags); 164 165 if (list_empty(&to_be_signaled)) 166 return -ENOENT; 167 168 list_for_each_entry_safe(userq_fence, tmp, &to_be_signaled, link) { 169 fence = &userq_fence->base; 170 list_del_init(&userq_fence->link); 171 dma_fence_signal(fence); 172 /* Drop fence_drv_array outside fence_list_lock 173 * to avoid the recursion lock. 174 */ 175 amdgpu_userq_fence_put_fence_drv_array(userq_fence); 176 dma_fence_put(fence); 177 } 178 179 /* That doesn't need to be accurate so no locking */ 180 return list_empty(&fence_drv->fences) ? 0 : 1; 181 } 182 183 void amdgpu_userq_fence_driver_destroy(struct kref *ref) 184 { 185 struct amdgpu_userq_fence_driver *fence_drv = container_of(ref, 186 struct amdgpu_userq_fence_driver, 187 refcount); 188 struct amdgpu_device *adev = fence_drv->adev; 189 struct amdgpu_userq_fence *fence, *tmp; 190 unsigned long flags; 191 struct dma_fence *f; 192 193 spin_lock_irqsave(&fence_drv->fence_list_lock, flags); 194 lockdep_assert_held(&fence_drv->fence_list_lock); 195 list_for_each_entry_safe(fence, tmp, &fence_drv->fences, link) { 196 f = &fence->base; 197 spin_lock(dma_fence_spinlock(f)); 198 if (!dma_fence_is_signaled_locked(f)) { 199 dma_fence_set_error(f, -ECANCELED); 200 dma_fence_signal_locked(f); 201 } 202 spin_unlock(dma_fence_spinlock(f)); 203 list_del(&fence->link); 204 dma_fence_put(f); 205 } 206 spin_unlock_irqrestore(&fence_drv->fence_list_lock, flags); 207 208 /* Free seq64 memory */ 209 amdgpu_seq64_free(adev, fence_drv->va); 210 kfree(fence_drv); 211 } 212 213 void amdgpu_userq_fence_driver_get(struct amdgpu_userq_fence_driver *fence_drv) 214 { 215 kref_get(&fence_drv->refcount); 216 } 217 218 void amdgpu_userq_fence_driver_put(struct amdgpu_userq_fence_driver *fence_drv) 219 { 220 kref_put(&fence_drv->refcount, amdgpu_userq_fence_driver_destroy); 221 } 222 223 static int amdgpu_userq_fence_alloc(struct amdgpu_usermode_queue *userq, 224 struct amdgpu_userq_fence **pfence) 225 { 226 struct amdgpu_userq_fence_driver *fence_drv = userq->fence_drv; 227 struct amdgpu_userq_fence *userq_fence; 228 void *entry; 229 230 userq_fence = kmalloc_obj(*userq_fence); 231 if (!userq_fence) 232 return -ENOMEM; 233 234 /* 235 * Get the next unused entry, since we fill from the start this can be 236 * used as size to allocate the array. 237 */ 238 mutex_lock(&userq->fence_drv_lock); 239 XA_STATE(xas, &userq->fence_drv_xa, 0); 240 241 rcu_read_lock(); 242 do { 243 entry = xas_find_marked(&xas, ULONG_MAX, XA_FREE_MARK); 244 } while (xas_retry(&xas, entry)); 245 rcu_read_unlock(); 246 247 userq_fence->fence_drv_array = kvmalloc_objs(fence_drv, xas.xa_index); 248 if (!userq_fence->fence_drv_array) { 249 mutex_unlock(&userq->fence_drv_lock); 250 kfree(userq_fence); 251 return -ENOMEM; 252 } 253 254 userq_fence->fence_drv_array_count = xas.xa_index; 255 xa_extract(&userq->fence_drv_xa, (void **)userq_fence->fence_drv_array, 256 0, ULONG_MAX, xas.xa_index, XA_PRESENT); 257 xa_destroy(&userq->fence_drv_xa); 258 259 mutex_unlock(&userq->fence_drv_lock); 260 261 amdgpu_userq_fence_driver_get(fence_drv); 262 userq_fence->fence_drv = fence_drv; 263 264 *pfence = userq_fence; 265 return 0; 266 } 267 268 static void amdgpu_userq_fence_init(struct amdgpu_usermode_queue *userq, 269 struct amdgpu_userq_fence *fence, 270 u64 seq) 271 { 272 struct amdgpu_userq_fence_driver *fence_drv = userq->fence_drv; 273 unsigned long flags; 274 bool signaled = false; 275 276 spin_lock_init(&fence->lock); 277 dma_fence_init64(&fence->base, &amdgpu_userq_fence_ops, &fence->lock, 278 fence_drv->context, seq); 279 280 /* Make sure the fence is visible to the hang detect worker */ 281 dma_fence_put(userq->last_fence); 282 userq->last_fence = dma_fence_get(&fence->base); 283 284 /* Check if hardware has already processed the fence */ 285 spin_lock_irqsave(&fence_drv->fence_list_lock, flags); 286 if (!dma_fence_is_signaled(&fence->base)) { 287 dma_fence_get(&fence->base); 288 list_add_tail(&fence->link, &fence_drv->fences); 289 } else { 290 INIT_LIST_HEAD(&fence->link); 291 signaled = true; 292 } 293 spin_unlock_irqrestore(&fence_drv->fence_list_lock, flags); 294 295 if (signaled) 296 amdgpu_userq_fence_put_fence_drv_array(fence); 297 else 298 amdgpu_userq_start_hang_detect_work(userq); 299 } 300 301 static const char *amdgpu_userq_fence_get_driver_name(struct dma_fence *f) 302 { 303 return "amdgpu_userq_fence"; 304 } 305 306 static const char *amdgpu_userq_fence_get_timeline_name(struct dma_fence *f) 307 { 308 struct amdgpu_userq_fence *fence = to_amdgpu_userq_fence(f); 309 310 return fence->fence_drv->timeline_name; 311 } 312 313 static bool amdgpu_userq_fence_signaled(struct dma_fence *f) 314 { 315 struct amdgpu_userq_fence *fence = to_amdgpu_userq_fence(f); 316 struct amdgpu_userq_fence_driver *fence_drv = fence->fence_drv; 317 u64 fence_val, wptr; 318 319 fence_val = amdgpu_userq_fence_read(fence_drv); 320 wptr = fence->base.seqno; 321 322 if (fence_val >= wptr) 323 return true; 324 325 return false; 326 } 327 328 static void amdgpu_userq_fence_free(struct rcu_head *rcu) 329 { 330 struct dma_fence *fence = container_of(rcu, struct dma_fence, rcu); 331 struct amdgpu_userq_fence *userq_fence = to_amdgpu_userq_fence(fence); 332 struct amdgpu_userq_fence_driver *fence_drv = userq_fence->fence_drv; 333 334 /* Release the fence driver reference */ 335 amdgpu_userq_fence_driver_put(fence_drv); 336 337 kvfree(userq_fence->fence_drv_array); 338 kfree(userq_fence); 339 } 340 341 static void amdgpu_userq_fence_release(struct dma_fence *f) 342 { 343 call_rcu(&f->rcu, amdgpu_userq_fence_free); 344 } 345 346 static const struct dma_fence_ops amdgpu_userq_fence_ops = { 347 .get_driver_name = amdgpu_userq_fence_get_driver_name, 348 .get_timeline_name = amdgpu_userq_fence_get_timeline_name, 349 .signaled = amdgpu_userq_fence_signaled, 350 .release = amdgpu_userq_fence_release, 351 }; 352 353 /** 354 * amdgpu_userq_fence_read_wptr - Read the userq wptr value 355 * 356 * @adev: amdgpu_device pointer 357 * @queue: user mode queue structure pointer 358 * @wptr: write pointer value 359 * 360 * Read the wptr value from userq's MQD. The userq signal IOCTL 361 * creates a dma_fence for the shared buffers that expects the 362 * fence_val written to seq64 fence address >= WPTR. 363 * 364 * Returns wptr value on success, error on failure. 365 */ 366 static int amdgpu_userq_fence_read_wptr(struct amdgpu_device *adev, 367 struct amdgpu_usermode_queue *queue, 368 u64 *wptr) 369 { 370 struct amdgpu_bo_va_mapping *mapping; 371 struct amdgpu_bo *bo; 372 struct drm_exec exec; 373 u64 addr, offset, *ptr; 374 int ret; 375 376 addr = queue->userq_prop->wptr_gpu_addr; 377 addr &= AMDGPU_GMC_HOLE_MASK; 378 379 drm_exec_init(&exec, DRM_EXEC_IGNORE_DUPLICATES, 2); 380 drm_exec_until_all_locked(&exec) { 381 ret = amdgpu_vm_lock_pd(queue->vm, &exec, 1); 382 drm_exec_retry_on_contention(&exec); 383 if (unlikely(ret)) 384 goto lock_error; 385 386 mapping = amdgpu_vm_bo_lookup_mapping(queue->vm, addr); 387 if (!mapping || !mapping->bo_va->base.bo) { 388 ret = -EINVAL; 389 goto lock_error; 390 } 391 392 ret = drm_exec_lock_obj(&exec, &mapping->bo_va->base.bo->tbo.base); 393 drm_exec_retry_on_contention(&exec); 394 if (unlikely(ret)) 395 goto lock_error; 396 } 397 398 bo = mapping->bo_va->base.bo; 399 ret = amdgpu_bo_kmap(bo, (void **)&ptr); 400 if (ret) { 401 DRM_ERROR("Failed mapping the userqueue wptr bo"); 402 goto lock_error; 403 } 404 405 /* The WPTR can be anywhere within the BO's VA mapping. */ 406 offset = addr - (mapping->start << AMDGPU_GPU_PAGE_SHIFT); 407 offset += mapping->offset; 408 *wptr = le64_to_cpu(ptr[offset / sizeof(*ptr)]); 409 410 amdgpu_bo_kunmap(bo); 411 drm_exec_fini(&exec); 412 return 0; 413 414 lock_error: 415 drm_exec_fini(&exec); 416 return ret; 417 } 418 419 static void 420 amdgpu_userq_fence_driver_set_error(struct amdgpu_userq_fence *fence, 421 int error) 422 { 423 struct amdgpu_userq_fence_driver *fence_drv = fence->fence_drv; 424 unsigned long flags; 425 struct dma_fence *f; 426 427 spin_lock_irqsave(&fence_drv->fence_list_lock, flags); 428 lockdep_assert_held(&fence_drv->fence_list_lock); 429 f = rcu_dereference_protected(&fence->base, 430 lockdep_is_held(&fence_drv->fence_list_lock)); 431 if (f) { 432 /* nest f->lock inside fence_list_lock */ 433 spin_lock(dma_fence_spinlock(f)); 434 if (!dma_fence_is_signaled_locked(f)) 435 dma_fence_set_error(f, error); 436 spin_unlock(dma_fence_spinlock(f)); 437 } 438 spin_unlock_irqrestore(&fence_drv->fence_list_lock, flags); 439 } 440 441 void 442 amdgpu_userq_fence_driver_force_completion(struct amdgpu_usermode_queue *userq) 443 { 444 struct dma_fence *f = userq->last_fence; 445 446 if (f) { 447 struct amdgpu_userq_fence *fence = to_amdgpu_userq_fence(f); 448 struct amdgpu_userq_fence_driver *fence_drv = fence->fence_drv; 449 u64 wptr = fence->base.seqno; 450 451 amdgpu_userq_fence_driver_set_error(fence, -ECANCELED); 452 amdgpu_userq_fence_write(fence_drv, wptr); 453 amdgpu_userq_fence_driver_process(fence_drv); 454 455 } 456 } 457 458 int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data, 459 struct drm_file *filp) 460 { 461 struct amdgpu_device *adev = drm_to_adev(dev); 462 struct drm_amdgpu_userq_signal *args = data; 463 const unsigned int num_write_bo_handles = args->num_bo_write_handles; 464 const unsigned int num_read_bo_handles = args->num_bo_read_handles; 465 struct amdgpu_fpriv *fpriv = filp->driver_priv; 466 struct amdgpu_userq_mgr *userq_mgr = &fpriv->userq_mgr; 467 468 struct drm_gem_object **gobj_write, **gobj_read; 469 u32 *syncobj_handles, num_syncobj_handles; 470 u64 *syncobj_points; 471 struct amdgpu_usermode_queue *queue; 472 struct amdgpu_userq_fence *fence; 473 struct { 474 struct drm_syncobj *syncobj; 475 struct dma_fence_chain *chain; 476 } *syncobj; 477 struct drm_exec exec; 478 void __user *ptr; 479 int r, i, entry; 480 u64 wptr; 481 482 if (!amdgpu_userq_enabled(dev)) 483 return -ENOTSUPP; 484 485 if (args->num_bo_write_handles > AMDGPU_USERQ_MAX_HANDLES || 486 args->num_bo_read_handles > AMDGPU_USERQ_MAX_HANDLES) 487 return -EINVAL; 488 489 num_syncobj_handles = args->num_syncobj_handles; 490 ptr = u64_to_user_ptr(args->syncobj_handles); 491 syncobj_handles = memdup_array_user(ptr, num_syncobj_handles, 492 sizeof(u32)); 493 if (IS_ERR(syncobj_handles)) 494 return PTR_ERR(syncobj_handles); 495 496 if (args->syncobj_points) { 497 ptr = u64_to_user_ptr(args->syncobj_points); 498 syncobj_points = memdup_array_user(ptr, num_syncobj_handles, 499 sizeof(u64)); 500 if (IS_ERR(syncobj_points)) { 501 r = PTR_ERR(syncobj_points); 502 goto free_syncobj_handles; 503 } 504 } else { 505 syncobj_points = NULL; 506 } 507 508 syncobj = kmalloc_array(num_syncobj_handles, sizeof(*syncobj), 509 GFP_KERNEL); 510 if (!syncobj) { 511 r = -ENOMEM; 512 goto free_syncobj_points; 513 } 514 515 for (entry = 0; entry < num_syncobj_handles; entry++) { 516 syncobj[entry].chain = NULL; 517 syncobj[entry].syncobj = drm_syncobj_find(filp, syncobj_handles[entry]); 518 if (!syncobj[entry].syncobj) { 519 r = -ENOENT; 520 goto free_syncobj; 521 } 522 if (syncobj_points && syncobj_points[entry]) { 523 syncobj[entry].chain = dma_fence_chain_alloc(); 524 if (!syncobj[entry].chain) { 525 drm_syncobj_put(syncobj[entry].syncobj); 526 r = -ENOMEM; 527 goto free_syncobj; 528 } 529 } 530 } 531 532 ptr = u64_to_user_ptr(args->bo_read_handles); 533 r = drm_gem_objects_lookup(filp, ptr, num_read_bo_handles, &gobj_read); 534 if (r) 535 goto free_syncobj; 536 537 ptr = u64_to_user_ptr(args->bo_write_handles); 538 r = drm_gem_objects_lookup(filp, ptr, num_write_bo_handles, 539 &gobj_write); 540 if (r) 541 goto put_gobj_read; 542 543 queue = amdgpu_userq_get(userq_mgr, args->queue_id); 544 if (!queue) { 545 r = -ENOENT; 546 goto put_gobj_write; 547 } 548 549 r = amdgpu_userq_fence_read_wptr(adev, queue, &wptr); 550 if (r) 551 goto put_queue; 552 553 r = amdgpu_userq_fence_alloc(queue, &fence); 554 if (r) 555 goto put_queue; 556 557 /* We are here means UQ is active, make sure the eviction fence is valid */ 558 amdgpu_userq_ensure_ev_fence(&fpriv->userq_mgr, &fpriv->evf_mgr); 559 560 /* Create the new fence */ 561 amdgpu_userq_fence_init(queue, fence, wptr); 562 563 trace_amdgpu_userq_emit_fence(dev->dev, queue, fence); 564 565 mutex_unlock(&userq_mgr->userq_mutex); 566 567 /* 568 * This needs to come after the fence is created since 569 * amdgpu_userq_ensure_ev_fence() can't be called while holding the resv 570 * locks. 571 */ 572 drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT | DRM_EXEC_IGNORE_DUPLICATES, 573 (num_read_bo_handles + num_write_bo_handles)); 574 575 drm_exec_until_all_locked(&exec) { 576 r = drm_exec_prepare_array(&exec, gobj_read, 577 num_read_bo_handles, 1); 578 drm_exec_retry_on_contention(&exec); 579 if (r) 580 goto exec_fini; 581 582 r = drm_exec_prepare_array(&exec, gobj_write, 583 num_write_bo_handles, 1); 584 drm_exec_retry_on_contention(&exec); 585 if (r) 586 goto exec_fini; 587 } 588 589 /* And publish the new fence in the BOs and syncobj */ 590 for (i = 0; i < num_read_bo_handles; i++) 591 dma_resv_add_fence(gobj_read[i]->resv, &fence->base, 592 DMA_RESV_USAGE_READ); 593 594 for (i = 0; i < num_write_bo_handles; i++) 595 dma_resv_add_fence(gobj_write[i]->resv, &fence->base, 596 DMA_RESV_USAGE_WRITE); 597 598 for (i = 0; i < num_syncobj_handles; i++) { 599 if (syncobj[i].chain) { 600 drm_syncobj_add_point(syncobj[i].syncobj, syncobj[i].chain, 601 &fence->base, syncobj_points[i]); 602 syncobj[i].chain = NULL; 603 } else { 604 drm_syncobj_replace_fence(syncobj[i].syncobj, &fence->base); 605 } 606 } 607 608 exec_fini: 609 /* drop the reference acquired in fence creation function */ 610 dma_fence_put(&fence->base); 611 612 drm_exec_fini(&exec); 613 put_queue: 614 amdgpu_userq_put(queue); 615 put_gobj_write: 616 for (i = 0; i < num_write_bo_handles; i++) 617 drm_gem_object_put(gobj_write[i]); 618 kvfree(gobj_write); 619 put_gobj_read: 620 for (i = 0; i < num_read_bo_handles; i++) 621 drm_gem_object_put(gobj_read[i]); 622 kvfree(gobj_read); 623 free_syncobj: 624 while (entry-- > 0) { 625 drm_syncobj_put(syncobj[entry].syncobj); 626 dma_fence_chain_free(syncobj[entry].chain); 627 } 628 kfree(syncobj); 629 free_syncobj_points: 630 kfree(syncobj_points); 631 free_syncobj_handles: 632 kfree(syncobj_handles); 633 634 return r; 635 } 636 637 /* Count the number of expected fences so userspace can alloc a buffer */ 638 static int 639 amdgpu_userq_wait_count_fences(struct drm_file *filp, 640 struct drm_amdgpu_userq_wait *wait_info, 641 u32 *syncobj_handles, u64 *timeline_points, 642 u32 *timeline_handles, 643 struct drm_gem_object **gobj_write, 644 struct drm_gem_object **gobj_read) 645 { 646 int num_read_bo_handles, num_write_bo_handles; 647 struct dma_fence_unwrap iter; 648 struct dma_fence *fence, *f; 649 unsigned int num_fences = 0; 650 struct drm_exec exec; 651 int i, r; 652 653 /* 654 * This needs to be outside of the lock provided by drm_exec for 655 * DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT to work correctly. 656 */ 657 658 /* Count timeline fences */ 659 for (i = 0; i < wait_info->num_syncobj_timeline_handles; i++) { 660 r = drm_syncobj_find_fence(filp, timeline_handles[i], 661 timeline_points[i], 662 DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, 663 &fence); 664 if (r) 665 return r; 666 667 dma_fence_unwrap_for_each(f, &iter, fence) 668 num_fences++; 669 670 dma_fence_put(fence); 671 } 672 673 /* Count boolean fences */ 674 for (i = 0; i < wait_info->num_syncobj_handles; i++) { 675 r = drm_syncobj_find_fence(filp, syncobj_handles[i], 0, 676 DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, 677 &fence); 678 if (r) 679 return r; 680 681 num_fences++; 682 dma_fence_put(fence); 683 } 684 685 /* Lock all the GEM objects */ 686 /* TODO: It is actually not necessary to lock them */ 687 num_read_bo_handles = wait_info->num_bo_read_handles; 688 num_write_bo_handles = wait_info->num_bo_write_handles; 689 drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT | DRM_EXEC_IGNORE_DUPLICATES, 690 num_read_bo_handles + num_write_bo_handles); 691 692 drm_exec_until_all_locked(&exec) { 693 r = drm_exec_prepare_array(&exec, gobj_read, 694 num_read_bo_handles, 1); 695 drm_exec_retry_on_contention(&exec); 696 if (r) 697 goto error_unlock; 698 699 r = drm_exec_prepare_array(&exec, gobj_write, 700 num_write_bo_handles, 1); 701 drm_exec_retry_on_contention(&exec); 702 if (r) 703 goto error_unlock; 704 } 705 706 /* Count read fences */ 707 for (i = 0; i < num_read_bo_handles; i++) { 708 struct dma_resv_iter resv_cursor; 709 struct dma_fence *fence; 710 711 dma_resv_for_each_fence(&resv_cursor, gobj_read[i]->resv, 712 DMA_RESV_USAGE_READ, fence) 713 num_fences++; 714 } 715 716 /* Count write fences */ 717 for (i = 0; i < num_write_bo_handles; i++) { 718 struct dma_resv_iter resv_cursor; 719 struct dma_fence *fence; 720 721 dma_resv_for_each_fence(&resv_cursor, gobj_write[i]->resv, 722 DMA_RESV_USAGE_WRITE, fence) 723 num_fences++; 724 } 725 726 wait_info->num_fences = min(num_fences, USHRT_MAX); 727 r = 0; 728 729 error_unlock: 730 /* Unlock all the GEM objects */ 731 drm_exec_fini(&exec); 732 return r; 733 } 734 735 static int 736 amdgpu_userq_wait_add_fence(struct drm_amdgpu_userq_wait *wait_info, 737 struct dma_fence **fences, unsigned int *num_fences, 738 struct dma_fence *fence) 739 { 740 /* As fallback shouldn't userspace allocate enough space */ 741 if (*num_fences >= wait_info->num_fences) 742 return dma_fence_wait(fence, true); 743 744 fences[(*num_fences)++] = dma_fence_get(fence); 745 return 0; 746 } 747 748 static int 749 amdgpu_userq_wait_return_fence_info(struct drm_device *dev, struct drm_file *filp, 750 struct drm_amdgpu_userq_wait *wait_info, 751 u32 *syncobj_handles, u64 *timeline_points, 752 u32 *timeline_handles, 753 struct drm_gem_object **gobj_write, 754 struct drm_gem_object **gobj_read) 755 { 756 struct amdgpu_fpriv *fpriv = filp->driver_priv; 757 struct amdgpu_userq_mgr *userq_mgr = &fpriv->userq_mgr; 758 struct drm_amdgpu_userq_fence_info *fence_info; 759 int num_read_bo_handles, num_write_bo_handles; 760 struct amdgpu_usermode_queue *waitq; 761 struct dma_fence **fences, *fence, *f; 762 struct dma_fence_unwrap iter; 763 int num_points, num_syncobj; 764 unsigned int num_fences = 0; 765 struct drm_exec exec; 766 int i, cnt, r; 767 768 fence_info = kmalloc_array(wait_info->num_fences, sizeof(*fence_info), 769 GFP_KERNEL); 770 if (!fence_info) 771 return -ENOMEM; 772 773 fences = kmalloc_array(wait_info->num_fences, sizeof(*fences), 774 GFP_KERNEL); 775 if (!fences) { 776 r = -ENOMEM; 777 goto free_fence_info; 778 } 779 780 /* Retrieve timeline fences */ 781 num_points = wait_info->num_syncobj_timeline_handles; 782 for (i = 0; i < num_points; i++) { 783 r = drm_syncobj_find_fence(filp, timeline_handles[i], 784 timeline_points[i], 785 DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, 786 &fence); 787 if (r) 788 goto free_fences; 789 790 dma_fence_unwrap_for_each(f, &iter, fence) { 791 r = amdgpu_userq_wait_add_fence(wait_info, fences, 792 &num_fences, f); 793 if (r) { 794 dma_fence_put(fence); 795 goto free_fences; 796 } 797 } 798 799 dma_fence_put(fence); 800 } 801 802 /* Retrieve boolean fences */ 803 num_syncobj = wait_info->num_syncobj_handles; 804 for (i = 0; i < num_syncobj; i++) { 805 struct dma_fence *fence; 806 807 r = drm_syncobj_find_fence(filp, syncobj_handles[i], 0, 808 DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, 809 &fence); 810 if (r) 811 goto free_fences; 812 813 r = amdgpu_userq_wait_add_fence(wait_info, fences, 814 &num_fences, fence); 815 dma_fence_put(fence); 816 if (r) 817 goto free_fences; 818 819 } 820 821 /* Lock all the GEM objects */ 822 num_read_bo_handles = wait_info->num_bo_read_handles; 823 num_write_bo_handles = wait_info->num_bo_write_handles; 824 drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT | DRM_EXEC_IGNORE_DUPLICATES, 825 num_read_bo_handles + num_write_bo_handles); 826 827 drm_exec_until_all_locked(&exec) { 828 r = drm_exec_prepare_array(&exec, gobj_read, 829 num_read_bo_handles, 1); 830 drm_exec_retry_on_contention(&exec); 831 if (r) 832 goto error_unlock; 833 834 r = drm_exec_prepare_array(&exec, gobj_write, 835 num_write_bo_handles, 1); 836 drm_exec_retry_on_contention(&exec); 837 if (r) 838 goto error_unlock; 839 } 840 841 /* Retrieve GEM read objects fence */ 842 for (i = 0; i < num_read_bo_handles; i++) { 843 struct dma_resv_iter resv_cursor; 844 struct dma_fence *fence; 845 846 dma_resv_for_each_fence(&resv_cursor, gobj_read[i]->resv, 847 DMA_RESV_USAGE_READ, fence) { 848 r = amdgpu_userq_wait_add_fence(wait_info, fences, 849 &num_fences, fence); 850 if (r) 851 goto error_unlock; 852 } 853 } 854 855 /* Retrieve GEM write objects fence */ 856 for (i = 0; i < num_write_bo_handles; i++) { 857 struct dma_resv_iter resv_cursor; 858 struct dma_fence *fence; 859 860 dma_resv_for_each_fence(&resv_cursor, gobj_write[i]->resv, 861 DMA_RESV_USAGE_WRITE, fence) { 862 r = amdgpu_userq_wait_add_fence(wait_info, fences, 863 &num_fences, fence); 864 if (r) 865 goto error_unlock; 866 } 867 } 868 869 drm_exec_fini(&exec); 870 871 /* 872 * Keep only the latest fences to reduce the number of values 873 * given back to userspace. 874 */ 875 num_fences = dma_fence_dedup_array(fences, num_fences); 876 877 waitq = amdgpu_userq_get(userq_mgr, wait_info->waitq_id); 878 if (!waitq) { 879 r = -EINVAL; 880 goto free_fences; 881 } 882 883 for (i = 0, cnt = 0; i < num_fences; i++) { 884 struct amdgpu_userq_fence_driver *fence_drv; 885 struct amdgpu_userq_fence *userq_fence; 886 u32 index; 887 888 userq_fence = to_amdgpu_userq_fence(fences[i]); 889 if (!userq_fence) { 890 /* 891 * Just waiting on other driver fences should 892 * be good for now 893 */ 894 r = dma_fence_wait(fences[i], true); 895 if (r) 896 goto put_waitq; 897 898 continue; 899 } 900 901 fence_drv = userq_fence->fence_drv; 902 /* 903 * We need to make sure the user queue release their reference 904 * to the fence drivers at some point before queue destruction. 905 * Otherwise, we would gather those references until we don't 906 * have any more space left and crash. 907 */ 908 mutex_lock(&waitq->fence_drv_lock); 909 r = xa_alloc(&waitq->fence_drv_xa, &index, fence_drv, 910 xa_limit_32b, GFP_KERNEL); 911 mutex_unlock(&waitq->fence_drv_lock); 912 if (r) 913 goto put_waitq; 914 915 amdgpu_userq_fence_driver_get(fence_drv); 916 917 trace_amdgpu_userq_wait_deps(dev->dev, waitq, userq_fence); 918 919 /* Store drm syncobj's gpu va address and value */ 920 fence_info[cnt].va = fence_drv->va; 921 fence_info[cnt].value = fences[i]->seqno; 922 923 /* Increment the actual userq fence count */ 924 cnt++; 925 } 926 wait_info->num_fences = cnt; 927 928 /* Copy userq fence info to user space */ 929 if (copy_to_user(u64_to_user_ptr(wait_info->out_fences), 930 fence_info, cnt * sizeof(*fence_info))) 931 r = -EFAULT; 932 else 933 r = 0; 934 935 put_waitq: 936 amdgpu_userq_put(waitq); 937 938 free_fences: 939 while (num_fences--) 940 dma_fence_put(fences[num_fences]); 941 kfree(fences); 942 943 free_fence_info: 944 kfree(fence_info); 945 return r; 946 947 error_unlock: 948 drm_exec_fini(&exec); 949 goto free_fences; 950 } 951 952 int amdgpu_userq_wait_ioctl(struct drm_device *dev, void *data, 953 struct drm_file *filp) 954 { 955 int num_points, num_syncobj, num_read_bo_handles, num_write_bo_handles; 956 u32 *syncobj_handles, *timeline_handles; 957 u64 *timeline_points; 958 struct drm_amdgpu_userq_wait *wait_info = data; 959 struct drm_gem_object **gobj_write; 960 struct drm_gem_object **gobj_read; 961 void __user *ptr; 962 int r; 963 964 if (!amdgpu_userq_enabled(dev)) 965 return -ENOTSUPP; 966 967 if (wait_info->num_bo_write_handles > AMDGPU_USERQ_MAX_HANDLES || 968 wait_info->num_bo_read_handles > AMDGPU_USERQ_MAX_HANDLES) 969 return -EINVAL; 970 971 num_syncobj = wait_info->num_syncobj_handles; 972 ptr = u64_to_user_ptr(wait_info->syncobj_handles); 973 syncobj_handles = memdup_array_user(ptr, num_syncobj, sizeof(u32)); 974 if (IS_ERR(syncobj_handles)) 975 return PTR_ERR(syncobj_handles); 976 977 num_points = wait_info->num_syncobj_timeline_handles; 978 ptr = u64_to_user_ptr(wait_info->syncobj_timeline_handles); 979 timeline_handles = memdup_array_user(ptr, num_points, sizeof(u32)); 980 if (IS_ERR(timeline_handles)) { 981 r = PTR_ERR(timeline_handles); 982 goto free_syncobj_handles; 983 } 984 985 ptr = u64_to_user_ptr(wait_info->syncobj_timeline_points); 986 timeline_points = memdup_array_user(ptr, num_points, sizeof(u64)); 987 if (IS_ERR(timeline_points)) { 988 r = PTR_ERR(timeline_points); 989 goto free_timeline_handles; 990 } 991 992 num_read_bo_handles = wait_info->num_bo_read_handles; 993 ptr = u64_to_user_ptr(wait_info->bo_read_handles); 994 r = drm_gem_objects_lookup(filp, ptr, num_read_bo_handles, &gobj_read); 995 if (r) 996 goto free_timeline_points; 997 998 num_write_bo_handles = wait_info->num_bo_write_handles; 999 ptr = u64_to_user_ptr(wait_info->bo_write_handles); 1000 r = drm_gem_objects_lookup(filp, ptr, num_write_bo_handles, 1001 &gobj_write); 1002 if (r) 1003 goto put_gobj_read; 1004 1005 /* 1006 * Passing num_fences = 0 means that userspace doesn't want to 1007 * retrieve userq_fence_info. If num_fences = 0 we skip filling 1008 * userq_fence_info and return the actual number of fences on 1009 * args->num_fences. 1010 */ 1011 if (!wait_info->num_fences) { 1012 r = amdgpu_userq_wait_count_fences(filp, wait_info, 1013 syncobj_handles, 1014 timeline_points, 1015 timeline_handles, 1016 gobj_write, 1017 gobj_read); 1018 } else { 1019 r = amdgpu_userq_wait_return_fence_info(dev, filp, wait_info, 1020 syncobj_handles, 1021 timeline_points, 1022 timeline_handles, 1023 gobj_write, 1024 gobj_read); 1025 } 1026 1027 while (num_write_bo_handles--) 1028 drm_gem_object_put(gobj_write[num_write_bo_handles]); 1029 kvfree(gobj_write); 1030 1031 put_gobj_read: 1032 while (num_read_bo_handles--) 1033 drm_gem_object_put(gobj_read[num_read_bo_handles]); 1034 kvfree(gobj_read); 1035 1036 free_timeline_points: 1037 kfree(timeline_points); 1038 free_timeline_handles: 1039 kfree(timeline_handles); 1040 free_syncobj_handles: 1041 kfree(syncobj_handles); 1042 return r; 1043 } 1044