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 rptr; 152 153 spin_lock_irqsave(&fence_drv->fence_list_lock, flags); 154 rptr = amdgpu_userq_fence_read(fence_drv); 155 156 list_for_each_entry(userq_fence, &fence_drv->fences, link) { 157 if (rptr < 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(sizeof(*userq_fence), GFP_KERNEL); 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_array(xas.xa_index, 248 sizeof(fence_drv), 249 GFP_KERNEL); 250 if (!userq_fence->fence_drv_array) { 251 mutex_unlock(&userq->fence_drv_lock); 252 kfree(userq_fence); 253 return -ENOMEM; 254 } 255 256 userq_fence->fence_drv_array_count = xas.xa_index; 257 xa_extract(&userq->fence_drv_xa, (void **)userq_fence->fence_drv_array, 258 0, ULONG_MAX, xas.xa_index, XA_PRESENT); 259 xa_destroy(&userq->fence_drv_xa); 260 261 mutex_unlock(&userq->fence_drv_lock); 262 263 amdgpu_userq_fence_driver_get(fence_drv); 264 userq_fence->fence_drv = fence_drv; 265 266 *pfence = userq_fence; 267 return 0; 268 } 269 270 static void amdgpu_userq_fence_init(struct amdgpu_usermode_queue *userq, 271 struct amdgpu_userq_fence *fence, 272 u64 seq) 273 { 274 struct amdgpu_userq_fence_driver *fence_drv = userq->fence_drv; 275 unsigned long flags; 276 bool signaled = false; 277 278 spin_lock_init(&fence->lock); 279 dma_fence_init64(&fence->base, &amdgpu_userq_fence_ops, &fence->lock, 280 fence_drv->context, seq); 281 282 /* Make sure the fence is visible to the hang detect worker */ 283 dma_fence_put(userq->last_fence); 284 userq->last_fence = dma_fence_get(&fence->base); 285 286 /* Check if hardware has already processed the fence */ 287 spin_lock_irqsave(&fence_drv->fence_list_lock, flags); 288 if (!dma_fence_is_signaled(&fence->base)) { 289 dma_fence_get(&fence->base); 290 list_add_tail(&fence->link, &fence_drv->fences); 291 } else { 292 INIT_LIST_HEAD(&fence->link); 293 signaled = true; 294 } 295 spin_unlock_irqrestore(&fence_drv->fence_list_lock, flags); 296 297 if (signaled) 298 amdgpu_userq_fence_put_fence_drv_array(fence); 299 else 300 amdgpu_userq_start_hang_detect_work(userq); 301 } 302 303 static const char *amdgpu_userq_fence_get_driver_name(struct dma_fence *f) 304 { 305 return "amdgpu_userq_fence"; 306 } 307 308 static const char *amdgpu_userq_fence_get_timeline_name(struct dma_fence *f) 309 { 310 struct amdgpu_userq_fence *fence = to_amdgpu_userq_fence(f); 311 312 return fence->fence_drv->timeline_name; 313 } 314 315 static bool amdgpu_userq_fence_signaled(struct dma_fence *f) 316 { 317 struct amdgpu_userq_fence *fence = to_amdgpu_userq_fence(f); 318 struct amdgpu_userq_fence_driver *fence_drv = fence->fence_drv; 319 u64 rptr, wptr; 320 321 rptr = amdgpu_userq_fence_read(fence_drv); 322 wptr = fence->base.seqno; 323 324 if (rptr >= wptr) 325 return true; 326 327 return false; 328 } 329 330 static void amdgpu_userq_fence_free(struct rcu_head *rcu) 331 { 332 struct dma_fence *fence = container_of(rcu, struct dma_fence, rcu); 333 struct amdgpu_userq_fence *userq_fence = to_amdgpu_userq_fence(fence); 334 struct amdgpu_userq_fence_driver *fence_drv = userq_fence->fence_drv; 335 336 /* Release the fence driver reference */ 337 amdgpu_userq_fence_driver_put(fence_drv); 338 339 kvfree(userq_fence->fence_drv_array); 340 kfree(userq_fence); 341 } 342 343 static void amdgpu_userq_fence_release(struct dma_fence *f) 344 { 345 call_rcu(&f->rcu, amdgpu_userq_fence_free); 346 } 347 348 static const struct dma_fence_ops amdgpu_userq_fence_ops = { 349 .get_driver_name = amdgpu_userq_fence_get_driver_name, 350 .get_timeline_name = amdgpu_userq_fence_get_timeline_name, 351 .signaled = amdgpu_userq_fence_signaled, 352 .release = amdgpu_userq_fence_release, 353 }; 354 355 /** 356 * amdgpu_userq_fence_read_wptr - Read the userq wptr value 357 * 358 * @adev: amdgpu_device pointer 359 * @queue: user mode queue structure pointer 360 * @wptr: write pointer value 361 * 362 * Read the wptr value from userq's MQD. The userq signal IOCTL 363 * creates a dma_fence for the shared buffers that expects the 364 * RPTR value written to seq64 memory >= WPTR. 365 * 366 * Returns wptr value on success, error on failure. 367 */ 368 static int amdgpu_userq_fence_read_wptr(struct amdgpu_device *adev, 369 struct amdgpu_usermode_queue *queue, 370 u64 *wptr) 371 { 372 struct amdgpu_bo_va_mapping *mapping; 373 struct amdgpu_bo *bo; 374 struct drm_exec exec; 375 u64 addr, *ptr; 376 int ret; 377 378 addr = queue->userq_prop->wptr_gpu_addr; 379 addr &= AMDGPU_GMC_HOLE_MASK; 380 381 drm_exec_init(&exec, DRM_EXEC_IGNORE_DUPLICATES, 2); 382 drm_exec_until_all_locked(&exec) { 383 ret = amdgpu_vm_lock_pd(queue->vm, &exec, 1); 384 drm_exec_retry_on_contention(&exec); 385 if (unlikely(ret)) 386 goto lock_error; 387 388 mapping = amdgpu_vm_bo_lookup_mapping(queue->vm, addr >> PAGE_SHIFT); 389 if (!mapping) { 390 ret = -EINVAL; 391 goto lock_error; 392 } 393 394 ret = drm_exec_lock_obj(&exec, &mapping->bo_va->base.bo->tbo.base); 395 drm_exec_retry_on_contention(&exec); 396 if (unlikely(ret)) 397 goto lock_error; 398 } 399 400 bo = mapping->bo_va->base.bo; 401 ret = amdgpu_bo_kmap(bo, (void **)&ptr); 402 if (ret) { 403 DRM_ERROR("Failed mapping the userqueue wptr bo"); 404 goto lock_error; 405 } 406 407 *wptr = le64_to_cpu(*ptr); 408 409 amdgpu_bo_kunmap(bo); 410 drm_exec_fini(&exec); 411 return 0; 412 413 lock_error: 414 drm_exec_fini(&exec); 415 return ret; 416 } 417 418 static void 419 amdgpu_userq_fence_driver_set_error(struct amdgpu_userq_fence *fence, 420 int error) 421 { 422 struct amdgpu_userq_fence_driver *fence_drv = fence->fence_drv; 423 unsigned long flags; 424 struct dma_fence *f; 425 426 spin_lock_irqsave(&fence_drv->fence_list_lock, flags); 427 lockdep_assert_held(&fence_drv->fence_list_lock); 428 f = rcu_dereference_protected(&fence->base, 429 lockdep_is_held(&fence_drv->fence_list_lock)); 430 if (f) { 431 /* nest f->lock inside fence_list_lock */ 432 spin_lock(dma_fence_spinlock(f)); 433 if (!dma_fence_is_signaled_locked(f)) 434 dma_fence_set_error(f, error); 435 spin_unlock(dma_fence_spinlock(f)); 436 } 437 spin_unlock_irqrestore(&fence_drv->fence_list_lock, flags); 438 } 439 440 void 441 amdgpu_userq_fence_driver_force_completion(struct amdgpu_usermode_queue *userq) 442 { 443 struct dma_fence *f = userq->last_fence; 444 445 if (f) { 446 struct amdgpu_userq_fence *fence = to_amdgpu_userq_fence(f); 447 struct amdgpu_userq_fence_driver *fence_drv = fence->fence_drv; 448 u64 wptr = fence->base.seqno; 449 450 amdgpu_userq_fence_driver_set_error(fence, -ECANCELED); 451 amdgpu_userq_fence_write(fence_drv, wptr); 452 amdgpu_userq_fence_driver_process(fence_drv); 453 454 } 455 } 456 457 int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data, 458 struct drm_file *filp) 459 { 460 struct amdgpu_device *adev = drm_to_adev(dev); 461 struct drm_amdgpu_userq_signal *args = data; 462 const unsigned int num_write_bo_handles = args->num_bo_write_handles; 463 const unsigned int num_read_bo_handles = args->num_bo_read_handles; 464 struct amdgpu_fpriv *fpriv = filp->driver_priv; 465 struct amdgpu_userq_mgr *userq_mgr = &fpriv->userq_mgr; 466 467 struct drm_gem_object **gobj_write, **gobj_read; 468 u32 *syncobj_handles, num_syncobj_handles; 469 struct amdgpu_usermode_queue *queue; 470 struct amdgpu_userq_fence *fence; 471 struct drm_syncobj **syncobj; 472 struct drm_exec exec; 473 void __user *ptr; 474 int r, i, entry; 475 u64 wptr; 476 477 if (!amdgpu_userq_enabled(dev)) 478 return -ENOTSUPP; 479 480 if (args->num_bo_write_handles > AMDGPU_USERQ_MAX_HANDLES || 481 args->num_bo_read_handles > AMDGPU_USERQ_MAX_HANDLES) 482 return -EINVAL; 483 484 num_syncobj_handles = args->num_syncobj_handles; 485 ptr = u64_to_user_ptr(args->syncobj_handles); 486 syncobj_handles = memdup_array_user(ptr, num_syncobj_handles, 487 sizeof(u32)); 488 if (IS_ERR(syncobj_handles)) 489 return PTR_ERR(syncobj_handles); 490 491 syncobj = kmalloc_array(num_syncobj_handles, sizeof(*syncobj), 492 GFP_KERNEL); 493 if (!syncobj) { 494 r = -ENOMEM; 495 goto free_syncobj_handles; 496 } 497 498 for (entry = 0; entry < num_syncobj_handles; entry++) { 499 syncobj[entry] = drm_syncobj_find(filp, syncobj_handles[entry]); 500 if (!syncobj[entry]) { 501 r = -ENOENT; 502 goto free_syncobj; 503 } 504 } 505 506 ptr = u64_to_user_ptr(args->bo_read_handles); 507 r = drm_gem_objects_lookup(filp, ptr, num_read_bo_handles, &gobj_read); 508 if (r) 509 goto free_syncobj; 510 511 ptr = u64_to_user_ptr(args->bo_write_handles); 512 r = drm_gem_objects_lookup(filp, ptr, num_write_bo_handles, 513 &gobj_write); 514 if (r) 515 goto put_gobj_read; 516 517 queue = amdgpu_userq_get(userq_mgr, args->queue_id); 518 if (!queue) { 519 r = -ENOENT; 520 goto put_gobj_write; 521 } 522 523 r = amdgpu_userq_fence_read_wptr(adev, queue, &wptr); 524 if (r) 525 goto put_queue; 526 527 r = amdgpu_userq_fence_alloc(queue, &fence); 528 if (r) 529 goto put_queue; 530 531 /* We are here means UQ is active, make sure the eviction fence is valid */ 532 amdgpu_userq_ensure_ev_fence(&fpriv->userq_mgr, &fpriv->evf_mgr); 533 534 /* Create the new fence */ 535 amdgpu_userq_fence_init(queue, fence, wptr); 536 537 trace_amdgpu_userq_emit_fence(dev->dev, queue, fence); 538 539 mutex_unlock(&userq_mgr->userq_mutex); 540 541 /* 542 * This needs to come after the fence is created since 543 * amdgpu_userq_ensure_ev_fence() can't be called while holding the resv 544 * locks. 545 */ 546 drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT | DRM_EXEC_IGNORE_DUPLICATES, 547 (num_read_bo_handles + num_write_bo_handles)); 548 549 drm_exec_until_all_locked(&exec) { 550 r = drm_exec_prepare_array(&exec, gobj_read, 551 num_read_bo_handles, 1); 552 drm_exec_retry_on_contention(&exec); 553 if (r) 554 goto exec_fini; 555 556 r = drm_exec_prepare_array(&exec, gobj_write, 557 num_write_bo_handles, 1); 558 drm_exec_retry_on_contention(&exec); 559 if (r) 560 goto exec_fini; 561 } 562 563 /* And publish the new fence in the BOs and syncobj */ 564 for (i = 0; i < num_read_bo_handles; i++) 565 dma_resv_add_fence(gobj_read[i]->resv, &fence->base, 566 DMA_RESV_USAGE_READ); 567 568 for (i = 0; i < num_write_bo_handles; i++) 569 dma_resv_add_fence(gobj_write[i]->resv, &fence->base, 570 DMA_RESV_USAGE_WRITE); 571 572 for (i = 0; i < num_syncobj_handles; i++) 573 drm_syncobj_replace_fence(syncobj[i], &fence->base); 574 575 exec_fini: 576 /* drop the reference acquired in fence creation function */ 577 dma_fence_put(&fence->base); 578 579 drm_exec_fini(&exec); 580 put_queue: 581 amdgpu_userq_put(queue); 582 put_gobj_write: 583 for (i = 0; i < num_write_bo_handles; i++) 584 drm_gem_object_put(gobj_write[i]); 585 kvfree(gobj_write); 586 put_gobj_read: 587 for (i = 0; i < num_read_bo_handles; i++) 588 drm_gem_object_put(gobj_read[i]); 589 kvfree(gobj_read); 590 free_syncobj: 591 while (entry-- > 0) 592 drm_syncobj_put(syncobj[entry]); 593 kfree(syncobj); 594 free_syncobj_handles: 595 kfree(syncobj_handles); 596 597 return r; 598 } 599 600 /* Count the number of expected fences so userspace can alloc a buffer */ 601 static int 602 amdgpu_userq_wait_count_fences(struct drm_file *filp, 603 struct drm_amdgpu_userq_wait *wait_info, 604 u32 *syncobj_handles, u64 *timeline_points, 605 u32 *timeline_handles, 606 struct drm_gem_object **gobj_write, 607 struct drm_gem_object **gobj_read) 608 { 609 int num_read_bo_handles, num_write_bo_handles; 610 struct dma_fence_unwrap iter; 611 struct dma_fence *fence, *f; 612 unsigned int num_fences = 0; 613 struct drm_exec exec; 614 int i, r; 615 616 /* 617 * This needs to be outside of the lock provided by drm_exec for 618 * DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT to work correctly. 619 */ 620 621 /* Count timeline fences */ 622 for (i = 0; i < wait_info->num_syncobj_timeline_handles; i++) { 623 r = drm_syncobj_find_fence(filp, timeline_handles[i], 624 timeline_points[i], 625 DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, 626 &fence); 627 if (r) 628 return r; 629 630 dma_fence_unwrap_for_each(f, &iter, fence) 631 num_fences++; 632 633 dma_fence_put(fence); 634 } 635 636 /* Count boolean fences */ 637 for (i = 0; i < wait_info->num_syncobj_handles; i++) { 638 r = drm_syncobj_find_fence(filp, syncobj_handles[i], 0, 639 DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, 640 &fence); 641 if (r) 642 return r; 643 644 num_fences++; 645 dma_fence_put(fence); 646 } 647 648 /* Lock all the GEM objects */ 649 /* TODO: It is actually not necessary to lock them */ 650 num_read_bo_handles = wait_info->num_bo_read_handles; 651 num_write_bo_handles = wait_info->num_bo_write_handles; 652 drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT | DRM_EXEC_IGNORE_DUPLICATES, 653 num_read_bo_handles + num_write_bo_handles); 654 655 drm_exec_until_all_locked(&exec) { 656 r = drm_exec_prepare_array(&exec, gobj_read, 657 num_read_bo_handles, 1); 658 drm_exec_retry_on_contention(&exec); 659 if (r) 660 goto error_unlock; 661 662 r = drm_exec_prepare_array(&exec, gobj_write, 663 num_write_bo_handles, 1); 664 drm_exec_retry_on_contention(&exec); 665 if (r) 666 goto error_unlock; 667 } 668 669 /* Count read fences */ 670 for (i = 0; i < num_read_bo_handles; i++) { 671 struct dma_resv_iter resv_cursor; 672 struct dma_fence *fence; 673 674 dma_resv_for_each_fence(&resv_cursor, gobj_read[i]->resv, 675 DMA_RESV_USAGE_READ, fence) 676 num_fences++; 677 } 678 679 /* Count write fences */ 680 for (i = 0; i < num_write_bo_handles; i++) { 681 struct dma_resv_iter resv_cursor; 682 struct dma_fence *fence; 683 684 dma_resv_for_each_fence(&resv_cursor, gobj_write[i]->resv, 685 DMA_RESV_USAGE_WRITE, fence) 686 num_fences++; 687 } 688 689 wait_info->num_fences = min(num_fences, USHRT_MAX); 690 r = 0; 691 692 error_unlock: 693 /* Unlock all the GEM objects */ 694 drm_exec_fini(&exec); 695 return r; 696 } 697 698 static int 699 amdgpu_userq_wait_add_fence(struct drm_amdgpu_userq_wait *wait_info, 700 struct dma_fence **fences, unsigned int *num_fences, 701 struct dma_fence *fence) 702 { 703 /* As fallback shouldn't userspace allocate enough space */ 704 if (*num_fences >= wait_info->num_fences) 705 return dma_fence_wait(fence, true); 706 707 fences[(*num_fences)++] = dma_fence_get(fence); 708 return 0; 709 } 710 711 static int 712 amdgpu_userq_wait_return_fence_info(struct drm_device *dev, struct drm_file *filp, 713 struct drm_amdgpu_userq_wait *wait_info, 714 u32 *syncobj_handles, u64 *timeline_points, 715 u32 *timeline_handles, 716 struct drm_gem_object **gobj_write, 717 struct drm_gem_object **gobj_read) 718 { 719 struct amdgpu_fpriv *fpriv = filp->driver_priv; 720 struct amdgpu_userq_mgr *userq_mgr = &fpriv->userq_mgr; 721 struct drm_amdgpu_userq_fence_info *fence_info; 722 int num_read_bo_handles, num_write_bo_handles; 723 struct amdgpu_usermode_queue *waitq; 724 struct dma_fence **fences, *fence, *f; 725 struct dma_fence_unwrap iter; 726 int num_points, num_syncobj; 727 unsigned int num_fences = 0; 728 struct drm_exec exec; 729 int i, cnt, r; 730 731 fence_info = kmalloc_array(wait_info->num_fences, sizeof(*fence_info), 732 GFP_KERNEL); 733 if (!fence_info) 734 return -ENOMEM; 735 736 fences = kmalloc_array(wait_info->num_fences, sizeof(*fences), 737 GFP_KERNEL); 738 if (!fences) { 739 r = -ENOMEM; 740 goto free_fence_info; 741 } 742 743 /* Retrieve timeline fences */ 744 num_points = wait_info->num_syncobj_timeline_handles; 745 for (i = 0; i < num_points; i++) { 746 r = drm_syncobj_find_fence(filp, timeline_handles[i], 747 timeline_points[i], 748 DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, 749 &fence); 750 if (r) 751 goto free_fences; 752 753 dma_fence_unwrap_for_each(f, &iter, fence) { 754 r = amdgpu_userq_wait_add_fence(wait_info, fences, 755 &num_fences, f); 756 if (r) { 757 dma_fence_put(fence); 758 goto free_fences; 759 } 760 } 761 762 dma_fence_put(fence); 763 } 764 765 /* Retrieve boolean fences */ 766 num_syncobj = wait_info->num_syncobj_handles; 767 for (i = 0; i < num_syncobj; i++) { 768 struct dma_fence *fence; 769 770 r = drm_syncobj_find_fence(filp, syncobj_handles[i], 0, 771 DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, 772 &fence); 773 if (r) 774 goto free_fences; 775 776 r = amdgpu_userq_wait_add_fence(wait_info, fences, 777 &num_fences, fence); 778 dma_fence_put(fence); 779 if (r) 780 goto free_fences; 781 782 } 783 784 /* Lock all the GEM objects */ 785 num_read_bo_handles = wait_info->num_bo_read_handles; 786 num_write_bo_handles = wait_info->num_bo_write_handles; 787 drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT | DRM_EXEC_IGNORE_DUPLICATES, 788 num_read_bo_handles + num_write_bo_handles); 789 790 drm_exec_until_all_locked(&exec) { 791 r = drm_exec_prepare_array(&exec, gobj_read, 792 num_read_bo_handles, 1); 793 drm_exec_retry_on_contention(&exec); 794 if (r) 795 goto error_unlock; 796 797 r = drm_exec_prepare_array(&exec, gobj_write, 798 num_write_bo_handles, 1); 799 drm_exec_retry_on_contention(&exec); 800 if (r) 801 goto error_unlock; 802 } 803 804 /* Retrieve GEM read objects fence */ 805 for (i = 0; i < num_read_bo_handles; i++) { 806 struct dma_resv_iter resv_cursor; 807 struct dma_fence *fence; 808 809 dma_resv_for_each_fence(&resv_cursor, gobj_read[i]->resv, 810 DMA_RESV_USAGE_READ, fence) { 811 r = amdgpu_userq_wait_add_fence(wait_info, fences, 812 &num_fences, fence); 813 if (r) 814 goto error_unlock; 815 } 816 } 817 818 /* Retrieve GEM write objects fence */ 819 for (i = 0; i < num_write_bo_handles; i++) { 820 struct dma_resv_iter resv_cursor; 821 struct dma_fence *fence; 822 823 dma_resv_for_each_fence(&resv_cursor, gobj_write[i]->resv, 824 DMA_RESV_USAGE_WRITE, fence) { 825 r = amdgpu_userq_wait_add_fence(wait_info, fences, 826 &num_fences, fence); 827 if (r) 828 goto error_unlock; 829 } 830 } 831 832 drm_exec_fini(&exec); 833 834 /* 835 * Keep only the latest fences to reduce the number of values 836 * given back to userspace. 837 */ 838 num_fences = dma_fence_dedup_array(fences, num_fences); 839 840 waitq = amdgpu_userq_get(userq_mgr, wait_info->waitq_id); 841 if (!waitq) { 842 r = -EINVAL; 843 goto free_fences; 844 } 845 846 for (i = 0, cnt = 0; i < num_fences; i++) { 847 struct amdgpu_userq_fence_driver *fence_drv; 848 struct amdgpu_userq_fence *userq_fence; 849 u32 index; 850 851 userq_fence = to_amdgpu_userq_fence(fences[i]); 852 if (!userq_fence) { 853 /* 854 * Just waiting on other driver fences should 855 * be good for now 856 */ 857 r = dma_fence_wait(fences[i], true); 858 if (r) 859 goto put_waitq; 860 861 continue; 862 } 863 864 fence_drv = userq_fence->fence_drv; 865 /* 866 * We need to make sure the user queue release their reference 867 * to the fence drivers at some point before queue destruction. 868 * Otherwise, we would gather those references until we don't 869 * have any more space left and crash. 870 */ 871 mutex_lock(&waitq->fence_drv_lock); 872 r = xa_alloc(&waitq->fence_drv_xa, &index, fence_drv, 873 xa_limit_32b, GFP_KERNEL); 874 mutex_unlock(&waitq->fence_drv_lock); 875 if (r) 876 goto put_waitq; 877 878 amdgpu_userq_fence_driver_get(fence_drv); 879 880 trace_amdgpu_userq_wait_deps(dev->dev, waitq, userq_fence); 881 882 /* Store drm syncobj's gpu va address and value */ 883 fence_info[cnt].va = fence_drv->va; 884 fence_info[cnt].value = fences[i]->seqno; 885 886 /* Increment the actual userq fence count */ 887 cnt++; 888 } 889 wait_info->num_fences = cnt; 890 891 /* Copy userq fence info to user space */ 892 if (copy_to_user(u64_to_user_ptr(wait_info->out_fences), 893 fence_info, cnt * sizeof(*fence_info))) 894 r = -EFAULT; 895 else 896 r = 0; 897 898 put_waitq: 899 amdgpu_userq_put(waitq); 900 901 free_fences: 902 while (num_fences--) 903 dma_fence_put(fences[num_fences]); 904 kfree(fences); 905 906 free_fence_info: 907 kfree(fence_info); 908 return r; 909 910 error_unlock: 911 drm_exec_fini(&exec); 912 goto free_fences; 913 } 914 915 int amdgpu_userq_wait_ioctl(struct drm_device *dev, void *data, 916 struct drm_file *filp) 917 { 918 int num_points, num_syncobj, num_read_bo_handles, num_write_bo_handles; 919 u32 *syncobj_handles, *timeline_handles; 920 u64 *timeline_points; 921 struct drm_amdgpu_userq_wait *wait_info = data; 922 struct drm_gem_object **gobj_write; 923 struct drm_gem_object **gobj_read; 924 void __user *ptr; 925 int r; 926 927 if (!amdgpu_userq_enabled(dev)) 928 return -ENOTSUPP; 929 930 if (wait_info->num_bo_write_handles > AMDGPU_USERQ_MAX_HANDLES || 931 wait_info->num_bo_read_handles > AMDGPU_USERQ_MAX_HANDLES) 932 return -EINVAL; 933 934 num_syncobj = wait_info->num_syncobj_handles; 935 ptr = u64_to_user_ptr(wait_info->syncobj_handles); 936 syncobj_handles = memdup_array_user(ptr, num_syncobj, sizeof(u32)); 937 if (IS_ERR(syncobj_handles)) 938 return PTR_ERR(syncobj_handles); 939 940 num_points = wait_info->num_syncobj_timeline_handles; 941 ptr = u64_to_user_ptr(wait_info->syncobj_timeline_handles); 942 timeline_handles = memdup_array_user(ptr, num_points, sizeof(u32)); 943 if (IS_ERR(timeline_handles)) { 944 r = PTR_ERR(timeline_handles); 945 goto free_syncobj_handles; 946 } 947 948 ptr = u64_to_user_ptr(wait_info->syncobj_timeline_points); 949 timeline_points = memdup_array_user(ptr, num_points, sizeof(u64)); 950 if (IS_ERR(timeline_points)) { 951 r = PTR_ERR(timeline_points); 952 goto free_timeline_handles; 953 } 954 955 num_read_bo_handles = wait_info->num_bo_read_handles; 956 ptr = u64_to_user_ptr(wait_info->bo_read_handles); 957 r = drm_gem_objects_lookup(filp, ptr, num_read_bo_handles, &gobj_read); 958 if (r) 959 goto free_timeline_points; 960 961 num_write_bo_handles = wait_info->num_bo_write_handles; 962 ptr = u64_to_user_ptr(wait_info->bo_write_handles); 963 r = drm_gem_objects_lookup(filp, ptr, num_write_bo_handles, 964 &gobj_write); 965 if (r) 966 goto put_gobj_read; 967 968 /* 969 * Passing num_fences = 0 means that userspace doesn't want to 970 * retrieve userq_fence_info. If num_fences = 0 we skip filling 971 * userq_fence_info and return the actual number of fences on 972 * args->num_fences. 973 */ 974 if (!wait_info->num_fences) { 975 r = amdgpu_userq_wait_count_fences(filp, wait_info, 976 syncobj_handles, 977 timeline_points, 978 timeline_handles, 979 gobj_write, 980 gobj_read); 981 } else { 982 r = amdgpu_userq_wait_return_fence_info(dev, filp, wait_info, 983 syncobj_handles, 984 timeline_points, 985 timeline_handles, 986 gobj_write, 987 gobj_read); 988 } 989 990 while (num_write_bo_handles--) 991 drm_gem_object_put(gobj_write[num_write_bo_handles]); 992 kvfree(gobj_write); 993 994 put_gobj_read: 995 while (num_read_bo_handles--) 996 drm_gem_object_put(gobj_read[num_read_bo_handles]); 997 kvfree(gobj_read); 998 999 free_timeline_points: 1000 kfree(timeline_points); 1001 free_timeline_handles: 1002 kfree(timeline_handles); 1003 free_syncobj_handles: 1004 kfree(syncobj_handles); 1005 return r; 1006 } 1007