1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2 /************************************************************************** 3 * 4 * Copyright (c) 2007-2009 VMware, Inc., Palo Alto, CA., USA 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sub license, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the 16 * next paragraph) shall be included in all copies or substantial portions 17 * of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 22 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 23 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 24 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 25 * USE OR OTHER DEALINGS IN THE SOFTWARE. 26 * 27 **************************************************************************/ 28 /* 29 * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com> 30 */ 31 32 #include <linux/export.h> 33 #include <linux/swap.h> 34 #include <linux/vmalloc.h> 35 36 #include <drm/ttm/ttm_bo.h> 37 #include <drm/ttm/ttm_placement.h> 38 #include <drm/ttm/ttm_tt.h> 39 40 #include <drm/drm_cache.h> 41 42 #include "ttm_bo_internal.h" 43 44 struct ttm_transfer_obj { 45 struct ttm_buffer_object base; 46 struct ttm_buffer_object *bo; 47 }; 48 49 int ttm_mem_io_reserve(struct ttm_device *bdev, 50 struct ttm_resource *mem) 51 { 52 if (mem->bus.offset || mem->bus.addr) 53 return 0; 54 55 mem->bus.is_iomem = false; 56 if (!bdev->funcs->io_mem_reserve) 57 return 0; 58 59 return bdev->funcs->io_mem_reserve(bdev, mem); 60 } 61 62 void ttm_mem_io_free(struct ttm_device *bdev, 63 struct ttm_resource *mem) 64 { 65 if (!mem) 66 return; 67 68 if (!mem->bus.offset && !mem->bus.addr) 69 return; 70 71 if (bdev->funcs->io_mem_free) 72 bdev->funcs->io_mem_free(bdev, mem); 73 74 mem->bus.offset = 0; 75 mem->bus.addr = NULL; 76 } 77 78 /** 79 * ttm_move_memcpy - Helper to perform a memcpy ttm move operation. 80 * @clear: Whether to clear rather than copy. 81 * @num_pages: Number of pages of the operation. 82 * @dst_iter: A struct ttm_kmap_iter representing the destination resource. 83 * @src_iter: A struct ttm_kmap_iter representing the source resource. 84 * 85 * This function is intended to be able to move out async under a 86 * dma-fence if desired. 87 */ 88 void ttm_move_memcpy(bool clear, 89 u32 num_pages, 90 struct ttm_kmap_iter *dst_iter, 91 struct ttm_kmap_iter *src_iter) 92 { 93 const struct ttm_kmap_iter_ops *dst_ops = dst_iter->ops; 94 const struct ttm_kmap_iter_ops *src_ops = src_iter->ops; 95 struct iosys_map src_map, dst_map; 96 pgoff_t i; 97 98 /* Single TTM move. NOP */ 99 if (dst_ops->maps_tt && src_ops->maps_tt) 100 return; 101 102 /* Don't move nonexistent data. Clear destination instead. */ 103 if (clear) { 104 for (i = 0; i < num_pages; ++i) { 105 dst_ops->map_local(dst_iter, &dst_map, i); 106 if (dst_map.is_iomem) 107 memset_io(dst_map.vaddr_iomem, 0, PAGE_SIZE); 108 else 109 memset(dst_map.vaddr, 0, PAGE_SIZE); 110 if (dst_ops->unmap_local) 111 dst_ops->unmap_local(dst_iter, &dst_map); 112 } 113 return; 114 } 115 116 for (i = 0; i < num_pages; ++i) { 117 dst_ops->map_local(dst_iter, &dst_map, i); 118 src_ops->map_local(src_iter, &src_map, i); 119 120 drm_memcpy_from_wc(&dst_map, &src_map, PAGE_SIZE); 121 122 if (src_ops->unmap_local) 123 src_ops->unmap_local(src_iter, &src_map); 124 if (dst_ops->unmap_local) 125 dst_ops->unmap_local(dst_iter, &dst_map); 126 } 127 } 128 EXPORT_SYMBOL(ttm_move_memcpy); 129 130 /** 131 * ttm_bo_move_memcpy 132 * 133 * @bo: A pointer to a struct ttm_buffer_object. 134 * @ctx: operation context 135 * @dst_mem: struct ttm_resource indicating where to move. 136 * 137 * Fallback move function for a mappable buffer object in mappable memory. 138 * The function will, if successful, 139 * free any old aperture space, and set (@new_mem)->mm_node to NULL, 140 * and update the (@bo)->mem placement flags. If unsuccessful, the old 141 * data remains untouched, and it's up to the caller to free the 142 * memory space indicated by @new_mem. 143 * Returns: 144 * !0: Failure. 145 */ 146 int ttm_bo_move_memcpy(struct ttm_buffer_object *bo, 147 struct ttm_operation_ctx *ctx, 148 struct ttm_resource *dst_mem) 149 { 150 struct ttm_device *bdev = bo->bdev; 151 struct ttm_resource_manager *dst_man = 152 ttm_manager_type(bo->bdev, dst_mem->mem_type); 153 struct ttm_tt *ttm = bo->ttm; 154 struct ttm_resource *src_mem = bo->resource; 155 struct ttm_resource_manager *src_man; 156 union { 157 struct ttm_kmap_iter_tt tt; 158 struct ttm_kmap_iter_linear_io io; 159 } _dst_iter, _src_iter; 160 struct ttm_kmap_iter *dst_iter, *src_iter; 161 bool clear; 162 int ret = 0; 163 164 if (WARN_ON(!src_mem)) 165 return -EINVAL; 166 167 src_man = ttm_manager_type(bdev, src_mem->mem_type); 168 if (ttm && ((ttm->page_flags & TTM_TT_FLAG_SWAPPED) || 169 dst_man->use_tt)) { 170 ret = ttm_bo_populate(bo, ctx); 171 if (ret) 172 return ret; 173 } 174 175 dst_iter = ttm_kmap_iter_linear_io_init(&_dst_iter.io, bdev, dst_mem); 176 if (PTR_ERR(dst_iter) == -EINVAL && dst_man->use_tt) 177 dst_iter = ttm_kmap_iter_tt_init(&_dst_iter.tt, ttm); 178 if (IS_ERR(dst_iter)) 179 return PTR_ERR(dst_iter); 180 181 src_iter = ttm_kmap_iter_linear_io_init(&_src_iter.io, bdev, src_mem); 182 if (PTR_ERR(src_iter) == -EINVAL && src_man->use_tt) 183 src_iter = ttm_kmap_iter_tt_init(&_src_iter.tt, ttm); 184 if (IS_ERR(src_iter)) { 185 ret = PTR_ERR(src_iter); 186 goto out_src_iter; 187 } 188 189 clear = src_iter->ops->maps_tt && (!ttm || !ttm_tt_is_populated(ttm)); 190 if (!(clear && ttm && !(ttm->page_flags & TTM_TT_FLAG_ZERO_ALLOC))) 191 ttm_move_memcpy(clear, PFN_UP(dst_mem->size), dst_iter, src_iter); 192 193 if (!src_iter->ops->maps_tt) 194 ttm_kmap_iter_linear_io_fini(&_src_iter.io, bdev, src_mem); 195 ttm_bo_move_sync_cleanup(bo, dst_mem); 196 197 out_src_iter: 198 if (!dst_iter->ops->maps_tt) 199 ttm_kmap_iter_linear_io_fini(&_dst_iter.io, bdev, dst_mem); 200 201 return ret; 202 } 203 EXPORT_SYMBOL(ttm_bo_move_memcpy); 204 205 static void ttm_transfered_destroy(struct ttm_buffer_object *bo) 206 { 207 struct ttm_transfer_obj *fbo; 208 209 fbo = container_of(bo, struct ttm_transfer_obj, base); 210 dma_resv_fini(&fbo->base.base._resv); 211 ttm_bo_put(fbo->bo); 212 kfree(fbo); 213 } 214 215 /** 216 * ttm_buffer_object_transfer 217 * 218 * @bo: A pointer to a struct ttm_buffer_object. 219 * @new_obj: A pointer to a pointer to a newly created ttm_buffer_object, 220 * holding the data of @bo with the old placement. 221 * 222 * This is a utility function that may be called after an accelerated move 223 * has been scheduled. A new buffer object is created as a placeholder for 224 * the old data while it's being copied. When that buffer object is idle, 225 * it can be destroyed, releasing the space of the old placement. 226 * Returns: 227 * !0: Failure. 228 */ 229 230 static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo, 231 struct ttm_buffer_object **new_obj) 232 { 233 struct ttm_transfer_obj *fbo; 234 int ret; 235 236 fbo = kmalloc(sizeof(*fbo), GFP_KERNEL); 237 if (!fbo) 238 return -ENOMEM; 239 240 fbo->base = *bo; 241 242 /** 243 * Fix up members that we shouldn't copy directly: 244 * TODO: Explicit member copy would probably be better here. 245 */ 246 247 atomic_inc(&ttm_glob.bo_count); 248 drm_vma_node_reset(&fbo->base.base.vma_node); 249 250 kref_init(&fbo->base.kref); 251 fbo->base.destroy = &ttm_transfered_destroy; 252 fbo->base.pin_count = 0; 253 if (bo->type != ttm_bo_type_sg) 254 fbo->base.base.resv = &fbo->base.base._resv; 255 256 dma_resv_init(&fbo->base.base._resv); 257 fbo->base.base.dev = NULL; 258 ret = dma_resv_trylock(&fbo->base.base._resv); 259 WARN_ON(!ret); 260 261 ret = dma_resv_reserve_fences(&fbo->base.base._resv, TTM_NUM_MOVE_FENCES); 262 if (ret) { 263 dma_resv_unlock(&fbo->base.base._resv); 264 kfree(fbo); 265 return ret; 266 } 267 268 if (fbo->base.resource) { 269 ttm_resource_set_bo(fbo->base.resource, &fbo->base); 270 bo->resource = NULL; 271 ttm_bo_set_bulk_move(&fbo->base, NULL); 272 } else { 273 fbo->base.bulk_move = NULL; 274 } 275 276 ttm_bo_get(bo); 277 fbo->bo = bo; 278 279 ttm_bo_move_to_lru_tail_unlocked(&fbo->base); 280 281 *new_obj = &fbo->base; 282 return 0; 283 } 284 285 /** 286 * ttm_io_prot 287 * 288 * @bo: ttm buffer object 289 * @res: ttm resource object 290 * @tmp: Page protection flag for a normal, cached mapping. 291 * 292 * Utility function that returns the pgprot_t that should be used for 293 * setting up a PTE with the caching model indicated by @c_state. 294 */ 295 pgprot_t ttm_io_prot(struct ttm_buffer_object *bo, struct ttm_resource *res, 296 pgprot_t tmp) 297 { 298 struct ttm_resource_manager *man; 299 enum ttm_caching caching; 300 301 man = ttm_manager_type(bo->bdev, res->mem_type); 302 if (man->use_tt) { 303 caching = bo->ttm->caching; 304 if (bo->ttm->page_flags & TTM_TT_FLAG_DECRYPTED) 305 tmp = pgprot_decrypted(tmp); 306 } else { 307 caching = res->bus.caching; 308 } 309 310 return ttm_prot_from_caching(caching, tmp); 311 } 312 EXPORT_SYMBOL(ttm_io_prot); 313 314 static int ttm_bo_ioremap(struct ttm_buffer_object *bo, 315 unsigned long offset, 316 unsigned long size, 317 struct ttm_bo_kmap_obj *map) 318 { 319 struct ttm_resource *mem = bo->resource; 320 321 if (mem->bus.addr) { 322 map->bo_kmap_type = ttm_bo_map_premapped; 323 map->virtual = ((u8 *)mem->bus.addr) + offset; 324 } else { 325 resource_size_t res = mem->bus.offset + offset; 326 327 map->bo_kmap_type = ttm_bo_map_iomap; 328 if (mem->bus.caching == ttm_write_combined) 329 map->virtual = ioremap_wc(res, size); 330 #ifdef CONFIG_X86 331 else if (mem->bus.caching == ttm_cached) 332 map->virtual = ioremap_cache(res, size); 333 #endif 334 else 335 map->virtual = ioremap(res, size); 336 } 337 return (!map->virtual) ? -ENOMEM : 0; 338 } 339 340 static int ttm_bo_kmap_ttm(struct ttm_buffer_object *bo, 341 unsigned long start_page, 342 unsigned long num_pages, 343 struct ttm_bo_kmap_obj *map) 344 { 345 struct ttm_resource *mem = bo->resource; 346 struct ttm_operation_ctx ctx = { }; 347 struct ttm_tt *ttm = bo->ttm; 348 struct ttm_resource_manager *man = 349 ttm_manager_type(bo->bdev, mem->mem_type); 350 pgprot_t prot; 351 int ret; 352 353 BUG_ON(!ttm); 354 355 ret = ttm_bo_populate(bo, &ctx); 356 if (ret) 357 return ret; 358 359 if (num_pages == 1 && ttm->caching == ttm_cached && 360 !(man->use_tt && (ttm->page_flags & TTM_TT_FLAG_DECRYPTED))) { 361 /* 362 * We're mapping a single page, and the desired 363 * page protection is consistent with the bo. 364 */ 365 366 map->bo_kmap_type = ttm_bo_map_kmap; 367 map->page = ttm->pages[start_page]; 368 map->virtual = kmap(map->page); 369 } else { 370 /* 371 * We need to use vmap to get the desired page protection 372 * or to make the buffer object look contiguous. 373 */ 374 prot = ttm_io_prot(bo, mem, PAGE_KERNEL); 375 map->bo_kmap_type = ttm_bo_map_vmap; 376 map->virtual = vmap(ttm->pages + start_page, num_pages, 377 0, prot); 378 } 379 return (!map->virtual) ? -ENOMEM : 0; 380 } 381 382 /** 383 * ttm_bo_kmap_try_from_panic 384 * 385 * @bo: The buffer object 386 * @page: The page to map 387 * 388 * Sets up a kernel virtual mapping using kmap_local_page_try_from_panic(). 389 * This should only be called from the panic handler, if you make sure the bo 390 * is the one being displayed, so is properly allocated, and protected. 391 * 392 * Returns the vaddr, that you can use to write to the bo, and that you should 393 * pass to kunmap_local() when you're done with this page, or NULL if the bo 394 * is in iomem. 395 */ 396 void *ttm_bo_kmap_try_from_panic(struct ttm_buffer_object *bo, unsigned long page) 397 { 398 if (page + 1 > PFN_UP(bo->resource->size)) 399 return NULL; 400 401 if (!bo->resource->bus.is_iomem && bo->ttm->pages && bo->ttm->pages[page]) 402 return kmap_local_page_try_from_panic(bo->ttm->pages[page]); 403 404 return NULL; 405 } 406 EXPORT_SYMBOL(ttm_bo_kmap_try_from_panic); 407 408 /** 409 * ttm_bo_kmap 410 * 411 * @bo: The buffer object. 412 * @start_page: The first page to map. 413 * @num_pages: Number of pages to map. 414 * @map: pointer to a struct ttm_bo_kmap_obj representing the map. 415 * 416 * Sets up a kernel virtual mapping, using ioremap, vmap or kmap to the 417 * data in the buffer object. The ttm_kmap_obj_virtual function can then be 418 * used to obtain a virtual address to the data. 419 * 420 * Returns 421 * -ENOMEM: Out of memory. 422 * -EINVAL: Invalid range. 423 */ 424 int ttm_bo_kmap(struct ttm_buffer_object *bo, 425 unsigned long start_page, unsigned long num_pages, 426 struct ttm_bo_kmap_obj *map) 427 { 428 struct ttm_resource *res = bo->resource; 429 unsigned long offset, size; 430 int ret; 431 432 map->virtual = NULL; 433 map->bo = bo; 434 if (num_pages > PFN_UP(res->size)) 435 return -EINVAL; 436 if ((start_page + num_pages) > PFN_UP(res->size)) 437 return -EINVAL; 438 439 ret = ttm_mem_io_reserve(bo->bdev, res); 440 if (ret) 441 return ret; 442 if (!res->bus.is_iomem) { 443 return ttm_bo_kmap_ttm(bo, start_page, num_pages, map); 444 } else { 445 offset = start_page << PAGE_SHIFT; 446 size = num_pages << PAGE_SHIFT; 447 return ttm_bo_ioremap(bo, offset, size, map); 448 } 449 } 450 EXPORT_SYMBOL(ttm_bo_kmap); 451 452 /** 453 * ttm_bo_kunmap 454 * 455 * @map: Object describing the map to unmap. 456 * 457 * Unmaps a kernel map set up by ttm_bo_kmap. 458 */ 459 void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map) 460 { 461 if (!map->virtual) 462 return; 463 switch (map->bo_kmap_type) { 464 case ttm_bo_map_iomap: 465 iounmap(map->virtual); 466 break; 467 case ttm_bo_map_vmap: 468 vunmap(map->virtual); 469 break; 470 case ttm_bo_map_kmap: 471 kunmap(map->page); 472 break; 473 case ttm_bo_map_premapped: 474 break; 475 default: 476 BUG(); 477 } 478 ttm_mem_io_free(map->bo->bdev, map->bo->resource); 479 map->virtual = NULL; 480 map->page = NULL; 481 } 482 EXPORT_SYMBOL(ttm_bo_kunmap); 483 484 /** 485 * ttm_bo_vmap 486 * 487 * @bo: The buffer object. 488 * @map: pointer to a struct iosys_map representing the map. 489 * 490 * Sets up a kernel virtual mapping, using ioremap or vmap to the 491 * data in the buffer object. The parameter @map returns the virtual 492 * address as struct iosys_map. Unmap the buffer with ttm_bo_vunmap(). 493 * 494 * Returns 495 * -ENOMEM: Out of memory. 496 * -EINVAL: Invalid range. 497 */ 498 int ttm_bo_vmap(struct ttm_buffer_object *bo, struct iosys_map *map) 499 { 500 struct ttm_resource *mem = bo->resource; 501 int ret; 502 503 dma_resv_assert_held(bo->base.resv); 504 505 ret = ttm_mem_io_reserve(bo->bdev, mem); 506 if (ret) 507 return ret; 508 509 if (mem->bus.is_iomem) { 510 void __iomem *vaddr_iomem; 511 512 if (mem->bus.addr) 513 vaddr_iomem = (void __iomem *)mem->bus.addr; 514 else if (mem->bus.caching == ttm_write_combined) 515 vaddr_iomem = ioremap_wc(mem->bus.offset, 516 bo->base.size); 517 #ifdef CONFIG_X86 518 else if (mem->bus.caching == ttm_cached) 519 vaddr_iomem = ioremap_cache(mem->bus.offset, 520 bo->base.size); 521 #endif 522 else 523 vaddr_iomem = ioremap(mem->bus.offset, bo->base.size); 524 525 if (!vaddr_iomem) 526 return -ENOMEM; 527 528 iosys_map_set_vaddr_iomem(map, vaddr_iomem); 529 530 } else { 531 struct ttm_operation_ctx ctx = { }; 532 struct ttm_tt *ttm = bo->ttm; 533 pgprot_t prot; 534 void *vaddr; 535 536 ret = ttm_bo_populate(bo, &ctx); 537 if (ret) 538 return ret; 539 540 /* 541 * We need to use vmap to get the desired page protection 542 * or to make the buffer object look contiguous. 543 */ 544 prot = ttm_io_prot(bo, mem, PAGE_KERNEL); 545 vaddr = vmap(ttm->pages, ttm->num_pages, 0, prot); 546 if (!vaddr) 547 return -ENOMEM; 548 549 iosys_map_set_vaddr(map, vaddr); 550 } 551 552 return 0; 553 } 554 EXPORT_SYMBOL(ttm_bo_vmap); 555 556 /** 557 * ttm_bo_vunmap 558 * 559 * @bo: The buffer object. 560 * @map: Object describing the map to unmap. 561 * 562 * Unmaps a kernel map set up by ttm_bo_vmap(). 563 */ 564 void ttm_bo_vunmap(struct ttm_buffer_object *bo, struct iosys_map *map) 565 { 566 struct ttm_resource *mem = bo->resource; 567 568 dma_resv_assert_held(bo->base.resv); 569 570 if (iosys_map_is_null(map)) 571 return; 572 573 if (!map->is_iomem) 574 vunmap(map->vaddr); 575 else if (!mem->bus.addr) 576 iounmap(map->vaddr_iomem); 577 iosys_map_clear(map); 578 579 ttm_mem_io_free(bo->bdev, mem); 580 } 581 EXPORT_SYMBOL(ttm_bo_vunmap); 582 583 static int ttm_bo_wait_free_node(struct ttm_buffer_object *bo, 584 bool dst_use_tt) 585 { 586 long ret; 587 588 ret = dma_resv_wait_timeout(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP, 589 false, 15 * HZ); 590 if (ret == 0) 591 return -EBUSY; 592 if (ret < 0) 593 return ret; 594 595 if (!dst_use_tt) 596 ttm_bo_tt_destroy(bo); 597 ttm_resource_free(bo, &bo->resource); 598 return 0; 599 } 600 601 static int ttm_bo_move_to_ghost(struct ttm_buffer_object *bo, 602 struct dma_fence *fence, 603 bool dst_use_tt) 604 { 605 struct ttm_buffer_object *ghost_obj; 606 int ret; 607 608 /** 609 * This should help pipeline ordinary buffer moves. 610 * 611 * Hang old buffer memory on a new buffer object, 612 * and leave it to be released when the GPU 613 * operation has completed. 614 */ 615 616 ret = ttm_buffer_object_transfer(bo, &ghost_obj); 617 if (ret) 618 return ret; 619 620 dma_resv_add_fence(&ghost_obj->base._resv, fence, 621 DMA_RESV_USAGE_KERNEL); 622 623 /** 624 * If we're not moving to fixed memory, the TTM object 625 * needs to stay alive. Otherwhise hang it on the ghost 626 * bo to be unbound and destroyed. 627 */ 628 629 if (dst_use_tt) 630 ghost_obj->ttm = NULL; 631 else 632 bo->ttm = NULL; 633 634 dma_resv_unlock(&ghost_obj->base._resv); 635 ttm_bo_put(ghost_obj); 636 return 0; 637 } 638 639 static void ttm_bo_move_pipeline_evict(struct ttm_buffer_object *bo, 640 struct dma_fence *fence) 641 { 642 struct ttm_resource_manager *from; 643 struct dma_fence *tmp; 644 int i; 645 646 from = ttm_manager_type(bo->bdev, bo->resource->mem_type); 647 648 /** 649 * BO doesn't have a TTM we need to bind/unbind. Just remember 650 * this eviction and free up the allocation. 651 * The fence will be saved in the first free slot or in the slot 652 * already used to store a fence from the same context. Since 653 * drivers can't use more than TTM_NUM_MOVE_FENCES contexts for 654 * evictions we should always find a slot to use. 655 */ 656 spin_lock(&from->eviction_lock); 657 for (i = 0; i < TTM_NUM_MOVE_FENCES; i++) { 658 tmp = from->eviction_fences[i]; 659 if (!tmp) 660 break; 661 if (fence->context != tmp->context) 662 continue; 663 if (dma_fence_is_later(fence, tmp)) { 664 dma_fence_put(tmp); 665 break; 666 } 667 goto unlock; 668 } 669 if (i < TTM_NUM_MOVE_FENCES) { 670 from->eviction_fences[i] = dma_fence_get(fence); 671 } else { 672 WARN(1, "not enough fence slots for all fence contexts"); 673 spin_unlock(&from->eviction_lock); 674 dma_fence_wait(fence, false); 675 goto end; 676 } 677 678 unlock: 679 spin_unlock(&from->eviction_lock); 680 end: 681 ttm_resource_free(bo, &bo->resource); 682 } 683 684 /** 685 * ttm_bo_move_accel_cleanup - cleanup helper for hw copies 686 * 687 * @bo: A pointer to a struct ttm_buffer_object. 688 * @fence: A fence object that signals when moving is complete. 689 * @evict: This is an evict move. Don't return until the buffer is idle. 690 * @pipeline: evictions are to be pipelined. 691 * @new_mem: struct ttm_resource indicating where to move. 692 * 693 * Accelerated move function to be called when an accelerated move 694 * has been scheduled. The function will create a new temporary buffer object 695 * representing the old placement, and put the sync object on both buffer 696 * objects. After that the newly created buffer object is unref'd to be 697 * destroyed when the move is complete. This will help pipeline 698 * buffer moves. 699 */ 700 int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo, 701 struct dma_fence *fence, 702 bool evict, 703 bool pipeline, 704 struct ttm_resource *new_mem) 705 { 706 struct ttm_device *bdev = bo->bdev; 707 struct ttm_resource_manager *from = ttm_manager_type(bdev, bo->resource->mem_type); 708 struct ttm_resource_manager *man = ttm_manager_type(bdev, new_mem->mem_type); 709 int ret = 0; 710 711 dma_resv_add_fence(bo->base.resv, fence, DMA_RESV_USAGE_KERNEL); 712 if (!evict) 713 ret = ttm_bo_move_to_ghost(bo, fence, man->use_tt); 714 else if (!from->use_tt && pipeline) 715 ttm_bo_move_pipeline_evict(bo, fence); 716 else 717 ret = ttm_bo_wait_free_node(bo, man->use_tt); 718 719 if (ret) 720 return ret; 721 722 ttm_bo_assign_mem(bo, new_mem); 723 724 return 0; 725 } 726 EXPORT_SYMBOL(ttm_bo_move_accel_cleanup); 727 728 /** 729 * ttm_bo_move_sync_cleanup - cleanup by waiting for the move to finish 730 * 731 * @bo: A pointer to a struct ttm_buffer_object. 732 * @new_mem: struct ttm_resource indicating where to move. 733 * 734 * Special case of ttm_bo_move_accel_cleanup where the bo is guaranteed 735 * by the caller to be idle. Typically used after memcpy buffer moves. 736 */ 737 void ttm_bo_move_sync_cleanup(struct ttm_buffer_object *bo, 738 struct ttm_resource *new_mem) 739 { 740 struct ttm_resource_manager *man = 741 ttm_manager_type(bo->bdev, new_mem->mem_type); 742 int ret; 743 744 ret = ttm_bo_wait_free_node(bo, man->use_tt); 745 if (WARN_ON(ret)) 746 return; 747 748 ttm_bo_assign_mem(bo, new_mem); 749 } 750 EXPORT_SYMBOL(ttm_bo_move_sync_cleanup); 751 752 /** 753 * ttm_bo_pipeline_gutting - purge the contents of a bo 754 * @bo: The buffer object 755 * 756 * Purge the contents of a bo, async if the bo is not idle. 757 * After a successful call, the bo is left unpopulated in 758 * system placement. The function may wait uninterruptible 759 * for idle on OOM. 760 * 761 * Return: 0 if successful, negative error code on failure. 762 */ 763 int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo) 764 { 765 struct ttm_buffer_object *ghost; 766 struct ttm_tt *ttm; 767 int ret; 768 769 /* If already idle, no need for ghost object dance. */ 770 if (dma_resv_test_signaled(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP)) { 771 if (!bo->ttm) { 772 /* See comment below about clearing. */ 773 ret = ttm_tt_create(bo, true); 774 if (ret) 775 return ret; 776 } else { 777 ttm_tt_unpopulate(bo->bdev, bo->ttm); 778 if (bo->type == ttm_bo_type_device) 779 ttm_tt_mark_for_clear(bo->ttm); 780 } 781 ttm_resource_free(bo, &bo->resource); 782 return 0; 783 } 784 785 /* 786 * We need an unpopulated ttm_tt after giving our current one, 787 * if any, to the ghost object. And we can't afford to fail 788 * creating one *after* the operation. If the bo subsequently gets 789 * resurrected, make sure it's cleared (if ttm_bo_type_device) 790 * to avoid leaking sensitive information to user-space. 791 */ 792 793 ttm = bo->ttm; 794 bo->ttm = NULL; 795 ret = ttm_tt_create(bo, true); 796 swap(bo->ttm, ttm); 797 if (ret) 798 return ret; 799 800 ret = ttm_buffer_object_transfer(bo, &ghost); 801 if (ret) 802 goto error_destroy_tt; 803 804 ret = dma_resv_copy_fences(&ghost->base._resv, bo->base.resv); 805 /* Last resort, wait for the BO to be idle when we are OOM */ 806 if (ret) { 807 dma_resv_wait_timeout(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP, 808 false, MAX_SCHEDULE_TIMEOUT); 809 } 810 811 dma_resv_unlock(&ghost->base._resv); 812 ttm_bo_put(ghost); 813 bo->ttm = ttm; 814 return 0; 815 816 error_destroy_tt: 817 ttm_tt_destroy(bo->bdev, ttm); 818 return ret; 819 } 820 821 static bool ttm_lru_walk_trylock(struct ttm_bo_lru_cursor *curs, 822 struct ttm_buffer_object *bo) 823 { 824 struct ttm_operation_ctx *ctx = curs->arg->ctx; 825 826 curs->needs_unlock = false; 827 828 if (dma_resv_trylock(bo->base.resv)) { 829 curs->needs_unlock = true; 830 return true; 831 } 832 833 if (bo->base.resv == ctx->resv && ctx->allow_res_evict) { 834 dma_resv_assert_held(bo->base.resv); 835 return true; 836 } 837 838 return false; 839 } 840 841 static int ttm_lru_walk_ticketlock(struct ttm_bo_lru_cursor *curs, 842 struct ttm_buffer_object *bo) 843 { 844 struct ttm_lru_walk_arg *arg = curs->arg; 845 int ret; 846 847 if (arg->ctx->interruptible) 848 ret = dma_resv_lock_interruptible(bo->base.resv, arg->ticket); 849 else 850 ret = dma_resv_lock(bo->base.resv, arg->ticket); 851 852 if (!ret) { 853 curs->needs_unlock = true; 854 /* 855 * Only a single ticketlock per loop. Ticketlocks are prone 856 * to return -EDEADLK causing the eviction to fail, so 857 * after waiting for the ticketlock, revert back to 858 * trylocking for this walk. 859 */ 860 arg->ticket = NULL; 861 } else if (ret == -EDEADLK) { 862 /* Caller needs to exit the ww transaction. */ 863 ret = -ENOSPC; 864 } 865 866 return ret; 867 } 868 869 /** 870 * ttm_lru_walk_for_evict() - Perform a LRU list walk, with actions taken on 871 * valid items. 872 * @walk: describe the walks and actions taken 873 * @bdev: The TTM device. 874 * @man: The struct ttm_resource manager whose LRU lists we're walking. 875 * @target: The end condition for the walk. 876 * 877 * The LRU lists of @man are walk, and for each struct ttm_resource encountered, 878 * the corresponding ttm_buffer_object is locked and taken a reference on, and 879 * the LRU lock is dropped. the LRU lock may be dropped before locking and, in 880 * that case, it's verified that the item actually remains on the LRU list after 881 * the lock, and that the buffer object didn't switch resource in between. 882 * 883 * With a locked object, the actions indicated by @walk->process_bo are 884 * performed, and after that, the bo is unlocked, the refcount dropped and the 885 * next struct ttm_resource is processed. Here, the walker relies on 886 * TTM's restartable LRU list implementation. 887 * 888 * Typically @walk->process_bo() would return the number of pages evicted, 889 * swapped or shrunken, so that when the total exceeds @target, or when the 890 * LRU list has been walked in full, iteration is terminated. It's also terminated 891 * on error. Note that the definition of @target is done by the caller, it 892 * could have a different meaning than the number of pages. 893 * 894 * Note that the way dma_resv individualization is done, locking needs to be done 895 * either with the LRU lock held (trylocking only) or with a reference on the 896 * object. 897 * 898 * Return: The progress made towards target or negative error code on error. 899 */ 900 s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev, 901 struct ttm_resource_manager *man, s64 target) 902 { 903 struct ttm_bo_lru_cursor cursor; 904 struct ttm_buffer_object *bo; 905 s64 progress = 0; 906 s64 lret; 907 908 ttm_bo_lru_for_each_reserved_guarded(&cursor, man, &walk->arg, bo) { 909 lret = walk->ops->process_bo(walk, bo); 910 if (lret == -EBUSY || lret == -EALREADY) 911 lret = 0; 912 progress = (lret < 0) ? lret : progress + lret; 913 if (progress < 0 || progress >= target) 914 break; 915 } 916 if (IS_ERR(bo)) 917 return PTR_ERR(bo); 918 919 return progress; 920 } 921 EXPORT_SYMBOL(ttm_lru_walk_for_evict); 922 923 static void ttm_bo_lru_cursor_cleanup_bo(struct ttm_bo_lru_cursor *curs) 924 { 925 struct ttm_buffer_object *bo = curs->bo; 926 927 if (bo) { 928 if (curs->needs_unlock) 929 dma_resv_unlock(bo->base.resv); 930 ttm_bo_put(bo); 931 curs->bo = NULL; 932 } 933 } 934 935 /** 936 * ttm_bo_lru_cursor_fini() - Stop using a struct ttm_bo_lru_cursor 937 * and clean up any iteration it was used for. 938 * @curs: The cursor. 939 */ 940 void ttm_bo_lru_cursor_fini(struct ttm_bo_lru_cursor *curs) 941 { 942 spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock; 943 944 ttm_bo_lru_cursor_cleanup_bo(curs); 945 spin_lock(lru_lock); 946 ttm_resource_cursor_fini(&curs->res_curs); 947 spin_unlock(lru_lock); 948 } 949 EXPORT_SYMBOL(ttm_bo_lru_cursor_fini); 950 951 /** 952 * ttm_bo_lru_cursor_init() - Initialize a struct ttm_bo_lru_cursor 953 * @curs: The ttm_bo_lru_cursor to initialize. 954 * @man: The ttm resource_manager whose LRU lists to iterate over. 955 * @arg: The ttm_lru_walk_arg to govern the walk. 956 * 957 * Initialize a struct ttm_bo_lru_cursor. 958 * 959 * Return: Pointer to @curs. The function does not fail. 960 */ 961 struct ttm_bo_lru_cursor * 962 ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs, 963 struct ttm_resource_manager *man, 964 struct ttm_lru_walk_arg *arg) 965 { 966 memset(curs, 0, sizeof(*curs)); 967 ttm_resource_cursor_init(&curs->res_curs, man); 968 curs->arg = arg; 969 970 return curs; 971 } 972 EXPORT_SYMBOL(ttm_bo_lru_cursor_init); 973 974 static struct ttm_buffer_object * 975 __ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs) 976 { 977 spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock; 978 struct ttm_resource *res = NULL; 979 struct ttm_buffer_object *bo; 980 struct ttm_lru_walk_arg *arg = curs->arg; 981 bool first = !curs->bo; 982 983 ttm_bo_lru_cursor_cleanup_bo(curs); 984 985 spin_lock(lru_lock); 986 for (;;) { 987 int mem_type, ret = 0; 988 bool bo_locked = false; 989 990 if (first) { 991 res = ttm_resource_manager_first(&curs->res_curs); 992 first = false; 993 } else { 994 res = ttm_resource_manager_next(&curs->res_curs); 995 } 996 if (!res) 997 break; 998 999 bo = res->bo; 1000 if (ttm_lru_walk_trylock(curs, bo)) 1001 bo_locked = true; 1002 else if (!arg->ticket || arg->ctx->no_wait_gpu || arg->trylock_only) 1003 continue; 1004 1005 if (!ttm_bo_get_unless_zero(bo)) { 1006 if (curs->needs_unlock) 1007 dma_resv_unlock(bo->base.resv); 1008 continue; 1009 } 1010 1011 mem_type = res->mem_type; 1012 spin_unlock(lru_lock); 1013 if (!bo_locked) 1014 ret = ttm_lru_walk_ticketlock(curs, bo); 1015 1016 /* 1017 * Note that in between the release of the lru lock and the 1018 * ticketlock, the bo may have switched resource, 1019 * and also memory type, since the resource may have been 1020 * freed and allocated again with a different memory type. 1021 * In that case, just skip it. 1022 */ 1023 curs->bo = bo; 1024 if (!ret && bo->resource && bo->resource->mem_type == mem_type) 1025 return bo; 1026 1027 ttm_bo_lru_cursor_cleanup_bo(curs); 1028 if (ret && ret != -EALREADY) 1029 return ERR_PTR(ret); 1030 1031 spin_lock(lru_lock); 1032 } 1033 1034 spin_unlock(lru_lock); 1035 return res ? bo : NULL; 1036 } 1037 1038 /** 1039 * ttm_bo_lru_cursor_next() - Continue iterating a manager's LRU lists 1040 * to find and lock buffer object. 1041 * @curs: The cursor initialized using ttm_bo_lru_cursor_init() and 1042 * ttm_bo_lru_cursor_first(). 1043 * 1044 * Return: A pointer to a locked and reference-counted buffer object, 1045 * or NULL if none could be found and looping should be terminated. 1046 */ 1047 struct ttm_buffer_object *ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs) 1048 { 1049 return __ttm_bo_lru_cursor_next(curs); 1050 } 1051 EXPORT_SYMBOL(ttm_bo_lru_cursor_next); 1052 1053 /** 1054 * ttm_bo_lru_cursor_first() - Start iterating a manager's LRU lists 1055 * to find and lock buffer object. 1056 * @curs: The cursor initialized using ttm_bo_lru_cursor_init(). 1057 * 1058 * Return: A pointer to a locked and reference-counted buffer object, 1059 * or NULL if none could be found and looping should be terminated. 1060 */ 1061 struct ttm_buffer_object *ttm_bo_lru_cursor_first(struct ttm_bo_lru_cursor *curs) 1062 { 1063 ttm_bo_lru_cursor_cleanup_bo(curs); 1064 return __ttm_bo_lru_cursor_next(curs); 1065 } 1066 EXPORT_SYMBOL(ttm_bo_lru_cursor_first); 1067 1068 /** 1069 * ttm_bo_shrink() - Helper to shrink a ttm buffer object. 1070 * @ctx: The struct ttm_operation_ctx used for the shrinking operation. 1071 * @bo: The buffer object. 1072 * @flags: Flags governing the shrinking behaviour. 1073 * 1074 * The function uses the ttm_tt_back_up functionality to back up or 1075 * purge a struct ttm_tt. If the bo is not in system, it's first 1076 * moved there. 1077 * 1078 * Return: The number of pages shrunken or purged, or 1079 * negative error code on failure. 1080 */ 1081 long ttm_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo, 1082 const struct ttm_bo_shrink_flags flags) 1083 { 1084 static const struct ttm_place sys_placement_flags = { 1085 .fpfn = 0, 1086 .lpfn = 0, 1087 .mem_type = TTM_PL_SYSTEM, 1088 .flags = 0, 1089 }; 1090 static struct ttm_placement sys_placement = { 1091 .num_placement = 1, 1092 .placement = &sys_placement_flags, 1093 }; 1094 struct ttm_device *bdev = bo->bdev; 1095 long lret; 1096 1097 dma_resv_assert_held(bo->base.resv); 1098 1099 if (flags.allow_move && bo->resource->mem_type != TTM_PL_SYSTEM) { 1100 int ret = ttm_bo_validate(bo, &sys_placement, ctx); 1101 1102 /* Consider -ENOMEM and -ENOSPC non-fatal. */ 1103 if (ret) { 1104 if (ret == -ENOMEM || ret == -ENOSPC) 1105 ret = -EBUSY; 1106 return ret; 1107 } 1108 } 1109 1110 ttm_bo_unmap_virtual(bo); 1111 lret = ttm_bo_wait_ctx(bo, ctx); 1112 if (lret < 0) 1113 return lret; 1114 1115 if (bo->bulk_move) { 1116 spin_lock(&bdev->lru_lock); 1117 ttm_resource_del_bulk_move(bo->resource, bo); 1118 spin_unlock(&bdev->lru_lock); 1119 } 1120 1121 lret = ttm_tt_backup(bdev, bo->ttm, (struct ttm_backup_flags) 1122 {.purge = flags.purge, 1123 .writeback = flags.writeback}); 1124 1125 if (lret <= 0 && bo->bulk_move) { 1126 spin_lock(&bdev->lru_lock); 1127 ttm_resource_add_bulk_move(bo->resource, bo); 1128 spin_unlock(&bdev->lru_lock); 1129 } 1130 1131 if (lret < 0 && lret != -EINTR) 1132 return -EBUSY; 1133 1134 return lret; 1135 } 1136 EXPORT_SYMBOL(ttm_bo_shrink); 1137 1138 /** 1139 * ttm_bo_shrink_suitable() - Whether a bo is suitable for shinking 1140 * @ctx: The struct ttm_operation_ctx governing the shrinking. 1141 * @bo: The candidate for shrinking. 1142 * 1143 * Check whether the object, given the information available to TTM, 1144 * is suitable for shinking, This function can and should be used 1145 * before attempting to shrink an object. 1146 * 1147 * Return: true if suitable. false if not. 1148 */ 1149 bool ttm_bo_shrink_suitable(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx) 1150 { 1151 return bo->ttm && ttm_tt_is_populated(bo->ttm) && !bo->pin_count && 1152 (!ctx->no_wait_gpu || 1153 dma_resv_test_signaled(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP)); 1154 } 1155 EXPORT_SYMBOL(ttm_bo_shrink_suitable); 1156 1157 /** 1158 * ttm_bo_shrink_avoid_wait() - Whether to avoid waiting for GPU 1159 * during shrinking 1160 * 1161 * In some situations, like direct reclaim, waiting (in particular gpu waiting) 1162 * should be avoided since it may stall a system that could otherwise make progress 1163 * shrinking something else less time consuming. 1164 * 1165 * Return: true if gpu waiting should be avoided, false if not. 1166 */ 1167 bool ttm_bo_shrink_avoid_wait(void) 1168 { 1169 return !current_is_kswapd(); 1170 } 1171 EXPORT_SYMBOL(ttm_bo_shrink_avoid_wait); 1172