1 /* $NetBSD: linux_dma_fence.c,v 1.39 2021/12/19 12:39:40 riastradh Exp $ */ 2 3 /*- 4 * Copyright (c) 2018 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Taylor R. Campbell. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #include <sys/cdefs.h> 33 __KERNEL_RCSID(0, "$NetBSD: linux_dma_fence.c,v 1.39 2021/12/19 12:39:40 riastradh Exp $"); 34 35 #include <sys/atomic.h> 36 #include <sys/condvar.h> 37 #include <sys/lock.h> 38 #include <sys/queue.h> 39 #include <sys/sdt.h> 40 41 #include <linux/atomic.h> 42 #include <linux/dma-fence.h> 43 #include <linux/errno.h> 44 #include <linux/kref.h> 45 #include <linux/sched.h> 46 #include <linux/spinlock.h> 47 48 #define FENCE_MAGIC_GOOD 0x607ba424048c37e5ULL 49 #define FENCE_MAGIC_BAD 0x7641ca721344505fULL 50 51 SDT_PROBE_DEFINE1(sdt, drm, fence, init, 52 "struct dma_fence *"/*fence*/); 53 SDT_PROBE_DEFINE1(sdt, drm, fence, reset, 54 "struct dma_fence *"/*fence*/); 55 SDT_PROBE_DEFINE1(sdt, drm, fence, release, 56 "struct dma_fence *"/*fence*/); 57 SDT_PROBE_DEFINE1(sdt, drm, fence, free, 58 "struct dma_fence *"/*fence*/); 59 SDT_PROBE_DEFINE1(sdt, drm, fence, destroy, 60 "struct dma_fence *"/*fence*/); 61 62 SDT_PROBE_DEFINE1(sdt, drm, fence, enable_signaling, 63 "struct dma_fence *"/*fence*/); 64 SDT_PROBE_DEFINE2(sdt, drm, fence, add_callback, 65 "struct dma_fence *"/*fence*/, 66 "struct dma_fence_callback *"/*callback*/); 67 SDT_PROBE_DEFINE2(sdt, drm, fence, remove_callback, 68 "struct dma_fence *"/*fence*/, 69 "struct dma_fence_callback *"/*callback*/); 70 SDT_PROBE_DEFINE2(sdt, drm, fence, callback, 71 "struct dma_fence *"/*fence*/, 72 "struct dma_fence_callback *"/*callback*/); 73 SDT_PROBE_DEFINE1(sdt, drm, fence, test, 74 "struct dma_fence *"/*fence*/); 75 SDT_PROBE_DEFINE2(sdt, drm, fence, set_error, 76 "struct dma_fence *"/*fence*/, 77 "int"/*error*/); 78 SDT_PROBE_DEFINE1(sdt, drm, fence, signal, 79 "struct dma_fence *"/*fence*/); 80 81 SDT_PROBE_DEFINE3(sdt, drm, fence, wait_start, 82 "struct dma_fence *"/*fence*/, 83 "bool"/*intr*/, 84 "long"/*timeout*/); 85 SDT_PROBE_DEFINE2(sdt, drm, fence, wait_done, 86 "struct dma_fence *"/*fence*/, 87 "long"/*ret*/); 88 89 /* 90 * linux_dma_fence_trace 91 * 92 * True if we print DMA_FENCE_TRACE messages, false if not. These 93 * are extremely noisy, too much even for AB_VERBOSE and AB_DEBUG 94 * in boothowto. 95 */ 96 int linux_dma_fence_trace = 0; 97 98 /* 99 * dma_fence_referenced_p(fence) 100 * 101 * True if fence has a positive reference count. True after 102 * dma_fence_init; after the last dma_fence_put, this becomes 103 * false. The fence must have been initialized and must not have 104 * been destroyed. 105 */ 106 static inline bool __diagused 107 dma_fence_referenced_p(struct dma_fence *fence) 108 { 109 110 KASSERTMSG(fence->f_magic != FENCE_MAGIC_BAD, "fence %p", fence); 111 KASSERTMSG(fence->f_magic == FENCE_MAGIC_GOOD, "fence %p", fence); 112 113 return kref_referenced_p(&fence->refcount); 114 } 115 116 /* 117 * dma_fence_init(fence, ops, lock, context, seqno) 118 * 119 * Initialize fence. Caller should call dma_fence_destroy when 120 * done, after all references have been released. 121 */ 122 void 123 dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops, 124 spinlock_t *lock, uint64_t context, uint64_t seqno) 125 { 126 127 kref_init(&fence->refcount); 128 fence->lock = lock; 129 fence->flags = 0; 130 fence->context = context; 131 fence->seqno = seqno; 132 fence->ops = ops; 133 fence->error = 0; 134 TAILQ_INIT(&fence->f_callbacks); 135 cv_init(&fence->f_cv, "dmafence"); 136 137 #ifdef DIAGNOSTIC 138 fence->f_magic = FENCE_MAGIC_GOOD; 139 #endif 140 141 SDT_PROBE1(sdt, drm, fence, init, fence); 142 } 143 144 /* 145 * dma_fence_reset(fence) 146 * 147 * Ensure fence is in a quiescent state. Allowed either for newly 148 * initialized or freed fences, but not fences with more than one 149 * reference. 150 * 151 * XXX extension to Linux API 152 */ 153 void 154 dma_fence_reset(struct dma_fence *fence, const struct dma_fence_ops *ops, 155 spinlock_t *lock, uint64_t context, uint64_t seqno) 156 { 157 158 KASSERTMSG(fence->f_magic != FENCE_MAGIC_BAD, "fence %p", fence); 159 KASSERTMSG(fence->f_magic == FENCE_MAGIC_GOOD, "fence %p", fence); 160 KASSERT(kref_read(&fence->refcount) == 0 || 161 kref_read(&fence->refcount) == 1); 162 KASSERT(TAILQ_EMPTY(&fence->f_callbacks)); 163 KASSERT(fence->lock == lock); 164 KASSERT(fence->ops == ops); 165 166 kref_init(&fence->refcount); 167 fence->flags = 0; 168 fence->context = context; 169 fence->seqno = seqno; 170 fence->error = 0; 171 172 SDT_PROBE1(sdt, drm, fence, reset, fence); 173 } 174 175 /* 176 * dma_fence_destroy(fence) 177 * 178 * Clean up memory initialized with dma_fence_init. This is meant 179 * to be used after a fence release callback. 180 * 181 * XXX extension to Linux API 182 */ 183 void 184 dma_fence_destroy(struct dma_fence *fence) 185 { 186 187 KASSERT(!dma_fence_referenced_p(fence)); 188 189 SDT_PROBE1(sdt, drm, fence, destroy, fence); 190 191 #ifdef DIAGNOSTIC 192 fence->f_magic = FENCE_MAGIC_BAD; 193 #endif 194 195 KASSERT(TAILQ_EMPTY(&fence->f_callbacks)); 196 cv_destroy(&fence->f_cv); 197 } 198 199 static void 200 dma_fence_free_cb(struct rcu_head *rcu) 201 { 202 struct dma_fence *fence = container_of(rcu, struct dma_fence, rcu); 203 204 KASSERT(!dma_fence_referenced_p(fence)); 205 206 dma_fence_destroy(fence); 207 kfree(fence); 208 } 209 210 /* 211 * dma_fence_free(fence) 212 * 213 * Schedule fence to be destroyed and then freed with kfree after 214 * any pending RCU read sections on all CPUs have completed. 215 * Caller must guarantee all references have been released. This 216 * is meant to be used after a fence release callback. 217 * 218 * NOTE: Callers assume kfree will be used. We don't even use 219 * kmalloc to allocate these -- caller is expected to allocate 220 * memory with kmalloc to be initialized with dma_fence_init. 221 */ 222 void 223 dma_fence_free(struct dma_fence *fence) 224 { 225 226 KASSERT(!dma_fence_referenced_p(fence)); 227 228 SDT_PROBE1(sdt, drm, fence, free, fence); 229 230 call_rcu(&fence->rcu, &dma_fence_free_cb); 231 } 232 233 /* 234 * dma_fence_context_alloc(n) 235 * 236 * Return the first of a contiguous sequence of unique 237 * identifiers, at least until the system wraps around. 238 */ 239 uint64_t 240 dma_fence_context_alloc(unsigned n) 241 { 242 static struct { 243 volatile unsigned lock; 244 uint64_t context; 245 } S; 246 uint64_t c; 247 248 while (__predict_false(atomic_cas_uint(&S.lock, 0, 1) != 0)) 249 SPINLOCK_BACKOFF_HOOK; 250 membar_enter(); 251 c = S.context; 252 S.context += n; 253 atomic_store_release(&S.lock, 0); 254 255 return c; 256 } 257 258 /* 259 * __dma_fence_is_later(a, b, ops) 260 * 261 * True if sequence number a is later than sequence number b, 262 * according to the given fence ops. 263 * 264 * - For fence ops with 64-bit sequence numbers, this is simply 265 * defined to be a > b as unsigned 64-bit integers. 266 * 267 * - For fence ops with 32-bit sequence numbers, this is defined 268 * to mean that the 32-bit unsigned difference a - b is less 269 * than INT_MAX. 270 */ 271 bool 272 __dma_fence_is_later(uint64_t a, uint64_t b, const struct dma_fence_ops *ops) 273 { 274 275 if (ops->use_64bit_seqno) 276 return a > b; 277 else 278 return (unsigned)a - (unsigned)b < INT_MAX; 279 } 280 281 /* 282 * dma_fence_is_later(a, b) 283 * 284 * True if the sequence number of fence a is later than the 285 * sequence number of fence b. Since sequence numbers wrap 286 * around, we define this to mean that the sequence number of 287 * fence a is no more than INT_MAX past the sequence number of 288 * fence b. 289 * 290 * The two fences must have the context. Whether sequence numbers 291 * are 32-bit is determined by a. 292 */ 293 bool 294 dma_fence_is_later(struct dma_fence *a, struct dma_fence *b) 295 { 296 297 KASSERTMSG(a->f_magic != FENCE_MAGIC_BAD, "fence %p", a); 298 KASSERTMSG(a->f_magic == FENCE_MAGIC_GOOD, "fence %p", a); 299 KASSERTMSG(b->f_magic != FENCE_MAGIC_BAD, "fence %p", b); 300 KASSERTMSG(b->f_magic == FENCE_MAGIC_GOOD, "fence %p", b); 301 KASSERTMSG(a->context == b->context, "incommensurate fences" 302 ": %"PRIu64" @ %p =/= %"PRIu64" @ %p", 303 a->context, a, b->context, b); 304 305 return __dma_fence_is_later(a->seqno, b->seqno, a->ops); 306 } 307 308 static const char *dma_fence_stub_name(struct dma_fence *f) 309 { 310 311 return "stub"; 312 } 313 314 static const struct dma_fence_ops dma_fence_stub_ops = { 315 .get_driver_name = dma_fence_stub_name, 316 .get_timeline_name = dma_fence_stub_name, 317 }; 318 319 /* 320 * dma_fence_get_stub() 321 * 322 * Return a dma fence that is always already signalled. 323 */ 324 struct dma_fence * 325 dma_fence_get_stub(void) 326 { 327 /* 328 * XXX This probably isn't good enough -- caller may try 329 * operations on this that require the lock, which will 330 * require us to create and destroy the lock on module 331 * load/unload. 332 */ 333 static struct dma_fence fence = { 334 .refcount = {1}, /* always referenced */ 335 .flags = 1u << DMA_FENCE_FLAG_SIGNALED_BIT, 336 .ops = &dma_fence_stub_ops, 337 #ifdef DIAGNOSTIC 338 .f_magic = FENCE_MAGIC_GOOD, 339 #endif 340 }; 341 342 return dma_fence_get(&fence); 343 } 344 345 /* 346 * dma_fence_get(fence) 347 * 348 * Acquire a reference to fence and return it, or return NULL if 349 * fence is NULL. The fence, if nonnull, must not be being 350 * destroyed. 351 */ 352 struct dma_fence * 353 dma_fence_get(struct dma_fence *fence) 354 { 355 356 if (fence == NULL) 357 return NULL; 358 359 KASSERTMSG(fence->f_magic != FENCE_MAGIC_BAD, "fence %p", fence); 360 KASSERTMSG(fence->f_magic == FENCE_MAGIC_GOOD, "fence %p", fence); 361 362 kref_get(&fence->refcount); 363 return fence; 364 } 365 366 /* 367 * dma_fence_get_rcu(fence) 368 * 369 * Attempt to acquire a reference to a fence that may be about to 370 * be destroyed, during a read section. Return the fence on 371 * success, or NULL on failure. The fence must be nonnull. 372 */ 373 struct dma_fence * 374 dma_fence_get_rcu(struct dma_fence *fence) 375 { 376 377 __insn_barrier(); 378 KASSERTMSG(fence->f_magic != FENCE_MAGIC_BAD, "fence %p", fence); 379 KASSERTMSG(fence->f_magic == FENCE_MAGIC_GOOD, "fence %p", fence); 380 if (!kref_get_unless_zero(&fence->refcount)) 381 return NULL; 382 return fence; 383 } 384 385 /* 386 * dma_fence_get_rcu_safe(fencep) 387 * 388 * Attempt to acquire a reference to the fence *fencep, which may 389 * be about to be destroyed, during a read section. If the value 390 * of *fencep changes after we read *fencep but before we 391 * increment its reference count, retry. Return *fencep on 392 * success, or NULL on failure. 393 */ 394 struct dma_fence * 395 dma_fence_get_rcu_safe(struct dma_fence *volatile const *fencep) 396 { 397 struct dma_fence *fence; 398 399 retry: 400 /* 401 * Load the fence, ensuring we observe the fully initialized 402 * content. 403 */ 404 if ((fence = atomic_load_consume(fencep)) == NULL) 405 return NULL; 406 407 /* Try to acquire a reference. If we can't, try again. */ 408 if (!dma_fence_get_rcu(fence)) 409 goto retry; 410 411 /* 412 * Confirm that it's still the same fence. If not, release it 413 * and retry. 414 */ 415 if (fence != atomic_load_relaxed(fencep)) { 416 dma_fence_put(fence); 417 goto retry; 418 } 419 420 /* Success! */ 421 KASSERT(dma_fence_referenced_p(fence)); 422 return fence; 423 } 424 425 static void 426 dma_fence_release(struct kref *refcount) 427 { 428 struct dma_fence *fence = container_of(refcount, struct dma_fence, 429 refcount); 430 431 KASSERTMSG(TAILQ_EMPTY(&fence->f_callbacks), 432 "fence %p has pending callbacks", fence); 433 KASSERT(!dma_fence_referenced_p(fence)); 434 435 SDT_PROBE1(sdt, drm, fence, release, fence); 436 437 if (fence->ops->release) 438 (*fence->ops->release)(fence); 439 else 440 dma_fence_free(fence); 441 } 442 443 /* 444 * dma_fence_put(fence) 445 * 446 * Release a reference to fence. If this was the last one, call 447 * the fence's release callback. 448 */ 449 void 450 dma_fence_put(struct dma_fence *fence) 451 { 452 453 if (fence == NULL) 454 return; 455 KASSERT(dma_fence_referenced_p(fence)); 456 kref_put(&fence->refcount, &dma_fence_release); 457 } 458 459 /* 460 * dma_fence_ensure_signal_enabled(fence) 461 * 462 * Internal subroutine. If the fence was already signalled, 463 * return -ENOENT. Otherwise, if the enable signalling callback 464 * has not been called yet, call it. If fails, signal the fence 465 * and return -ENOENT. If it succeeds, or if it had already been 466 * called, return zero to indicate success. 467 * 468 * Caller must hold the fence's lock. 469 */ 470 static int 471 dma_fence_ensure_signal_enabled(struct dma_fence *fence) 472 { 473 bool already_enabled; 474 475 KASSERT(dma_fence_referenced_p(fence)); 476 KASSERT(spin_is_locked(fence->lock)); 477 478 /* Determine whether signalling was enabled, and enable it. */ 479 already_enabled = test_and_set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, 480 &fence->flags); 481 482 /* If the fence was already signalled, fail with -ENOENT. */ 483 if (fence->flags & (1u << DMA_FENCE_FLAG_SIGNALED_BIT)) 484 return -ENOENT; 485 486 /* 487 * Otherwise, if it wasn't enabled yet, try to enable 488 * signalling. 489 */ 490 if (!already_enabled && fence->ops->enable_signaling) { 491 SDT_PROBE1(sdt, drm, fence, enable_signaling, fence); 492 if (!(*fence->ops->enable_signaling)(fence)) { 493 /* If it failed, signal and return -ENOENT. */ 494 dma_fence_signal_locked(fence); 495 return -ENOENT; 496 } 497 } 498 499 /* Success! */ 500 return 0; 501 } 502 503 /* 504 * dma_fence_add_callback(fence, fcb, fn) 505 * 506 * If fence has been signalled, return -ENOENT. If the enable 507 * signalling callback hasn't been called yet, call it; if it 508 * fails, return -ENOENT. Otherwise, arrange to call fn(fence, 509 * fcb) when it is signalled, and return 0. 510 * 511 * The fence uses memory allocated by the caller in fcb from the 512 * time of dma_fence_add_callback either to the time of 513 * dma_fence_remove_callback, or just before calling fn. 514 */ 515 int 516 dma_fence_add_callback(struct dma_fence *fence, struct dma_fence_cb *fcb, 517 dma_fence_func_t fn) 518 { 519 int ret; 520 521 KASSERT(dma_fence_referenced_p(fence)); 522 523 /* Optimistically try to skip the lock if it's already signalled. */ 524 if (atomic_load_relaxed(&fence->flags) & 525 (1u << DMA_FENCE_FLAG_SIGNALED_BIT)) { 526 ret = -ENOENT; 527 goto out0; 528 } 529 530 /* Acquire the lock. */ 531 spin_lock(fence->lock); 532 533 /* Ensure signalling is enabled, or fail if we can't. */ 534 ret = dma_fence_ensure_signal_enabled(fence); 535 if (ret) 536 goto out1; 537 538 /* Insert the callback. */ 539 SDT_PROBE2(sdt, drm, fence, add_callback, fence, fcb); 540 fcb->func = fn; 541 TAILQ_INSERT_TAIL(&fence->f_callbacks, fcb, fcb_entry); 542 fcb->fcb_onqueue = true; 543 ret = 0; 544 545 /* Release the lock and we're done. */ 546 out1: spin_unlock(fence->lock); 547 out0: if (ret) { 548 fcb->func = NULL; 549 fcb->fcb_onqueue = false; 550 } 551 return ret; 552 } 553 554 /* 555 * dma_fence_remove_callback(fence, fcb) 556 * 557 * Remove the callback fcb from fence. Return true if it was 558 * removed from the list, or false if it had already run and so 559 * was no longer queued anyway. Caller must have already called 560 * dma_fence_add_callback(fence, fcb). 561 */ 562 bool 563 dma_fence_remove_callback(struct dma_fence *fence, struct dma_fence_cb *fcb) 564 { 565 bool onqueue; 566 567 KASSERT(dma_fence_referenced_p(fence)); 568 569 spin_lock(fence->lock); 570 onqueue = fcb->fcb_onqueue; 571 if (onqueue) { 572 SDT_PROBE2(sdt, drm, fence, remove_callback, fence, fcb); 573 TAILQ_REMOVE(&fence->f_callbacks, fcb, fcb_entry); 574 fcb->fcb_onqueue = false; 575 } 576 spin_unlock(fence->lock); 577 578 return onqueue; 579 } 580 581 /* 582 * dma_fence_enable_sw_signaling(fence) 583 * 584 * If it hasn't been called yet and the fence hasn't been 585 * signalled yet, call the fence's enable_sw_signaling callback. 586 * If when that happens, the callback indicates failure by 587 * returning false, signal the fence. 588 */ 589 void 590 dma_fence_enable_sw_signaling(struct dma_fence *fence) 591 { 592 593 KASSERT(dma_fence_referenced_p(fence)); 594 595 spin_lock(fence->lock); 596 if ((fence->flags & (1u << DMA_FENCE_FLAG_SIGNALED_BIT)) == 0) 597 (void)dma_fence_ensure_signal_enabled(fence); 598 spin_unlock(fence->lock); 599 } 600 601 /* 602 * dma_fence_is_signaled(fence) 603 * 604 * Test whether the fence has been signalled. If it has been 605 * signalled by dma_fence_signal(_locked), return true. If the 606 * signalled callback returns true indicating that some implicit 607 * external condition has changed, call the callbacks as if with 608 * dma_fence_signal. 609 */ 610 bool 611 dma_fence_is_signaled(struct dma_fence *fence) 612 { 613 bool signaled; 614 615 KASSERT(dma_fence_referenced_p(fence)); 616 617 spin_lock(fence->lock); 618 signaled = dma_fence_is_signaled_locked(fence); 619 spin_unlock(fence->lock); 620 621 return signaled; 622 } 623 624 /* 625 * dma_fence_is_signaled_locked(fence) 626 * 627 * Test whether the fence has been signalled. Like 628 * dma_fence_is_signaleed, but caller already holds the fence's lock. 629 */ 630 bool 631 dma_fence_is_signaled_locked(struct dma_fence *fence) 632 { 633 634 KASSERT(dma_fence_referenced_p(fence)); 635 KASSERT(spin_is_locked(fence->lock)); 636 637 /* Check whether we already set the signalled bit. */ 638 if (fence->flags & (1u << DMA_FENCE_FLAG_SIGNALED_BIT)) 639 return true; 640 641 /* If there's a signalled callback, test it. */ 642 if (fence->ops->signaled) { 643 SDT_PROBE1(sdt, drm, fence, test, fence); 644 if ((*fence->ops->signaled)(fence)) { 645 /* 646 * It's been signalled implicitly by some 647 * external phenomonen. Act as though someone 648 * has called dma_fence_signal. 649 */ 650 dma_fence_signal_locked(fence); 651 return true; 652 } 653 } 654 655 return false; 656 } 657 658 /* 659 * dma_fence_set_error(fence, error) 660 * 661 * Set an error code prior to dma_fence_signal for use by a 662 * waiter to learn about success or failure of the fence. 663 */ 664 void 665 dma_fence_set_error(struct dma_fence *fence, int error) 666 { 667 668 KASSERTMSG(fence->f_magic != FENCE_MAGIC_BAD, "fence %p", fence); 669 KASSERTMSG(fence->f_magic == FENCE_MAGIC_GOOD, "fence %p", fence); 670 KASSERT((atomic_load_relaxed(&fence->flags) & 671 (1u << DMA_FENCE_FLAG_SIGNALED_BIT)) == 0); 672 KASSERTMSG(error >= -ELAST, "%d", error); 673 KASSERTMSG(error < 0, "%d", error); 674 675 SDT_PROBE2(sdt, drm, fence, set_error, fence, error); 676 fence->error = error; 677 } 678 679 /* 680 * dma_fence_get_status(fence) 681 * 682 * Return 0 if fence has yet to be signalled, 1 if it has been 683 * signalled without error, or negative error code if 684 * dma_fence_set_error was used. 685 */ 686 int 687 dma_fence_get_status(struct dma_fence *fence) 688 { 689 int ret; 690 691 KASSERTMSG(fence->f_magic != FENCE_MAGIC_BAD, "fence %p", fence); 692 KASSERTMSG(fence->f_magic == FENCE_MAGIC_GOOD, "fence %p", fence); 693 694 spin_lock(fence->lock); 695 if (!dma_fence_is_signaled_locked(fence)) { 696 ret = 0; 697 } else if (fence->error) { 698 ret = fence->error; 699 KASSERTMSG(ret < 0, "%d", ret); 700 } else { 701 ret = 1; 702 } 703 spin_unlock(fence->lock); 704 705 return ret; 706 } 707 708 /* 709 * dma_fence_signal(fence) 710 * 711 * Signal the fence. If it has already been signalled, return 712 * -EINVAL. If it has not been signalled, call the enable 713 * signalling callback if it hasn't been called yet, and remove 714 * each registered callback from the queue and call it; then 715 * return 0. 716 */ 717 int 718 dma_fence_signal(struct dma_fence *fence) 719 { 720 int ret; 721 722 KASSERT(dma_fence_referenced_p(fence)); 723 724 spin_lock(fence->lock); 725 ret = dma_fence_signal_locked(fence); 726 spin_unlock(fence->lock); 727 728 return ret; 729 } 730 731 /* 732 * dma_fence_signal_locked(fence) 733 * 734 * Signal the fence. Like dma_fence_signal, but caller already 735 * holds the fence's lock. 736 */ 737 int 738 dma_fence_signal_locked(struct dma_fence *fence) 739 { 740 struct dma_fence_cb *fcb, *next; 741 742 KASSERT(dma_fence_referenced_p(fence)); 743 KASSERT(spin_is_locked(fence->lock)); 744 745 /* If it's been signalled, fail; otherwise set the signalled bit. */ 746 if (test_and_set_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) 747 return -EINVAL; 748 749 SDT_PROBE1(sdt, drm, fence, signal, fence); 750 751 /* Set the timestamp. */ 752 fence->timestamp = ktime_get(); 753 set_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags); 754 755 /* Wake waiters. */ 756 cv_broadcast(&fence->f_cv); 757 758 /* Remove and call the callbacks. */ 759 TAILQ_FOREACH_SAFE(fcb, &fence->f_callbacks, fcb_entry, next) { 760 SDT_PROBE2(sdt, drm, fence, callback, fence, fcb); 761 TAILQ_REMOVE(&fence->f_callbacks, fcb, fcb_entry); 762 fcb->fcb_onqueue = false; 763 (*fcb->func)(fence, fcb); 764 } 765 766 /* Success! */ 767 return 0; 768 } 769 770 struct wait_any { 771 struct dma_fence_cb fcb; 772 struct wait_any1 { 773 kmutex_t lock; 774 kcondvar_t cv; 775 struct wait_any *cb; 776 bool done; 777 } *common; 778 }; 779 780 static void 781 wait_any_cb(struct dma_fence *fence, struct dma_fence_cb *fcb) 782 { 783 struct wait_any *cb = container_of(fcb, struct wait_any, fcb); 784 785 KASSERT(dma_fence_referenced_p(fence)); 786 787 mutex_enter(&cb->common->lock); 788 cb->common->done = true; 789 cv_broadcast(&cb->common->cv); 790 mutex_exit(&cb->common->lock); 791 } 792 793 /* 794 * dma_fence_wait_any_timeout(fence, nfences, intr, timeout, ip) 795 * 796 * Wait for any of fences[0], fences[1], fences[2], ..., 797 * fences[nfences-1] to be signalled. If ip is nonnull, set *ip 798 * to the index of the first one. 799 * 800 * Return -ERESTARTSYS if interrupted, 0 on timeout, or time 801 * remaining (at least 1) on success. 802 */ 803 long 804 dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t nfences, 805 bool intr, long timeout, uint32_t *ip) 806 { 807 struct wait_any1 common; 808 struct wait_any *cb; 809 uint32_t i, j; 810 int start, end; 811 long ret = 0; 812 813 KASSERTMSG(timeout >= 0, "timeout %ld", timeout); 814 KASSERTMSG(timeout <= MAX_SCHEDULE_TIMEOUT, "timeout %ld", timeout); 815 816 /* Optimistically check whether any are signalled. */ 817 for (i = 0; i < nfences; i++) { 818 KASSERT(dma_fence_referenced_p(fences[i])); 819 if (dma_fence_is_signaled(fences[i])) { 820 if (ip) 821 *ip = i; 822 return MAX(1, timeout); 823 } 824 } 825 826 /* 827 * If timeout is zero, we're just polling, so stop here as if 828 * we timed out instantly. 829 */ 830 if (timeout == 0) 831 return 0; 832 833 /* Allocate an array of callback records. */ 834 cb = kcalloc(nfences, sizeof(cb[0]), GFP_KERNEL); 835 if (cb == NULL) 836 return -ENOMEM; 837 838 /* Initialize a mutex and condvar for the common wait. */ 839 mutex_init(&common.lock, MUTEX_DEFAULT, IPL_VM); 840 cv_init(&common.cv, "fence"); 841 common.cb = cb; 842 common.done = false; 843 844 /* 845 * Add a callback to each of the fences, or stop if already 846 * signalled. 847 */ 848 for (i = 0; i < nfences; i++) { 849 cb[i].common = &common; 850 KASSERT(dma_fence_referenced_p(fences[i])); 851 ret = dma_fence_add_callback(fences[i], &cb[i].fcb, 852 &wait_any_cb); 853 if (ret) { 854 KASSERT(ret == -ENOENT); 855 if (ip) 856 *ip = i; 857 ret = MAX(1, timeout); 858 goto out; 859 } 860 } 861 862 /* 863 * None of them was ready immediately. Wait for one of the 864 * callbacks to notify us when it is done. 865 */ 866 mutex_enter(&common.lock); 867 while (!common.done) { 868 /* Wait for the time remaining. */ 869 start = getticks(); 870 if (intr) { 871 if (timeout != MAX_SCHEDULE_TIMEOUT) { 872 ret = -cv_timedwait_sig(&common.cv, 873 &common.lock, MIN(timeout, /* paranoia */ 874 MAX_SCHEDULE_TIMEOUT)); 875 } else { 876 ret = -cv_wait_sig(&common.cv, &common.lock); 877 } 878 } else { 879 if (timeout != MAX_SCHEDULE_TIMEOUT) { 880 ret = -cv_timedwait(&common.cv, 881 &common.lock, MIN(timeout, /* paranoia */ 882 MAX_SCHEDULE_TIMEOUT)); 883 } else { 884 cv_wait(&common.cv, &common.lock); 885 ret = 0; 886 } 887 } 888 end = getticks(); 889 890 /* Deduct from time remaining. If none left, time out. */ 891 if (timeout != MAX_SCHEDULE_TIMEOUT) { 892 timeout -= MIN(timeout, 893 (unsigned)end - (unsigned)start); 894 if (timeout == 0) 895 ret = -EWOULDBLOCK; 896 } 897 898 /* If the wait failed, give up. */ 899 if (ret) 900 break; 901 } 902 mutex_exit(&common.lock); 903 904 /* 905 * Massage the return code if nonzero: 906 * - if we were interrupted, return -ERESTARTSYS; 907 * - if we timed out, return 0. 908 * No other failure is possible. On success, ret=0 but we 909 * check again below to verify anyway. 910 */ 911 if (ret) { 912 KASSERTMSG((ret == -EINTR || ret == -ERESTART || 913 ret == -EWOULDBLOCK), "ret=%ld", ret); 914 if (ret == -EINTR || ret == -ERESTART) { 915 ret = -ERESTARTSYS; 916 } else if (ret == -EWOULDBLOCK) { 917 KASSERT(timeout != MAX_SCHEDULE_TIMEOUT); 918 ret = 0; /* timed out */ 919 } 920 } 921 922 KASSERT(ret != -ERESTART); /* would be confused with time left */ 923 924 /* 925 * Test whether any of the fences has been signalled. If they 926 * have, return success. 927 */ 928 for (j = 0; j < nfences; j++) { 929 if (dma_fence_is_signaled(fences[i])) { 930 if (ip) 931 *ip = j; 932 ret = MAX(1, timeout); 933 goto out; 934 } 935 } 936 937 /* 938 * If user passed MAX_SCHEDULE_TIMEOUT, we can't return 0 939 * meaning timed out because we're supposed to wait forever. 940 */ 941 KASSERT(timeout == MAX_SCHEDULE_TIMEOUT ? ret != 0 : 1); 942 943 out: while (i --> 0) 944 (void)dma_fence_remove_callback(fences[i], &cb[i].fcb); 945 cv_destroy(&common.cv); 946 mutex_destroy(&common.lock); 947 kfree(cb); 948 return ret; 949 } 950 951 /* 952 * dma_fence_wait_timeout(fence, intr, timeout) 953 * 954 * Wait until fence is signalled; or until interrupt, if intr is 955 * true; or until timeout, if positive. Return -ERESTARTSYS if 956 * interrupted, negative error code on any other error, zero on 957 * timeout, or positive number of ticks remaining if the fence is 958 * signalled before the timeout. Works by calling the fence wait 959 * callback. 960 * 961 * The timeout must be nonnegative and at most 962 * MAX_SCHEDULE_TIMEOUT, which means wait indefinitely. 963 */ 964 long 965 dma_fence_wait_timeout(struct dma_fence *fence, bool intr, long timeout) 966 { 967 long ret; 968 969 KASSERT(dma_fence_referenced_p(fence)); 970 KASSERTMSG(timeout >= 0, "timeout %ld", timeout); 971 KASSERTMSG(timeout <= MAX_SCHEDULE_TIMEOUT, "timeout %ld", timeout); 972 973 SDT_PROBE3(sdt, drm, fence, wait_start, fence, intr, timeout); 974 if (fence->ops->wait) 975 ret = (*fence->ops->wait)(fence, intr, timeout); 976 else 977 ret = dma_fence_default_wait(fence, intr, timeout); 978 SDT_PROBE2(sdt, drm, fence, wait_done, fence, ret); 979 980 return ret; 981 } 982 983 /* 984 * dma_fence_wait(fence, intr) 985 * 986 * Wait until fence is signalled; or until interrupt, if intr is 987 * true. Return -ERESTARTSYS if interrupted, negative error code 988 * on any other error, zero on sucess. Works by calling the fence 989 * wait callback with MAX_SCHEDULE_TIMEOUT. 990 */ 991 long 992 dma_fence_wait(struct dma_fence *fence, bool intr) 993 { 994 long ret; 995 996 KASSERT(dma_fence_referenced_p(fence)); 997 998 ret = dma_fence_wait_timeout(fence, intr, MAX_SCHEDULE_TIMEOUT); 999 KASSERT(ret != 0); 1000 KASSERTMSG(ret == -ERESTARTSYS || ret == MAX_SCHEDULE_TIMEOUT, 1001 "ret=%ld", ret); 1002 1003 return (ret < 0 ? ret : 0); 1004 } 1005 1006 /* 1007 * dma_fence_default_wait(fence, intr, timeout) 1008 * 1009 * Default implementation of fence wait callback using a condition 1010 * variable. If the fence is already signalled, return timeout, 1011 * or 1 if timeout is zero meaning poll. If the enable signalling 1012 * callback hasn't been called, call it, and if it fails, act as 1013 * if the fence had been signalled. Otherwise, wait on the 1014 * internal condvar. If timeout is MAX_SCHEDULE_TIMEOUT, wait 1015 * indefinitely. 1016 */ 1017 long 1018 dma_fence_default_wait(struct dma_fence *fence, bool intr, long timeout) 1019 { 1020 int starttime = 0, now = 0, deadline = 0; /* XXXGCC */ 1021 kmutex_t *lock = &fence->lock->sl_lock; 1022 long ret = 0; 1023 1024 KASSERT(dma_fence_referenced_p(fence)); 1025 KASSERTMSG(timeout >= 0, "timeout %ld", timeout); 1026 KASSERTMSG(timeout <= MAX_SCHEDULE_TIMEOUT, "timeout %ld", timeout); 1027 1028 /* Optimistically try to skip the lock if it's already signalled. */ 1029 if (atomic_load_relaxed(&fence->flags) & 1030 (1u << DMA_FENCE_FLAG_SIGNALED_BIT)) 1031 return MAX(1, timeout); 1032 1033 /* Acquire the lock. */ 1034 spin_lock(fence->lock); 1035 1036 /* Ensure signalling is enabled, or stop if already completed. */ 1037 if (dma_fence_ensure_signal_enabled(fence) != 0) { 1038 ret = MAX(1, timeout); 1039 goto out; 1040 } 1041 1042 /* If merely polling, stop here. */ 1043 if (timeout == 0) { 1044 ret = 0; 1045 goto out; 1046 } 1047 1048 /* Find out what our deadline is so we can handle spurious wakeup. */ 1049 if (timeout < MAX_SCHEDULE_TIMEOUT) { 1050 now = getticks(); 1051 starttime = now; 1052 deadline = starttime + timeout; 1053 } 1054 1055 /* Wait until the signalled bit is set. */ 1056 while (!(fence->flags & (1u << DMA_FENCE_FLAG_SIGNALED_BIT))) { 1057 /* 1058 * If there's a timeout and we've passed the deadline, 1059 * give up. 1060 */ 1061 if (timeout < MAX_SCHEDULE_TIMEOUT) { 1062 now = getticks(); 1063 if (deadline <= now) { 1064 ret = -EWOULDBLOCK; 1065 break; 1066 } 1067 } 1068 1069 /* Wait for the time remaining. */ 1070 if (intr) { 1071 if (timeout < MAX_SCHEDULE_TIMEOUT) { 1072 ret = -cv_timedwait_sig(&fence->f_cv, lock, 1073 deadline - now); 1074 } else { 1075 ret = -cv_wait_sig(&fence->f_cv, lock); 1076 } 1077 } else { 1078 if (timeout < MAX_SCHEDULE_TIMEOUT) { 1079 ret = -cv_timedwait(&fence->f_cv, lock, 1080 deadline - now); 1081 } else { 1082 cv_wait(&fence->f_cv, lock); 1083 ret = 0; 1084 } 1085 } 1086 1087 /* If the wait failed, give up. */ 1088 if (ret) 1089 break; 1090 } 1091 1092 /* 1093 * Massage the return code if nonzero: 1094 * - if we were interrupted, return -ERESTARTSYS; 1095 * - if we timed out, return 0. 1096 * No other failure is possible. On success, ret=0 but we 1097 * check again below to verify anyway. 1098 */ 1099 if (ret) { 1100 KASSERTMSG((ret == -EINTR || ret == -ERESTART || 1101 ret == -EWOULDBLOCK), "ret=%ld", ret); 1102 if (ret == -EINTR || ret == -ERESTART) { 1103 ret = -ERESTARTSYS; 1104 } else if (ret == -EWOULDBLOCK) { 1105 KASSERT(timeout < MAX_SCHEDULE_TIMEOUT); 1106 ret = 0; /* timed out */ 1107 } 1108 } 1109 1110 KASSERT(ret != -ERESTART); /* would be confused with time left */ 1111 1112 /* Check again in case it was signalled after a wait. */ 1113 if (fence->flags & (1u << DMA_FENCE_FLAG_SIGNALED_BIT)) { 1114 if (timeout < MAX_SCHEDULE_TIMEOUT) 1115 ret = MAX(1, deadline - now); 1116 else 1117 ret = MAX_SCHEDULE_TIMEOUT; 1118 } 1119 1120 out: /* All done. Release the lock. */ 1121 spin_unlock(fence->lock); 1122 return ret; 1123 } 1124 1125 /* 1126 * __dma_fence_signal(fence) 1127 * 1128 * Set fence's signalled bit, without waking waiters yet. Return 1129 * true if it was newly set, false if it was already set. 1130 */ 1131 bool 1132 __dma_fence_signal(struct dma_fence *fence) 1133 { 1134 1135 KASSERTMSG(fence->f_magic != FENCE_MAGIC_BAD, "fence %p", fence); 1136 KASSERTMSG(fence->f_magic == FENCE_MAGIC_GOOD, "fence %p", fence); 1137 1138 if (test_and_set_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) 1139 return false; 1140 1141 return true; 1142 } 1143 1144 /* 1145 * __dma_fence_signal_wake(fence) 1146 * 1147 * Set fence's timestamp and wake fence's waiters. Caller must 1148 * have previously called __dma_fence_signal and it must have 1149 * previously returned true. 1150 */ 1151 void 1152 __dma_fence_signal_wake(struct dma_fence *fence, ktime_t timestamp) 1153 { 1154 struct dma_fence_cb *fcb, *next; 1155 1156 KASSERTMSG(fence->f_magic != FENCE_MAGIC_BAD, "fence %p", fence); 1157 KASSERTMSG(fence->f_magic == FENCE_MAGIC_GOOD, "fence %p", fence); 1158 1159 spin_lock(fence->lock); 1160 1161 KASSERT(fence->flags & DMA_FENCE_FLAG_SIGNALED_BIT); 1162 1163 SDT_PROBE1(sdt, drm, fence, signal, fence); 1164 1165 /* Set the timestamp. */ 1166 fence->timestamp = timestamp; 1167 set_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags); 1168 1169 /* Wake waiters. */ 1170 cv_broadcast(&fence->f_cv); 1171 1172 /* Remove and call the callbacks. */ 1173 TAILQ_FOREACH_SAFE(fcb, &fence->f_callbacks, fcb_entry, next) { 1174 TAILQ_REMOVE(&fence->f_callbacks, fcb, fcb_entry); 1175 fcb->fcb_onqueue = false; 1176 (*fcb->func)(fence, fcb); 1177 } 1178 1179 spin_unlock(fence->lock); 1180 } 1181