1 /************************************************************************** 2 * 3 * Copyright (c) 2006-2009 VMware, Inc., Palo Alto, CA., USA 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 21 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 24 * USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 /* 28 * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com> 29 */ 30 31 #include "ttm/ttm_module.h" 32 #include "ttm/ttm_bo_driver.h" 33 #include "ttm/ttm_placement.h" 34 #include <linux/jiffies.h> 35 #include <linux/slab.h> 36 #include <linux/sched.h> 37 #include <linux/mm.h> 38 #include <linux/file.h> 39 #include <linux/module.h> 40 #include <linux/atomic.h> 41 42 #define TTM_ASSERT_LOCKED(param) 43 #define TTM_DEBUG(fmt, arg...) 44 #define TTM_BO_HASH_ORDER 13 45 46 static int ttm_bo_setup_vm(struct ttm_buffer_object *bo); 47 static int ttm_bo_swapout(struct ttm_mem_shrink *shrink); 48 static void ttm_bo_global_kobj_release(struct kobject *kobj); 49 50 static struct attribute ttm_bo_count = { 51 .name = "bo_count", 52 .mode = S_IRUGO 53 }; 54 55 static inline int ttm_mem_type_from_flags(uint32_t flags, uint32_t *mem_type) 56 { 57 int i; 58 59 for (i = 0; i <= TTM_PL_PRIV5; i++) 60 if (flags & (1 << i)) { 61 *mem_type = i; 62 return 0; 63 } 64 return -EINVAL; 65 } 66 67 static void ttm_mem_type_debug(struct ttm_bo_device *bdev, int mem_type) 68 { 69 struct ttm_mem_type_manager *man = &bdev->man[mem_type]; 70 71 printk(KERN_ERR TTM_PFX " has_type: %d\n", man->has_type); 72 printk(KERN_ERR TTM_PFX " use_type: %d\n", man->use_type); 73 printk(KERN_ERR TTM_PFX " flags: 0x%08X\n", man->flags); 74 printk(KERN_ERR TTM_PFX " gpu_offset: 0x%08lX\n", man->gpu_offset); 75 printk(KERN_ERR TTM_PFX " size: %llu\n", man->size); 76 printk(KERN_ERR TTM_PFX " available_caching: 0x%08X\n", 77 man->available_caching); 78 printk(KERN_ERR TTM_PFX " default_caching: 0x%08X\n", 79 man->default_caching); 80 if (mem_type != TTM_PL_SYSTEM) 81 (*man->func->debug)(man, TTM_PFX); 82 } 83 84 static void ttm_bo_mem_space_debug(struct ttm_buffer_object *bo, 85 struct ttm_placement *placement) 86 { 87 int i, ret, mem_type; 88 89 printk(KERN_ERR TTM_PFX "No space for %p (%lu pages, %luK, %luM)\n", 90 bo, bo->mem.num_pages, bo->mem.size >> 10, 91 bo->mem.size >> 20); 92 for (i = 0; i < placement->num_placement; i++) { 93 ret = ttm_mem_type_from_flags(placement->placement[i], 94 &mem_type); 95 if (ret) 96 return; 97 printk(KERN_ERR TTM_PFX " placement[%d]=0x%08X (%d)\n", 98 i, placement->placement[i], mem_type); 99 ttm_mem_type_debug(bo->bdev, mem_type); 100 } 101 } 102 103 static ssize_t ttm_bo_global_show(struct kobject *kobj, 104 struct attribute *attr, 105 char *buffer) 106 { 107 struct ttm_bo_global *glob = 108 container_of(kobj, struct ttm_bo_global, kobj); 109 110 return snprintf(buffer, PAGE_SIZE, "%lu\n", 111 (unsigned long) atomic_read(&glob->bo_count)); 112 } 113 114 static struct attribute *ttm_bo_global_attrs[] = { 115 &ttm_bo_count, 116 NULL 117 }; 118 119 static const struct sysfs_ops ttm_bo_global_ops = { 120 .show = &ttm_bo_global_show 121 }; 122 123 static struct kobj_type ttm_bo_glob_kobj_type = { 124 .release = &ttm_bo_global_kobj_release, 125 .sysfs_ops = &ttm_bo_global_ops, 126 .default_attrs = ttm_bo_global_attrs 127 }; 128 129 130 static inline uint32_t ttm_bo_type_flags(unsigned type) 131 { 132 return 1 << (type); 133 } 134 135 static void ttm_bo_release_list(struct kref *list_kref) 136 { 137 struct ttm_buffer_object *bo = 138 container_of(list_kref, struct ttm_buffer_object, list_kref); 139 struct ttm_bo_device *bdev = bo->bdev; 140 141 BUG_ON(atomic_read(&bo->list_kref.refcount)); 142 BUG_ON(atomic_read(&bo->kref.refcount)); 143 BUG_ON(atomic_read(&bo->cpu_writers)); 144 BUG_ON(bo->sync_obj != NULL); 145 BUG_ON(bo->mem.mm_node != NULL); 146 BUG_ON(!list_empty(&bo->lru)); 147 BUG_ON(!list_empty(&bo->ddestroy)); 148 149 if (bo->ttm) 150 ttm_tt_destroy(bo->ttm); 151 atomic_dec(&bo->glob->bo_count); 152 if (bo->destroy) 153 bo->destroy(bo); 154 else { 155 ttm_mem_global_free(bdev->glob->mem_glob, bo->acc_size); 156 kfree(bo); 157 } 158 } 159 160 int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo, bool interruptible) 161 { 162 if (interruptible) { 163 return wait_event_interruptible(bo->event_queue, 164 atomic_read(&bo->reserved) == 0); 165 } else { 166 wait_event(bo->event_queue, atomic_read(&bo->reserved) == 0); 167 return 0; 168 } 169 } 170 EXPORT_SYMBOL(ttm_bo_wait_unreserved); 171 172 void ttm_bo_add_to_lru(struct ttm_buffer_object *bo) 173 { 174 struct ttm_bo_device *bdev = bo->bdev; 175 struct ttm_mem_type_manager *man; 176 177 BUG_ON(!atomic_read(&bo->reserved)); 178 179 if (!(bo->mem.placement & TTM_PL_FLAG_NO_EVICT)) { 180 181 BUG_ON(!list_empty(&bo->lru)); 182 183 man = &bdev->man[bo->mem.mem_type]; 184 list_add_tail(&bo->lru, &man->lru); 185 kref_get(&bo->list_kref); 186 187 if (bo->ttm != NULL) { 188 list_add_tail(&bo->swap, &bo->glob->swap_lru); 189 kref_get(&bo->list_kref); 190 } 191 } 192 } 193 194 int ttm_bo_del_from_lru(struct ttm_buffer_object *bo) 195 { 196 int put_count = 0; 197 198 if (!list_empty(&bo->swap)) { 199 list_del_init(&bo->swap); 200 ++put_count; 201 } 202 if (!list_empty(&bo->lru)) { 203 list_del_init(&bo->lru); 204 ++put_count; 205 } 206 207 /* 208 * TODO: Add a driver hook to delete from 209 * driver-specific LRU's here. 210 */ 211 212 return put_count; 213 } 214 215 int ttm_bo_reserve_locked(struct ttm_buffer_object *bo, 216 bool interruptible, 217 bool no_wait, bool use_sequence, uint32_t sequence) 218 { 219 struct ttm_bo_global *glob = bo->glob; 220 int ret; 221 222 while (unlikely(atomic_cmpxchg(&bo->reserved, 0, 1) != 0)) { 223 /** 224 * Deadlock avoidance for multi-bo reserving. 225 */ 226 if (use_sequence && bo->seq_valid) { 227 /** 228 * We've already reserved this one. 229 */ 230 if (unlikely(sequence == bo->val_seq)) 231 return -EDEADLK; 232 /** 233 * Already reserved by a thread that will not back 234 * off for us. We need to back off. 235 */ 236 if (unlikely(sequence - bo->val_seq < (1 << 31))) 237 return -EAGAIN; 238 } 239 240 if (no_wait) 241 return -EBUSY; 242 243 spin_unlock(&glob->lru_lock); 244 ret = ttm_bo_wait_unreserved(bo, interruptible); 245 spin_lock(&glob->lru_lock); 246 247 if (unlikely(ret)) 248 return ret; 249 } 250 251 if (use_sequence) { 252 /** 253 * Wake up waiters that may need to recheck for deadlock, 254 * if we decreased the sequence number. 255 */ 256 if (unlikely((bo->val_seq - sequence < (1 << 31)) 257 || !bo->seq_valid)) 258 wake_up_all(&bo->event_queue); 259 260 bo->val_seq = sequence; 261 bo->seq_valid = true; 262 } else { 263 bo->seq_valid = false; 264 } 265 266 return 0; 267 } 268 EXPORT_SYMBOL(ttm_bo_reserve); 269 270 static void ttm_bo_ref_bug(struct kref *list_kref) 271 { 272 BUG(); 273 } 274 275 void ttm_bo_list_ref_sub(struct ttm_buffer_object *bo, int count, 276 bool never_free) 277 { 278 kref_sub(&bo->list_kref, count, 279 (never_free) ? ttm_bo_ref_bug : ttm_bo_release_list); 280 } 281 282 int ttm_bo_reserve(struct ttm_buffer_object *bo, 283 bool interruptible, 284 bool no_wait, bool use_sequence, uint32_t sequence) 285 { 286 struct ttm_bo_global *glob = bo->glob; 287 int put_count = 0; 288 int ret; 289 290 spin_lock(&glob->lru_lock); 291 ret = ttm_bo_reserve_locked(bo, interruptible, no_wait, use_sequence, 292 sequence); 293 if (likely(ret == 0)) 294 put_count = ttm_bo_del_from_lru(bo); 295 spin_unlock(&glob->lru_lock); 296 297 ttm_bo_list_ref_sub(bo, put_count, true); 298 299 return ret; 300 } 301 302 void ttm_bo_unreserve_locked(struct ttm_buffer_object *bo) 303 { 304 ttm_bo_add_to_lru(bo); 305 atomic_set(&bo->reserved, 0); 306 wake_up_all(&bo->event_queue); 307 } 308 309 void ttm_bo_unreserve(struct ttm_buffer_object *bo) 310 { 311 struct ttm_bo_global *glob = bo->glob; 312 313 spin_lock(&glob->lru_lock); 314 ttm_bo_unreserve_locked(bo); 315 spin_unlock(&glob->lru_lock); 316 } 317 EXPORT_SYMBOL(ttm_bo_unreserve); 318 319 /* 320 * Call bo->mutex locked. 321 */ 322 static int ttm_bo_add_ttm(struct ttm_buffer_object *bo, bool zero_alloc) 323 { 324 struct ttm_bo_device *bdev = bo->bdev; 325 struct ttm_bo_global *glob = bo->glob; 326 int ret = 0; 327 uint32_t page_flags = 0; 328 329 TTM_ASSERT_LOCKED(&bo->mutex); 330 bo->ttm = NULL; 331 332 if (bdev->need_dma32) 333 page_flags |= TTM_PAGE_FLAG_DMA32; 334 335 switch (bo->type) { 336 case ttm_bo_type_device: 337 if (zero_alloc) 338 page_flags |= TTM_PAGE_FLAG_ZERO_ALLOC; 339 case ttm_bo_type_kernel: 340 bo->ttm = ttm_tt_create(bdev, bo->num_pages << PAGE_SHIFT, 341 page_flags, glob->dummy_read_page); 342 if (unlikely(bo->ttm == NULL)) 343 ret = -ENOMEM; 344 break; 345 case ttm_bo_type_user: 346 bo->ttm = ttm_tt_create(bdev, bo->num_pages << PAGE_SHIFT, 347 page_flags | TTM_PAGE_FLAG_USER, 348 glob->dummy_read_page); 349 if (unlikely(bo->ttm == NULL)) { 350 ret = -ENOMEM; 351 break; 352 } 353 354 ret = ttm_tt_set_user(bo->ttm, current, 355 bo->buffer_start, bo->num_pages); 356 if (unlikely(ret != 0)) { 357 ttm_tt_destroy(bo->ttm); 358 bo->ttm = NULL; 359 } 360 break; 361 default: 362 printk(KERN_ERR TTM_PFX "Illegal buffer object type\n"); 363 ret = -EINVAL; 364 break; 365 } 366 367 return ret; 368 } 369 370 static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo, 371 struct ttm_mem_reg *mem, 372 bool evict, bool interruptible, 373 bool no_wait_reserve, bool no_wait_gpu) 374 { 375 struct ttm_bo_device *bdev = bo->bdev; 376 bool old_is_pci = ttm_mem_reg_is_pci(bdev, &bo->mem); 377 bool new_is_pci = ttm_mem_reg_is_pci(bdev, mem); 378 struct ttm_mem_type_manager *old_man = &bdev->man[bo->mem.mem_type]; 379 struct ttm_mem_type_manager *new_man = &bdev->man[mem->mem_type]; 380 int ret = 0; 381 382 if (old_is_pci || new_is_pci || 383 ((mem->placement & bo->mem.placement & TTM_PL_MASK_CACHING) == 0)) { 384 ret = ttm_mem_io_lock(old_man, true); 385 if (unlikely(ret != 0)) 386 goto out_err; 387 ttm_bo_unmap_virtual_locked(bo); 388 ttm_mem_io_unlock(old_man); 389 } 390 391 /* 392 * Create and bind a ttm if required. 393 */ 394 395 if (!(new_man->flags & TTM_MEMTYPE_FLAG_FIXED)) { 396 if (bo->ttm == NULL) { 397 bool zero = !(old_man->flags & TTM_MEMTYPE_FLAG_FIXED); 398 ret = ttm_bo_add_ttm(bo, zero); 399 if (ret) 400 goto out_err; 401 } 402 403 ret = ttm_tt_set_placement_caching(bo->ttm, mem->placement); 404 if (ret) 405 goto out_err; 406 407 if (mem->mem_type != TTM_PL_SYSTEM) { 408 ret = ttm_tt_bind(bo->ttm, mem); 409 if (ret) 410 goto out_err; 411 } 412 413 if (bo->mem.mem_type == TTM_PL_SYSTEM) { 414 if (bdev->driver->move_notify) 415 bdev->driver->move_notify(bo, mem); 416 bo->mem = *mem; 417 mem->mm_node = NULL; 418 goto moved; 419 } 420 } 421 422 if (bdev->driver->move_notify) 423 bdev->driver->move_notify(bo, mem); 424 425 if (!(old_man->flags & TTM_MEMTYPE_FLAG_FIXED) && 426 !(new_man->flags & TTM_MEMTYPE_FLAG_FIXED)) 427 ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu, mem); 428 else if (bdev->driver->move) 429 ret = bdev->driver->move(bo, evict, interruptible, 430 no_wait_reserve, no_wait_gpu, mem); 431 else 432 ret = ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, mem); 433 434 if (ret) 435 goto out_err; 436 437 moved: 438 if (bo->evicted) { 439 ret = bdev->driver->invalidate_caches(bdev, bo->mem.placement); 440 if (ret) 441 printk(KERN_ERR TTM_PFX "Can not flush read caches\n"); 442 bo->evicted = false; 443 } 444 445 if (bo->mem.mm_node) { 446 bo->offset = (bo->mem.start << PAGE_SHIFT) + 447 bdev->man[bo->mem.mem_type].gpu_offset; 448 bo->cur_placement = bo->mem.placement; 449 } else 450 bo->offset = 0; 451 452 return 0; 453 454 out_err: 455 new_man = &bdev->man[bo->mem.mem_type]; 456 if ((new_man->flags & TTM_MEMTYPE_FLAG_FIXED) && bo->ttm) { 457 ttm_tt_unbind(bo->ttm); 458 ttm_tt_destroy(bo->ttm); 459 bo->ttm = NULL; 460 } 461 462 return ret; 463 } 464 465 /** 466 * Call bo::reserved. 467 * Will release GPU memory type usage on destruction. 468 * This is the place to put in driver specific hooks to release 469 * driver private resources. 470 * Will release the bo::reserved lock. 471 */ 472 473 static void ttm_bo_cleanup_memtype_use(struct ttm_buffer_object *bo) 474 { 475 if (bo->ttm) { 476 ttm_tt_unbind(bo->ttm); 477 ttm_tt_destroy(bo->ttm); 478 bo->ttm = NULL; 479 } 480 ttm_bo_mem_put(bo, &bo->mem); 481 482 atomic_set(&bo->reserved, 0); 483 484 /* 485 * Make processes trying to reserve really pick it up. 486 */ 487 smp_mb__after_atomic_dec(); 488 wake_up_all(&bo->event_queue); 489 } 490 491 static void ttm_bo_cleanup_refs_or_queue(struct ttm_buffer_object *bo) 492 { 493 struct ttm_bo_device *bdev = bo->bdev; 494 struct ttm_bo_global *glob = bo->glob; 495 struct ttm_bo_driver *driver; 496 void *sync_obj = NULL; 497 void *sync_obj_arg; 498 int put_count; 499 int ret; 500 501 spin_lock(&bdev->fence_lock); 502 (void) ttm_bo_wait(bo, false, false, true); 503 if (!bo->sync_obj) { 504 505 spin_lock(&glob->lru_lock); 506 507 /** 508 * Lock inversion between bo:reserve and bdev::fence_lock here, 509 * but that's OK, since we're only trylocking. 510 */ 511 512 ret = ttm_bo_reserve_locked(bo, false, true, false, 0); 513 514 if (unlikely(ret == -EBUSY)) 515 goto queue; 516 517 spin_unlock(&bdev->fence_lock); 518 put_count = ttm_bo_del_from_lru(bo); 519 520 spin_unlock(&glob->lru_lock); 521 ttm_bo_cleanup_memtype_use(bo); 522 523 ttm_bo_list_ref_sub(bo, put_count, true); 524 525 return; 526 } else { 527 spin_lock(&glob->lru_lock); 528 } 529 queue: 530 driver = bdev->driver; 531 if (bo->sync_obj) 532 sync_obj = driver->sync_obj_ref(bo->sync_obj); 533 sync_obj_arg = bo->sync_obj_arg; 534 535 kref_get(&bo->list_kref); 536 list_add_tail(&bo->ddestroy, &bdev->ddestroy); 537 spin_unlock(&glob->lru_lock); 538 spin_unlock(&bdev->fence_lock); 539 540 if (sync_obj) { 541 driver->sync_obj_flush(sync_obj, sync_obj_arg); 542 driver->sync_obj_unref(&sync_obj); 543 } 544 schedule_delayed_work(&bdev->wq, 545 ((HZ / 100) < 1) ? 1 : HZ / 100); 546 } 547 548 /** 549 * function ttm_bo_cleanup_refs 550 * If bo idle, remove from delayed- and lru lists, and unref. 551 * If not idle, do nothing. 552 * 553 * @interruptible Any sleeps should occur interruptibly. 554 * @no_wait_reserve Never wait for reserve. Return -EBUSY instead. 555 * @no_wait_gpu Never wait for gpu. Return -EBUSY instead. 556 */ 557 558 static int ttm_bo_cleanup_refs(struct ttm_buffer_object *bo, 559 bool interruptible, 560 bool no_wait_reserve, 561 bool no_wait_gpu) 562 { 563 struct ttm_bo_device *bdev = bo->bdev; 564 struct ttm_bo_global *glob = bo->glob; 565 int put_count; 566 int ret = 0; 567 568 retry: 569 spin_lock(&bdev->fence_lock); 570 ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu); 571 spin_unlock(&bdev->fence_lock); 572 573 if (unlikely(ret != 0)) 574 return ret; 575 576 spin_lock(&glob->lru_lock); 577 ret = ttm_bo_reserve_locked(bo, interruptible, 578 no_wait_reserve, false, 0); 579 580 if (unlikely(ret != 0) || list_empty(&bo->ddestroy)) { 581 spin_unlock(&glob->lru_lock); 582 return ret; 583 } 584 585 /** 586 * We can re-check for sync object without taking 587 * the bo::lock since setting the sync object requires 588 * also bo::reserved. A busy object at this point may 589 * be caused by another thread recently starting an accelerated 590 * eviction. 591 */ 592 593 if (unlikely(bo->sync_obj)) { 594 atomic_set(&bo->reserved, 0); 595 wake_up_all(&bo->event_queue); 596 spin_unlock(&glob->lru_lock); 597 goto retry; 598 } 599 600 put_count = ttm_bo_del_from_lru(bo); 601 list_del_init(&bo->ddestroy); 602 ++put_count; 603 604 spin_unlock(&glob->lru_lock); 605 ttm_bo_cleanup_memtype_use(bo); 606 607 ttm_bo_list_ref_sub(bo, put_count, true); 608 609 return 0; 610 } 611 612 /** 613 * Traverse the delayed list, and call ttm_bo_cleanup_refs on all 614 * encountered buffers. 615 */ 616 617 static int ttm_bo_delayed_delete(struct ttm_bo_device *bdev, bool remove_all) 618 { 619 struct ttm_bo_global *glob = bdev->glob; 620 struct ttm_buffer_object *entry = NULL; 621 int ret = 0; 622 623 spin_lock(&glob->lru_lock); 624 if (list_empty(&bdev->ddestroy)) 625 goto out_unlock; 626 627 entry = list_first_entry(&bdev->ddestroy, 628 struct ttm_buffer_object, ddestroy); 629 kref_get(&entry->list_kref); 630 631 for (;;) { 632 struct ttm_buffer_object *nentry = NULL; 633 634 if (entry->ddestroy.next != &bdev->ddestroy) { 635 nentry = list_first_entry(&entry->ddestroy, 636 struct ttm_buffer_object, ddestroy); 637 kref_get(&nentry->list_kref); 638 } 639 640 spin_unlock(&glob->lru_lock); 641 ret = ttm_bo_cleanup_refs(entry, false, !remove_all, 642 !remove_all); 643 kref_put(&entry->list_kref, ttm_bo_release_list); 644 entry = nentry; 645 646 if (ret || !entry) 647 goto out; 648 649 spin_lock(&glob->lru_lock); 650 if (list_empty(&entry->ddestroy)) 651 break; 652 } 653 654 out_unlock: 655 spin_unlock(&glob->lru_lock); 656 out: 657 if (entry) 658 kref_put(&entry->list_kref, ttm_bo_release_list); 659 return ret; 660 } 661 662 static void ttm_bo_delayed_workqueue(struct work_struct *work) 663 { 664 struct ttm_bo_device *bdev = 665 container_of(work, struct ttm_bo_device, wq.work); 666 667 if (ttm_bo_delayed_delete(bdev, false)) { 668 schedule_delayed_work(&bdev->wq, 669 ((HZ / 100) < 1) ? 1 : HZ / 100); 670 } 671 } 672 673 static void ttm_bo_release(struct kref *kref) 674 { 675 struct ttm_buffer_object *bo = 676 container_of(kref, struct ttm_buffer_object, kref); 677 struct ttm_bo_device *bdev = bo->bdev; 678 struct ttm_mem_type_manager *man = &bdev->man[bo->mem.mem_type]; 679 680 if (likely(bo->vm_node != NULL)) { 681 rb_erase(&bo->vm_rb, &bdev->addr_space_rb); 682 drm_mm_put_block(bo->vm_node); 683 bo->vm_node = NULL; 684 } 685 write_unlock(&bdev->vm_lock); 686 ttm_mem_io_lock(man, false); 687 ttm_mem_io_free_vm(bo); 688 ttm_mem_io_unlock(man); 689 ttm_bo_cleanup_refs_or_queue(bo); 690 kref_put(&bo->list_kref, ttm_bo_release_list); 691 write_lock(&bdev->vm_lock); 692 } 693 694 void ttm_bo_unref(struct ttm_buffer_object **p_bo) 695 { 696 struct ttm_buffer_object *bo = *p_bo; 697 struct ttm_bo_device *bdev = bo->bdev; 698 699 *p_bo = NULL; 700 write_lock(&bdev->vm_lock); 701 kref_put(&bo->kref, ttm_bo_release); 702 write_unlock(&bdev->vm_lock); 703 } 704 EXPORT_SYMBOL(ttm_bo_unref); 705 706 int ttm_bo_lock_delayed_workqueue(struct ttm_bo_device *bdev) 707 { 708 return cancel_delayed_work_sync(&bdev->wq); 709 } 710 EXPORT_SYMBOL(ttm_bo_lock_delayed_workqueue); 711 712 void ttm_bo_unlock_delayed_workqueue(struct ttm_bo_device *bdev, int resched) 713 { 714 if (resched) 715 schedule_delayed_work(&bdev->wq, 716 ((HZ / 100) < 1) ? 1 : HZ / 100); 717 } 718 EXPORT_SYMBOL(ttm_bo_unlock_delayed_workqueue); 719 720 static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible, 721 bool no_wait_reserve, bool no_wait_gpu) 722 { 723 struct ttm_bo_device *bdev = bo->bdev; 724 struct ttm_mem_reg evict_mem; 725 struct ttm_placement placement; 726 int ret = 0; 727 728 spin_lock(&bdev->fence_lock); 729 ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu); 730 spin_unlock(&bdev->fence_lock); 731 732 if (unlikely(ret != 0)) { 733 if (ret != -ERESTARTSYS) { 734 printk(KERN_ERR TTM_PFX 735 "Failed to expire sync object before " 736 "buffer eviction.\n"); 737 } 738 goto out; 739 } 740 741 BUG_ON(!atomic_read(&bo->reserved)); 742 743 evict_mem = bo->mem; 744 evict_mem.mm_node = NULL; 745 evict_mem.bus.io_reserved_vm = false; 746 evict_mem.bus.io_reserved_count = 0; 747 748 placement.fpfn = 0; 749 placement.lpfn = 0; 750 placement.num_placement = 0; 751 placement.num_busy_placement = 0; 752 bdev->driver->evict_flags(bo, &placement); 753 ret = ttm_bo_mem_space(bo, &placement, &evict_mem, interruptible, 754 no_wait_reserve, no_wait_gpu); 755 if (ret) { 756 if (ret != -ERESTARTSYS) { 757 printk(KERN_ERR TTM_PFX 758 "Failed to find memory space for " 759 "buffer 0x%p eviction.\n", bo); 760 ttm_bo_mem_space_debug(bo, &placement); 761 } 762 goto out; 763 } 764 765 ret = ttm_bo_handle_move_mem(bo, &evict_mem, true, interruptible, 766 no_wait_reserve, no_wait_gpu); 767 if (ret) { 768 if (ret != -ERESTARTSYS) 769 printk(KERN_ERR TTM_PFX "Buffer eviction failed\n"); 770 ttm_bo_mem_put(bo, &evict_mem); 771 goto out; 772 } 773 bo->evicted = true; 774 out: 775 return ret; 776 } 777 778 static int ttm_mem_evict_first(struct ttm_bo_device *bdev, 779 uint32_t mem_type, 780 bool interruptible, bool no_wait_reserve, 781 bool no_wait_gpu) 782 { 783 struct ttm_bo_global *glob = bdev->glob; 784 struct ttm_mem_type_manager *man = &bdev->man[mem_type]; 785 struct ttm_buffer_object *bo; 786 int ret, put_count = 0; 787 788 retry: 789 spin_lock(&glob->lru_lock); 790 if (list_empty(&man->lru)) { 791 spin_unlock(&glob->lru_lock); 792 return -EBUSY; 793 } 794 795 bo = list_first_entry(&man->lru, struct ttm_buffer_object, lru); 796 kref_get(&bo->list_kref); 797 798 if (!list_empty(&bo->ddestroy)) { 799 spin_unlock(&glob->lru_lock); 800 ret = ttm_bo_cleanup_refs(bo, interruptible, 801 no_wait_reserve, no_wait_gpu); 802 kref_put(&bo->list_kref, ttm_bo_release_list); 803 804 if (likely(ret == 0 || ret == -ERESTARTSYS)) 805 return ret; 806 807 goto retry; 808 } 809 810 ret = ttm_bo_reserve_locked(bo, false, no_wait_reserve, false, 0); 811 812 if (unlikely(ret == -EBUSY)) { 813 spin_unlock(&glob->lru_lock); 814 if (likely(!no_wait_gpu)) 815 ret = ttm_bo_wait_unreserved(bo, interruptible); 816 817 kref_put(&bo->list_kref, ttm_bo_release_list); 818 819 /** 820 * We *need* to retry after releasing the lru lock. 821 */ 822 823 if (unlikely(ret != 0)) 824 return ret; 825 goto retry; 826 } 827 828 put_count = ttm_bo_del_from_lru(bo); 829 spin_unlock(&glob->lru_lock); 830 831 BUG_ON(ret != 0); 832 833 ttm_bo_list_ref_sub(bo, put_count, true); 834 835 ret = ttm_bo_evict(bo, interruptible, no_wait_reserve, no_wait_gpu); 836 ttm_bo_unreserve(bo); 837 838 kref_put(&bo->list_kref, ttm_bo_release_list); 839 return ret; 840 } 841 842 void ttm_bo_mem_put(struct ttm_buffer_object *bo, struct ttm_mem_reg *mem) 843 { 844 struct ttm_mem_type_manager *man = &bo->bdev->man[mem->mem_type]; 845 846 if (mem->mm_node) 847 (*man->func->put_node)(man, mem); 848 } 849 EXPORT_SYMBOL(ttm_bo_mem_put); 850 851 /** 852 * Repeatedly evict memory from the LRU for @mem_type until we create enough 853 * space, or we've evicted everything and there isn't enough space. 854 */ 855 static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo, 856 uint32_t mem_type, 857 struct ttm_placement *placement, 858 struct ttm_mem_reg *mem, 859 bool interruptible, 860 bool no_wait_reserve, 861 bool no_wait_gpu) 862 { 863 struct ttm_bo_device *bdev = bo->bdev; 864 struct ttm_mem_type_manager *man = &bdev->man[mem_type]; 865 int ret; 866 867 do { 868 ret = (*man->func->get_node)(man, bo, placement, mem); 869 if (unlikely(ret != 0)) 870 return ret; 871 if (mem->mm_node) 872 break; 873 ret = ttm_mem_evict_first(bdev, mem_type, interruptible, 874 no_wait_reserve, no_wait_gpu); 875 if (unlikely(ret != 0)) 876 return ret; 877 } while (1); 878 if (mem->mm_node == NULL) 879 return -ENOMEM; 880 mem->mem_type = mem_type; 881 return 0; 882 } 883 884 static uint32_t ttm_bo_select_caching(struct ttm_mem_type_manager *man, 885 uint32_t cur_placement, 886 uint32_t proposed_placement) 887 { 888 uint32_t caching = proposed_placement & TTM_PL_MASK_CACHING; 889 uint32_t result = proposed_placement & ~TTM_PL_MASK_CACHING; 890 891 /** 892 * Keep current caching if possible. 893 */ 894 895 if ((cur_placement & caching) != 0) 896 result |= (cur_placement & caching); 897 else if ((man->default_caching & caching) != 0) 898 result |= man->default_caching; 899 else if ((TTM_PL_FLAG_CACHED & caching) != 0) 900 result |= TTM_PL_FLAG_CACHED; 901 else if ((TTM_PL_FLAG_WC & caching) != 0) 902 result |= TTM_PL_FLAG_WC; 903 else if ((TTM_PL_FLAG_UNCACHED & caching) != 0) 904 result |= TTM_PL_FLAG_UNCACHED; 905 906 return result; 907 } 908 909 static bool ttm_bo_mt_compatible(struct ttm_mem_type_manager *man, 910 bool disallow_fixed, 911 uint32_t mem_type, 912 uint32_t proposed_placement, 913 uint32_t *masked_placement) 914 { 915 uint32_t cur_flags = ttm_bo_type_flags(mem_type); 916 917 if ((man->flags & TTM_MEMTYPE_FLAG_FIXED) && disallow_fixed) 918 return false; 919 920 if ((cur_flags & proposed_placement & TTM_PL_MASK_MEM) == 0) 921 return false; 922 923 if ((proposed_placement & man->available_caching) == 0) 924 return false; 925 926 cur_flags |= (proposed_placement & man->available_caching); 927 928 *masked_placement = cur_flags; 929 return true; 930 } 931 932 /** 933 * Creates space for memory region @mem according to its type. 934 * 935 * This function first searches for free space in compatible memory types in 936 * the priority order defined by the driver. If free space isn't found, then 937 * ttm_bo_mem_force_space is attempted in priority order to evict and find 938 * space. 939 */ 940 int ttm_bo_mem_space(struct ttm_buffer_object *bo, 941 struct ttm_placement *placement, 942 struct ttm_mem_reg *mem, 943 bool interruptible, bool no_wait_reserve, 944 bool no_wait_gpu) 945 { 946 struct ttm_bo_device *bdev = bo->bdev; 947 struct ttm_mem_type_manager *man; 948 uint32_t mem_type = TTM_PL_SYSTEM; 949 uint32_t cur_flags = 0; 950 bool type_found = false; 951 bool type_ok = false; 952 bool has_erestartsys = false; 953 int i, ret; 954 955 mem->mm_node = NULL; 956 for (i = 0; i < placement->num_placement; ++i) { 957 ret = ttm_mem_type_from_flags(placement->placement[i], 958 &mem_type); 959 if (ret) 960 return ret; 961 man = &bdev->man[mem_type]; 962 963 type_ok = ttm_bo_mt_compatible(man, 964 bo->type == ttm_bo_type_user, 965 mem_type, 966 placement->placement[i], 967 &cur_flags); 968 969 if (!type_ok) 970 continue; 971 972 cur_flags = ttm_bo_select_caching(man, bo->mem.placement, 973 cur_flags); 974 /* 975 * Use the access and other non-mapping-related flag bits from 976 * the memory placement flags to the current flags 977 */ 978 ttm_flag_masked(&cur_flags, placement->placement[i], 979 ~TTM_PL_MASK_MEMTYPE); 980 981 if (mem_type == TTM_PL_SYSTEM) 982 break; 983 984 if (man->has_type && man->use_type) { 985 type_found = true; 986 ret = (*man->func->get_node)(man, bo, placement, mem); 987 if (unlikely(ret)) 988 return ret; 989 } 990 if (mem->mm_node) 991 break; 992 } 993 994 if ((type_ok && (mem_type == TTM_PL_SYSTEM)) || mem->mm_node) { 995 mem->mem_type = mem_type; 996 mem->placement = cur_flags; 997 return 0; 998 } 999 1000 if (!type_found) 1001 return -EINVAL; 1002 1003 for (i = 0; i < placement->num_busy_placement; ++i) { 1004 ret = ttm_mem_type_from_flags(placement->busy_placement[i], 1005 &mem_type); 1006 if (ret) 1007 return ret; 1008 man = &bdev->man[mem_type]; 1009 if (!man->has_type) 1010 continue; 1011 if (!ttm_bo_mt_compatible(man, 1012 bo->type == ttm_bo_type_user, 1013 mem_type, 1014 placement->busy_placement[i], 1015 &cur_flags)) 1016 continue; 1017 1018 cur_flags = ttm_bo_select_caching(man, bo->mem.placement, 1019 cur_flags); 1020 /* 1021 * Use the access and other non-mapping-related flag bits from 1022 * the memory placement flags to the current flags 1023 */ 1024 ttm_flag_masked(&cur_flags, placement->busy_placement[i], 1025 ~TTM_PL_MASK_MEMTYPE); 1026 1027 1028 if (mem_type == TTM_PL_SYSTEM) { 1029 mem->mem_type = mem_type; 1030 mem->placement = cur_flags; 1031 mem->mm_node = NULL; 1032 return 0; 1033 } 1034 1035 ret = ttm_bo_mem_force_space(bo, mem_type, placement, mem, 1036 interruptible, no_wait_reserve, no_wait_gpu); 1037 if (ret == 0 && mem->mm_node) { 1038 mem->placement = cur_flags; 1039 return 0; 1040 } 1041 if (ret == -ERESTARTSYS) 1042 has_erestartsys = true; 1043 } 1044 ret = (has_erestartsys) ? -ERESTARTSYS : -ENOMEM; 1045 return ret; 1046 } 1047 EXPORT_SYMBOL(ttm_bo_mem_space); 1048 1049 int ttm_bo_wait_cpu(struct ttm_buffer_object *bo, bool no_wait) 1050 { 1051 if ((atomic_read(&bo->cpu_writers) > 0) && no_wait) 1052 return -EBUSY; 1053 1054 return wait_event_interruptible(bo->event_queue, 1055 atomic_read(&bo->cpu_writers) == 0); 1056 } 1057 EXPORT_SYMBOL(ttm_bo_wait_cpu); 1058 1059 int ttm_bo_move_buffer(struct ttm_buffer_object *bo, 1060 struct ttm_placement *placement, 1061 bool interruptible, bool no_wait_reserve, 1062 bool no_wait_gpu) 1063 { 1064 int ret = 0; 1065 struct ttm_mem_reg mem; 1066 struct ttm_bo_device *bdev = bo->bdev; 1067 1068 BUG_ON(!atomic_read(&bo->reserved)); 1069 1070 /* 1071 * FIXME: It's possible to pipeline buffer moves. 1072 * Have the driver move function wait for idle when necessary, 1073 * instead of doing it here. 1074 */ 1075 spin_lock(&bdev->fence_lock); 1076 ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu); 1077 spin_unlock(&bdev->fence_lock); 1078 if (ret) 1079 return ret; 1080 mem.num_pages = bo->num_pages; 1081 mem.size = mem.num_pages << PAGE_SHIFT; 1082 mem.page_alignment = bo->mem.page_alignment; 1083 mem.bus.io_reserved_vm = false; 1084 mem.bus.io_reserved_count = 0; 1085 /* 1086 * Determine where to move the buffer. 1087 */ 1088 ret = ttm_bo_mem_space(bo, placement, &mem, interruptible, no_wait_reserve, no_wait_gpu); 1089 if (ret) 1090 goto out_unlock; 1091 ret = ttm_bo_handle_move_mem(bo, &mem, false, interruptible, no_wait_reserve, no_wait_gpu); 1092 out_unlock: 1093 if (ret && mem.mm_node) 1094 ttm_bo_mem_put(bo, &mem); 1095 return ret; 1096 } 1097 1098 static int ttm_bo_mem_compat(struct ttm_placement *placement, 1099 struct ttm_mem_reg *mem) 1100 { 1101 int i; 1102 1103 if (mem->mm_node && placement->lpfn != 0 && 1104 (mem->start < placement->fpfn || 1105 mem->start + mem->num_pages > placement->lpfn)) 1106 return -1; 1107 1108 for (i = 0; i < placement->num_placement; i++) { 1109 if ((placement->placement[i] & mem->placement & 1110 TTM_PL_MASK_CACHING) && 1111 (placement->placement[i] & mem->placement & 1112 TTM_PL_MASK_MEM)) 1113 return i; 1114 } 1115 return -1; 1116 } 1117 1118 int ttm_bo_validate(struct ttm_buffer_object *bo, 1119 struct ttm_placement *placement, 1120 bool interruptible, bool no_wait_reserve, 1121 bool no_wait_gpu) 1122 { 1123 int ret; 1124 1125 BUG_ON(!atomic_read(&bo->reserved)); 1126 /* Check that range is valid */ 1127 if (placement->lpfn || placement->fpfn) 1128 if (placement->fpfn > placement->lpfn || 1129 (placement->lpfn - placement->fpfn) < bo->num_pages) 1130 return -EINVAL; 1131 /* 1132 * Check whether we need to move buffer. 1133 */ 1134 ret = ttm_bo_mem_compat(placement, &bo->mem); 1135 if (ret < 0) { 1136 ret = ttm_bo_move_buffer(bo, placement, interruptible, no_wait_reserve, no_wait_gpu); 1137 if (ret) 1138 return ret; 1139 } else { 1140 /* 1141 * Use the access and other non-mapping-related flag bits from 1142 * the compatible memory placement flags to the active flags 1143 */ 1144 ttm_flag_masked(&bo->mem.placement, placement->placement[ret], 1145 ~TTM_PL_MASK_MEMTYPE); 1146 } 1147 /* 1148 * We might need to add a TTM. 1149 */ 1150 if (bo->mem.mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) { 1151 ret = ttm_bo_add_ttm(bo, true); 1152 if (ret) 1153 return ret; 1154 } 1155 return 0; 1156 } 1157 EXPORT_SYMBOL(ttm_bo_validate); 1158 1159 int ttm_bo_check_placement(struct ttm_buffer_object *bo, 1160 struct ttm_placement *placement) 1161 { 1162 BUG_ON((placement->fpfn || placement->lpfn) && 1163 (bo->mem.num_pages > (placement->lpfn - placement->fpfn))); 1164 1165 return 0; 1166 } 1167 1168 int ttm_bo_init(struct ttm_bo_device *bdev, 1169 struct ttm_buffer_object *bo, 1170 unsigned long size, 1171 enum ttm_bo_type type, 1172 struct ttm_placement *placement, 1173 uint32_t page_alignment, 1174 unsigned long buffer_start, 1175 bool interruptible, 1176 struct file *persistent_swap_storage, 1177 size_t acc_size, 1178 void (*destroy) (struct ttm_buffer_object *)) 1179 { 1180 int ret = 0; 1181 unsigned long num_pages; 1182 1183 size += buffer_start & ~PAGE_MASK; 1184 num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; 1185 if (num_pages == 0) { 1186 printk(KERN_ERR TTM_PFX "Illegal buffer object size.\n"); 1187 if (destroy) 1188 (*destroy)(bo); 1189 else 1190 kfree(bo); 1191 return -EINVAL; 1192 } 1193 bo->destroy = destroy; 1194 1195 kref_init(&bo->kref); 1196 kref_init(&bo->list_kref); 1197 atomic_set(&bo->cpu_writers, 0); 1198 atomic_set(&bo->reserved, 1); 1199 init_waitqueue_head(&bo->event_queue); 1200 INIT_LIST_HEAD(&bo->lru); 1201 INIT_LIST_HEAD(&bo->ddestroy); 1202 INIT_LIST_HEAD(&bo->swap); 1203 INIT_LIST_HEAD(&bo->io_reserve_lru); 1204 bo->bdev = bdev; 1205 bo->glob = bdev->glob; 1206 bo->type = type; 1207 bo->num_pages = num_pages; 1208 bo->mem.size = num_pages << PAGE_SHIFT; 1209 bo->mem.mem_type = TTM_PL_SYSTEM; 1210 bo->mem.num_pages = bo->num_pages; 1211 bo->mem.mm_node = NULL; 1212 bo->mem.page_alignment = page_alignment; 1213 bo->mem.bus.io_reserved_vm = false; 1214 bo->mem.bus.io_reserved_count = 0; 1215 bo->buffer_start = buffer_start & PAGE_MASK; 1216 bo->priv_flags = 0; 1217 bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED); 1218 bo->seq_valid = false; 1219 bo->persistent_swap_storage = persistent_swap_storage; 1220 bo->acc_size = acc_size; 1221 atomic_inc(&bo->glob->bo_count); 1222 1223 ret = ttm_bo_check_placement(bo, placement); 1224 if (unlikely(ret != 0)) 1225 goto out_err; 1226 1227 /* 1228 * For ttm_bo_type_device buffers, allocate 1229 * address space from the device. 1230 */ 1231 if (bo->type == ttm_bo_type_device) { 1232 ret = ttm_bo_setup_vm(bo); 1233 if (ret) 1234 goto out_err; 1235 } 1236 1237 ret = ttm_bo_validate(bo, placement, interruptible, false, false); 1238 if (ret) 1239 goto out_err; 1240 1241 ttm_bo_unreserve(bo); 1242 return 0; 1243 1244 out_err: 1245 ttm_bo_unreserve(bo); 1246 ttm_bo_unref(&bo); 1247 1248 return ret; 1249 } 1250 EXPORT_SYMBOL(ttm_bo_init); 1251 1252 static inline size_t ttm_bo_size(struct ttm_bo_global *glob, 1253 unsigned long num_pages) 1254 { 1255 size_t page_array_size = (num_pages * sizeof(void *) + PAGE_SIZE - 1) & 1256 PAGE_MASK; 1257 1258 return glob->ttm_bo_size + 2 * page_array_size; 1259 } 1260 1261 int ttm_bo_create(struct ttm_bo_device *bdev, 1262 unsigned long size, 1263 enum ttm_bo_type type, 1264 struct ttm_placement *placement, 1265 uint32_t page_alignment, 1266 unsigned long buffer_start, 1267 bool interruptible, 1268 struct file *persistent_swap_storage, 1269 struct ttm_buffer_object **p_bo) 1270 { 1271 struct ttm_buffer_object *bo; 1272 struct ttm_mem_global *mem_glob = bdev->glob->mem_glob; 1273 int ret; 1274 1275 size_t acc_size = 1276 ttm_bo_size(bdev->glob, (size + PAGE_SIZE - 1) >> PAGE_SHIFT); 1277 ret = ttm_mem_global_alloc(mem_glob, acc_size, false, false); 1278 if (unlikely(ret != 0)) 1279 return ret; 1280 1281 bo = kzalloc(sizeof(*bo), GFP_KERNEL); 1282 1283 if (unlikely(bo == NULL)) { 1284 ttm_mem_global_free(mem_glob, acc_size); 1285 return -ENOMEM; 1286 } 1287 1288 ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment, 1289 buffer_start, interruptible, 1290 persistent_swap_storage, acc_size, NULL); 1291 if (likely(ret == 0)) 1292 *p_bo = bo; 1293 1294 return ret; 1295 } 1296 EXPORT_SYMBOL(ttm_bo_create); 1297 1298 static int ttm_bo_force_list_clean(struct ttm_bo_device *bdev, 1299 unsigned mem_type, bool allow_errors) 1300 { 1301 struct ttm_mem_type_manager *man = &bdev->man[mem_type]; 1302 struct ttm_bo_global *glob = bdev->glob; 1303 int ret; 1304 1305 /* 1306 * Can't use standard list traversal since we're unlocking. 1307 */ 1308 1309 spin_lock(&glob->lru_lock); 1310 while (!list_empty(&man->lru)) { 1311 spin_unlock(&glob->lru_lock); 1312 ret = ttm_mem_evict_first(bdev, mem_type, false, false, false); 1313 if (ret) { 1314 if (allow_errors) { 1315 return ret; 1316 } else { 1317 printk(KERN_ERR TTM_PFX 1318 "Cleanup eviction failed\n"); 1319 } 1320 } 1321 spin_lock(&glob->lru_lock); 1322 } 1323 spin_unlock(&glob->lru_lock); 1324 return 0; 1325 } 1326 1327 int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned mem_type) 1328 { 1329 struct ttm_mem_type_manager *man; 1330 int ret = -EINVAL; 1331 1332 if (mem_type >= TTM_NUM_MEM_TYPES) { 1333 printk(KERN_ERR TTM_PFX "Illegal memory type %d\n", mem_type); 1334 return ret; 1335 } 1336 man = &bdev->man[mem_type]; 1337 1338 if (!man->has_type) { 1339 printk(KERN_ERR TTM_PFX "Trying to take down uninitialized " 1340 "memory manager type %u\n", mem_type); 1341 return ret; 1342 } 1343 1344 man->use_type = false; 1345 man->has_type = false; 1346 1347 ret = 0; 1348 if (mem_type > 0) { 1349 ttm_bo_force_list_clean(bdev, mem_type, false); 1350 1351 ret = (*man->func->takedown)(man); 1352 } 1353 1354 return ret; 1355 } 1356 EXPORT_SYMBOL(ttm_bo_clean_mm); 1357 1358 int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type) 1359 { 1360 struct ttm_mem_type_manager *man = &bdev->man[mem_type]; 1361 1362 if (mem_type == 0 || mem_type >= TTM_NUM_MEM_TYPES) { 1363 printk(KERN_ERR TTM_PFX 1364 "Illegal memory manager memory type %u.\n", 1365 mem_type); 1366 return -EINVAL; 1367 } 1368 1369 if (!man->has_type) { 1370 printk(KERN_ERR TTM_PFX 1371 "Memory type %u has not been initialized.\n", 1372 mem_type); 1373 return 0; 1374 } 1375 1376 return ttm_bo_force_list_clean(bdev, mem_type, true); 1377 } 1378 EXPORT_SYMBOL(ttm_bo_evict_mm); 1379 1380 int ttm_bo_init_mm(struct ttm_bo_device *bdev, unsigned type, 1381 unsigned long p_size) 1382 { 1383 int ret = -EINVAL; 1384 struct ttm_mem_type_manager *man; 1385 1386 BUG_ON(type >= TTM_NUM_MEM_TYPES); 1387 man = &bdev->man[type]; 1388 BUG_ON(man->has_type); 1389 man->io_reserve_fastpath = true; 1390 man->use_io_reserve_lru = false; 1391 mutex_init(&man->io_reserve_mutex); 1392 INIT_LIST_HEAD(&man->io_reserve_lru); 1393 1394 ret = bdev->driver->init_mem_type(bdev, type, man); 1395 if (ret) 1396 return ret; 1397 man->bdev = bdev; 1398 1399 ret = 0; 1400 if (type != TTM_PL_SYSTEM) { 1401 ret = (*man->func->init)(man, p_size); 1402 if (ret) 1403 return ret; 1404 } 1405 man->has_type = true; 1406 man->use_type = true; 1407 man->size = p_size; 1408 1409 INIT_LIST_HEAD(&man->lru); 1410 1411 return 0; 1412 } 1413 EXPORT_SYMBOL(ttm_bo_init_mm); 1414 1415 static void ttm_bo_global_kobj_release(struct kobject *kobj) 1416 { 1417 struct ttm_bo_global *glob = 1418 container_of(kobj, struct ttm_bo_global, kobj); 1419 1420 ttm_mem_unregister_shrink(glob->mem_glob, &glob->shrink); 1421 __free_page(glob->dummy_read_page); 1422 kfree(glob); 1423 } 1424 1425 void ttm_bo_global_release(struct drm_global_reference *ref) 1426 { 1427 struct ttm_bo_global *glob = ref->object; 1428 1429 kobject_del(&glob->kobj); 1430 kobject_put(&glob->kobj); 1431 } 1432 EXPORT_SYMBOL(ttm_bo_global_release); 1433 1434 int ttm_bo_global_init(struct drm_global_reference *ref) 1435 { 1436 struct ttm_bo_global_ref *bo_ref = 1437 container_of(ref, struct ttm_bo_global_ref, ref); 1438 struct ttm_bo_global *glob = ref->object; 1439 int ret; 1440 1441 mutex_init(&glob->device_list_mutex); 1442 spin_lock_init(&glob->lru_lock); 1443 glob->mem_glob = bo_ref->mem_glob; 1444 glob->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32); 1445 1446 if (unlikely(glob->dummy_read_page == NULL)) { 1447 ret = -ENOMEM; 1448 goto out_no_drp; 1449 } 1450 1451 INIT_LIST_HEAD(&glob->swap_lru); 1452 INIT_LIST_HEAD(&glob->device_list); 1453 1454 ttm_mem_init_shrink(&glob->shrink, ttm_bo_swapout); 1455 ret = ttm_mem_register_shrink(glob->mem_glob, &glob->shrink); 1456 if (unlikely(ret != 0)) { 1457 printk(KERN_ERR TTM_PFX 1458 "Could not register buffer object swapout.\n"); 1459 goto out_no_shrink; 1460 } 1461 1462 glob->ttm_bo_extra_size = 1463 ttm_round_pot(sizeof(struct ttm_tt)) + 1464 ttm_round_pot(sizeof(struct ttm_backend)); 1465 1466 glob->ttm_bo_size = glob->ttm_bo_extra_size + 1467 ttm_round_pot(sizeof(struct ttm_buffer_object)); 1468 1469 atomic_set(&glob->bo_count, 0); 1470 1471 ret = kobject_init_and_add( 1472 &glob->kobj, &ttm_bo_glob_kobj_type, ttm_get_kobj(), "buffer_objects"); 1473 if (unlikely(ret != 0)) 1474 kobject_put(&glob->kobj); 1475 return ret; 1476 out_no_shrink: 1477 __free_page(glob->dummy_read_page); 1478 out_no_drp: 1479 kfree(glob); 1480 return ret; 1481 } 1482 EXPORT_SYMBOL(ttm_bo_global_init); 1483 1484 1485 int ttm_bo_device_release(struct ttm_bo_device *bdev) 1486 { 1487 int ret = 0; 1488 unsigned i = TTM_NUM_MEM_TYPES; 1489 struct ttm_mem_type_manager *man; 1490 struct ttm_bo_global *glob = bdev->glob; 1491 1492 while (i--) { 1493 man = &bdev->man[i]; 1494 if (man->has_type) { 1495 man->use_type = false; 1496 if ((i != TTM_PL_SYSTEM) && ttm_bo_clean_mm(bdev, i)) { 1497 ret = -EBUSY; 1498 printk(KERN_ERR TTM_PFX 1499 "DRM memory manager type %d " 1500 "is not clean.\n", i); 1501 } 1502 man->has_type = false; 1503 } 1504 } 1505 1506 mutex_lock(&glob->device_list_mutex); 1507 list_del(&bdev->device_list); 1508 mutex_unlock(&glob->device_list_mutex); 1509 1510 cancel_delayed_work_sync(&bdev->wq); 1511 1512 while (ttm_bo_delayed_delete(bdev, true)) 1513 ; 1514 1515 spin_lock(&glob->lru_lock); 1516 if (list_empty(&bdev->ddestroy)) 1517 TTM_DEBUG("Delayed destroy list was clean\n"); 1518 1519 if (list_empty(&bdev->man[0].lru)) 1520 TTM_DEBUG("Swap list was clean\n"); 1521 spin_unlock(&glob->lru_lock); 1522 1523 BUG_ON(!drm_mm_clean(&bdev->addr_space_mm)); 1524 write_lock(&bdev->vm_lock); 1525 drm_mm_takedown(&bdev->addr_space_mm); 1526 write_unlock(&bdev->vm_lock); 1527 1528 return ret; 1529 } 1530 EXPORT_SYMBOL(ttm_bo_device_release); 1531 1532 int ttm_bo_device_init(struct ttm_bo_device *bdev, 1533 struct ttm_bo_global *glob, 1534 struct ttm_bo_driver *driver, 1535 uint64_t file_page_offset, 1536 bool need_dma32) 1537 { 1538 int ret = -EINVAL; 1539 1540 rwlock_init(&bdev->vm_lock); 1541 bdev->driver = driver; 1542 1543 memset(bdev->man, 0, sizeof(bdev->man)); 1544 1545 /* 1546 * Initialize the system memory buffer type. 1547 * Other types need to be driver / IOCTL initialized. 1548 */ 1549 ret = ttm_bo_init_mm(bdev, TTM_PL_SYSTEM, 0); 1550 if (unlikely(ret != 0)) 1551 goto out_no_sys; 1552 1553 bdev->addr_space_rb = RB_ROOT; 1554 ret = drm_mm_init(&bdev->addr_space_mm, file_page_offset, 0x10000000); 1555 if (unlikely(ret != 0)) 1556 goto out_no_addr_mm; 1557 1558 INIT_DELAYED_WORK(&bdev->wq, ttm_bo_delayed_workqueue); 1559 bdev->nice_mode = true; 1560 INIT_LIST_HEAD(&bdev->ddestroy); 1561 bdev->dev_mapping = NULL; 1562 bdev->glob = glob; 1563 bdev->need_dma32 = need_dma32; 1564 bdev->val_seq = 0; 1565 spin_lock_init(&bdev->fence_lock); 1566 mutex_lock(&glob->device_list_mutex); 1567 list_add_tail(&bdev->device_list, &glob->device_list); 1568 mutex_unlock(&glob->device_list_mutex); 1569 1570 return 0; 1571 out_no_addr_mm: 1572 ttm_bo_clean_mm(bdev, 0); 1573 out_no_sys: 1574 return ret; 1575 } 1576 EXPORT_SYMBOL(ttm_bo_device_init); 1577 1578 /* 1579 * buffer object vm functions. 1580 */ 1581 1582 bool ttm_mem_reg_is_pci(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) 1583 { 1584 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type]; 1585 1586 if (!(man->flags & TTM_MEMTYPE_FLAG_FIXED)) { 1587 if (mem->mem_type == TTM_PL_SYSTEM) 1588 return false; 1589 1590 if (man->flags & TTM_MEMTYPE_FLAG_CMA) 1591 return false; 1592 1593 if (mem->placement & TTM_PL_FLAG_CACHED) 1594 return false; 1595 } 1596 return true; 1597 } 1598 1599 void ttm_bo_unmap_virtual_locked(struct ttm_buffer_object *bo) 1600 { 1601 struct ttm_bo_device *bdev = bo->bdev; 1602 loff_t offset = (loff_t) bo->addr_space_offset; 1603 loff_t holelen = ((loff_t) bo->mem.num_pages) << PAGE_SHIFT; 1604 1605 if (!bdev->dev_mapping) 1606 return; 1607 unmap_mapping_range(bdev->dev_mapping, offset, holelen, 1); 1608 ttm_mem_io_free_vm(bo); 1609 } 1610 1611 void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo) 1612 { 1613 struct ttm_bo_device *bdev = bo->bdev; 1614 struct ttm_mem_type_manager *man = &bdev->man[bo->mem.mem_type]; 1615 1616 ttm_mem_io_lock(man, false); 1617 ttm_bo_unmap_virtual_locked(bo); 1618 ttm_mem_io_unlock(man); 1619 } 1620 1621 1622 EXPORT_SYMBOL(ttm_bo_unmap_virtual); 1623 1624 static void ttm_bo_vm_insert_rb(struct ttm_buffer_object *bo) 1625 { 1626 struct ttm_bo_device *bdev = bo->bdev; 1627 struct rb_node **cur = &bdev->addr_space_rb.rb_node; 1628 struct rb_node *parent = NULL; 1629 struct ttm_buffer_object *cur_bo; 1630 unsigned long offset = bo->vm_node->start; 1631 unsigned long cur_offset; 1632 1633 while (*cur) { 1634 parent = *cur; 1635 cur_bo = rb_entry(parent, struct ttm_buffer_object, vm_rb); 1636 cur_offset = cur_bo->vm_node->start; 1637 if (offset < cur_offset) 1638 cur = &parent->rb_left; 1639 else if (offset > cur_offset) 1640 cur = &parent->rb_right; 1641 else 1642 BUG(); 1643 } 1644 1645 rb_link_node(&bo->vm_rb, parent, cur); 1646 rb_insert_color(&bo->vm_rb, &bdev->addr_space_rb); 1647 } 1648 1649 /** 1650 * ttm_bo_setup_vm: 1651 * 1652 * @bo: the buffer to allocate address space for 1653 * 1654 * Allocate address space in the drm device so that applications 1655 * can mmap the buffer and access the contents. This only 1656 * applies to ttm_bo_type_device objects as others are not 1657 * placed in the drm device address space. 1658 */ 1659 1660 static int ttm_bo_setup_vm(struct ttm_buffer_object *bo) 1661 { 1662 struct ttm_bo_device *bdev = bo->bdev; 1663 int ret; 1664 1665 retry_pre_get: 1666 ret = drm_mm_pre_get(&bdev->addr_space_mm); 1667 if (unlikely(ret != 0)) 1668 return ret; 1669 1670 write_lock(&bdev->vm_lock); 1671 bo->vm_node = drm_mm_search_free(&bdev->addr_space_mm, 1672 bo->mem.num_pages, 0, 0); 1673 1674 if (unlikely(bo->vm_node == NULL)) { 1675 ret = -ENOMEM; 1676 goto out_unlock; 1677 } 1678 1679 bo->vm_node = drm_mm_get_block_atomic(bo->vm_node, 1680 bo->mem.num_pages, 0); 1681 1682 if (unlikely(bo->vm_node == NULL)) { 1683 write_unlock(&bdev->vm_lock); 1684 goto retry_pre_get; 1685 } 1686 1687 ttm_bo_vm_insert_rb(bo); 1688 write_unlock(&bdev->vm_lock); 1689 bo->addr_space_offset = ((uint64_t) bo->vm_node->start) << PAGE_SHIFT; 1690 1691 return 0; 1692 out_unlock: 1693 write_unlock(&bdev->vm_lock); 1694 return ret; 1695 } 1696 1697 int ttm_bo_wait(struct ttm_buffer_object *bo, 1698 bool lazy, bool interruptible, bool no_wait) 1699 { 1700 struct ttm_bo_driver *driver = bo->bdev->driver; 1701 struct ttm_bo_device *bdev = bo->bdev; 1702 void *sync_obj; 1703 void *sync_obj_arg; 1704 int ret = 0; 1705 1706 if (likely(bo->sync_obj == NULL)) 1707 return 0; 1708 1709 while (bo->sync_obj) { 1710 1711 if (driver->sync_obj_signaled(bo->sync_obj, bo->sync_obj_arg)) { 1712 void *tmp_obj = bo->sync_obj; 1713 bo->sync_obj = NULL; 1714 clear_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags); 1715 spin_unlock(&bdev->fence_lock); 1716 driver->sync_obj_unref(&tmp_obj); 1717 spin_lock(&bdev->fence_lock); 1718 continue; 1719 } 1720 1721 if (no_wait) 1722 return -EBUSY; 1723 1724 sync_obj = driver->sync_obj_ref(bo->sync_obj); 1725 sync_obj_arg = bo->sync_obj_arg; 1726 spin_unlock(&bdev->fence_lock); 1727 ret = driver->sync_obj_wait(sync_obj, sync_obj_arg, 1728 lazy, interruptible); 1729 if (unlikely(ret != 0)) { 1730 driver->sync_obj_unref(&sync_obj); 1731 spin_lock(&bdev->fence_lock); 1732 return ret; 1733 } 1734 spin_lock(&bdev->fence_lock); 1735 if (likely(bo->sync_obj == sync_obj && 1736 bo->sync_obj_arg == sync_obj_arg)) { 1737 void *tmp_obj = bo->sync_obj; 1738 bo->sync_obj = NULL; 1739 clear_bit(TTM_BO_PRIV_FLAG_MOVING, 1740 &bo->priv_flags); 1741 spin_unlock(&bdev->fence_lock); 1742 driver->sync_obj_unref(&sync_obj); 1743 driver->sync_obj_unref(&tmp_obj); 1744 spin_lock(&bdev->fence_lock); 1745 } else { 1746 spin_unlock(&bdev->fence_lock); 1747 driver->sync_obj_unref(&sync_obj); 1748 spin_lock(&bdev->fence_lock); 1749 } 1750 } 1751 return 0; 1752 } 1753 EXPORT_SYMBOL(ttm_bo_wait); 1754 1755 int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait) 1756 { 1757 struct ttm_bo_device *bdev = bo->bdev; 1758 int ret = 0; 1759 1760 /* 1761 * Using ttm_bo_reserve makes sure the lru lists are updated. 1762 */ 1763 1764 ret = ttm_bo_reserve(bo, true, no_wait, false, 0); 1765 if (unlikely(ret != 0)) 1766 return ret; 1767 spin_lock(&bdev->fence_lock); 1768 ret = ttm_bo_wait(bo, false, true, no_wait); 1769 spin_unlock(&bdev->fence_lock); 1770 if (likely(ret == 0)) 1771 atomic_inc(&bo->cpu_writers); 1772 ttm_bo_unreserve(bo); 1773 return ret; 1774 } 1775 EXPORT_SYMBOL(ttm_bo_synccpu_write_grab); 1776 1777 void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo) 1778 { 1779 if (atomic_dec_and_test(&bo->cpu_writers)) 1780 wake_up_all(&bo->event_queue); 1781 } 1782 EXPORT_SYMBOL(ttm_bo_synccpu_write_release); 1783 1784 /** 1785 * A buffer object shrink method that tries to swap out the first 1786 * buffer object on the bo_global::swap_lru list. 1787 */ 1788 1789 static int ttm_bo_swapout(struct ttm_mem_shrink *shrink) 1790 { 1791 struct ttm_bo_global *glob = 1792 container_of(shrink, struct ttm_bo_global, shrink); 1793 struct ttm_buffer_object *bo; 1794 int ret = -EBUSY; 1795 int put_count; 1796 uint32_t swap_placement = (TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM); 1797 1798 spin_lock(&glob->lru_lock); 1799 while (ret == -EBUSY) { 1800 if (unlikely(list_empty(&glob->swap_lru))) { 1801 spin_unlock(&glob->lru_lock); 1802 return -EBUSY; 1803 } 1804 1805 bo = list_first_entry(&glob->swap_lru, 1806 struct ttm_buffer_object, swap); 1807 kref_get(&bo->list_kref); 1808 1809 if (!list_empty(&bo->ddestroy)) { 1810 spin_unlock(&glob->lru_lock); 1811 (void) ttm_bo_cleanup_refs(bo, false, false, false); 1812 kref_put(&bo->list_kref, ttm_bo_release_list); 1813 continue; 1814 } 1815 1816 /** 1817 * Reserve buffer. Since we unlock while sleeping, we need 1818 * to re-check that nobody removed us from the swap-list while 1819 * we slept. 1820 */ 1821 1822 ret = ttm_bo_reserve_locked(bo, false, true, false, 0); 1823 if (unlikely(ret == -EBUSY)) { 1824 spin_unlock(&glob->lru_lock); 1825 ttm_bo_wait_unreserved(bo, false); 1826 kref_put(&bo->list_kref, ttm_bo_release_list); 1827 spin_lock(&glob->lru_lock); 1828 } 1829 } 1830 1831 BUG_ON(ret != 0); 1832 put_count = ttm_bo_del_from_lru(bo); 1833 spin_unlock(&glob->lru_lock); 1834 1835 ttm_bo_list_ref_sub(bo, put_count, true); 1836 1837 /** 1838 * Wait for GPU, then move to system cached. 1839 */ 1840 1841 spin_lock(&bo->bdev->fence_lock); 1842 ret = ttm_bo_wait(bo, false, false, false); 1843 spin_unlock(&bo->bdev->fence_lock); 1844 1845 if (unlikely(ret != 0)) 1846 goto out; 1847 1848 if ((bo->mem.placement & swap_placement) != swap_placement) { 1849 struct ttm_mem_reg evict_mem; 1850 1851 evict_mem = bo->mem; 1852 evict_mem.mm_node = NULL; 1853 evict_mem.placement = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED; 1854 evict_mem.mem_type = TTM_PL_SYSTEM; 1855 1856 ret = ttm_bo_handle_move_mem(bo, &evict_mem, true, 1857 false, false, false); 1858 if (unlikely(ret != 0)) 1859 goto out; 1860 } 1861 1862 ttm_bo_unmap_virtual(bo); 1863 1864 /** 1865 * Swap out. Buffer will be swapped in again as soon as 1866 * anyone tries to access a ttm page. 1867 */ 1868 1869 if (bo->bdev->driver->swap_notify) 1870 bo->bdev->driver->swap_notify(bo); 1871 1872 ret = ttm_tt_swapout(bo->ttm, bo->persistent_swap_storage); 1873 out: 1874 1875 /** 1876 * 1877 * Unreserve without putting on LRU to avoid swapping out an 1878 * already swapped buffer. 1879 */ 1880 1881 atomic_set(&bo->reserved, 0); 1882 wake_up_all(&bo->event_queue); 1883 kref_put(&bo->list_kref, ttm_bo_release_list); 1884 return ret; 1885 } 1886 1887 void ttm_bo_swapout_all(struct ttm_bo_device *bdev) 1888 { 1889 while (ttm_bo_swapout(&bdev->glob->shrink) == 0) 1890 ; 1891 } 1892 EXPORT_SYMBOL(ttm_bo_swapout_all); 1893