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 41 #define TTM_ASSERT_LOCKED(param) 42 #define TTM_DEBUG(fmt, arg...) 43 #define TTM_BO_HASH_ORDER 13 44 45 static int ttm_bo_setup_vm(struct ttm_buffer_object *bo); 46 static void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo); 47 static int ttm_bo_swapout(struct ttm_mem_shrink *shrink); 48 49 static inline uint32_t ttm_bo_type_flags(unsigned type) 50 { 51 return 1 << (type); 52 } 53 54 static void ttm_bo_release_list(struct kref *list_kref) 55 { 56 struct ttm_buffer_object *bo = 57 container_of(list_kref, struct ttm_buffer_object, list_kref); 58 struct ttm_bo_device *bdev = bo->bdev; 59 60 BUG_ON(atomic_read(&bo->list_kref.refcount)); 61 BUG_ON(atomic_read(&bo->kref.refcount)); 62 BUG_ON(atomic_read(&bo->cpu_writers)); 63 BUG_ON(bo->sync_obj != NULL); 64 BUG_ON(bo->mem.mm_node != NULL); 65 BUG_ON(!list_empty(&bo->lru)); 66 BUG_ON(!list_empty(&bo->ddestroy)); 67 68 if (bo->ttm) 69 ttm_tt_destroy(bo->ttm); 70 if (bo->destroy) 71 bo->destroy(bo); 72 else { 73 ttm_mem_global_free(bdev->mem_glob, bo->acc_size, false); 74 kfree(bo); 75 } 76 } 77 78 int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo, bool interruptible) 79 { 80 81 if (interruptible) { 82 int ret = 0; 83 84 ret = wait_event_interruptible(bo->event_queue, 85 atomic_read(&bo->reserved) == 0); 86 if (unlikely(ret != 0)) 87 return -ERESTART; 88 } else { 89 wait_event(bo->event_queue, atomic_read(&bo->reserved) == 0); 90 } 91 return 0; 92 } 93 94 static void ttm_bo_add_to_lru(struct ttm_buffer_object *bo) 95 { 96 struct ttm_bo_device *bdev = bo->bdev; 97 struct ttm_mem_type_manager *man; 98 99 BUG_ON(!atomic_read(&bo->reserved)); 100 101 if (!(bo->mem.placement & TTM_PL_FLAG_NO_EVICT)) { 102 103 BUG_ON(!list_empty(&bo->lru)); 104 105 man = &bdev->man[bo->mem.mem_type]; 106 list_add_tail(&bo->lru, &man->lru); 107 kref_get(&bo->list_kref); 108 109 if (bo->ttm != NULL) { 110 list_add_tail(&bo->swap, &bdev->swap_lru); 111 kref_get(&bo->list_kref); 112 } 113 } 114 } 115 116 /** 117 * Call with the lru_lock held. 118 */ 119 120 static int ttm_bo_del_from_lru(struct ttm_buffer_object *bo) 121 { 122 int put_count = 0; 123 124 if (!list_empty(&bo->swap)) { 125 list_del_init(&bo->swap); 126 ++put_count; 127 } 128 if (!list_empty(&bo->lru)) { 129 list_del_init(&bo->lru); 130 ++put_count; 131 } 132 133 /* 134 * TODO: Add a driver hook to delete from 135 * driver-specific LRU's here. 136 */ 137 138 return put_count; 139 } 140 141 int ttm_bo_reserve_locked(struct ttm_buffer_object *bo, 142 bool interruptible, 143 bool no_wait, bool use_sequence, uint32_t sequence) 144 { 145 struct ttm_bo_device *bdev = bo->bdev; 146 int ret; 147 148 while (unlikely(atomic_cmpxchg(&bo->reserved, 0, 1) != 0)) { 149 if (use_sequence && bo->seq_valid && 150 (sequence - bo->val_seq < (1 << 31))) { 151 return -EAGAIN; 152 } 153 154 if (no_wait) 155 return -EBUSY; 156 157 spin_unlock(&bdev->lru_lock); 158 ret = ttm_bo_wait_unreserved(bo, interruptible); 159 spin_lock(&bdev->lru_lock); 160 161 if (unlikely(ret)) 162 return ret; 163 } 164 165 if (use_sequence) { 166 bo->val_seq = sequence; 167 bo->seq_valid = true; 168 } else { 169 bo->seq_valid = false; 170 } 171 172 return 0; 173 } 174 EXPORT_SYMBOL(ttm_bo_reserve); 175 176 static void ttm_bo_ref_bug(struct kref *list_kref) 177 { 178 BUG(); 179 } 180 181 int ttm_bo_reserve(struct ttm_buffer_object *bo, 182 bool interruptible, 183 bool no_wait, bool use_sequence, uint32_t sequence) 184 { 185 struct ttm_bo_device *bdev = bo->bdev; 186 int put_count = 0; 187 int ret; 188 189 spin_lock(&bdev->lru_lock); 190 ret = ttm_bo_reserve_locked(bo, interruptible, no_wait, use_sequence, 191 sequence); 192 if (likely(ret == 0)) 193 put_count = ttm_bo_del_from_lru(bo); 194 spin_unlock(&bdev->lru_lock); 195 196 while (put_count--) 197 kref_put(&bo->list_kref, ttm_bo_ref_bug); 198 199 return ret; 200 } 201 202 void ttm_bo_unreserve(struct ttm_buffer_object *bo) 203 { 204 struct ttm_bo_device *bdev = bo->bdev; 205 206 spin_lock(&bdev->lru_lock); 207 ttm_bo_add_to_lru(bo); 208 atomic_set(&bo->reserved, 0); 209 wake_up_all(&bo->event_queue); 210 spin_unlock(&bdev->lru_lock); 211 } 212 EXPORT_SYMBOL(ttm_bo_unreserve); 213 214 /* 215 * Call bo->mutex locked. 216 */ 217 218 static int ttm_bo_add_ttm(struct ttm_buffer_object *bo, bool zero_alloc) 219 { 220 struct ttm_bo_device *bdev = bo->bdev; 221 int ret = 0; 222 uint32_t page_flags = 0; 223 224 TTM_ASSERT_LOCKED(&bo->mutex); 225 bo->ttm = NULL; 226 227 switch (bo->type) { 228 case ttm_bo_type_device: 229 if (zero_alloc) 230 page_flags |= TTM_PAGE_FLAG_ZERO_ALLOC; 231 case ttm_bo_type_kernel: 232 bo->ttm = ttm_tt_create(bdev, bo->num_pages << PAGE_SHIFT, 233 page_flags, bdev->dummy_read_page); 234 if (unlikely(bo->ttm == NULL)) 235 ret = -ENOMEM; 236 break; 237 case ttm_bo_type_user: 238 bo->ttm = ttm_tt_create(bdev, bo->num_pages << PAGE_SHIFT, 239 page_flags | TTM_PAGE_FLAG_USER, 240 bdev->dummy_read_page); 241 if (unlikely(bo->ttm == NULL)) 242 ret = -ENOMEM; 243 break; 244 245 ret = ttm_tt_set_user(bo->ttm, current, 246 bo->buffer_start, bo->num_pages); 247 if (unlikely(ret != 0)) 248 ttm_tt_destroy(bo->ttm); 249 break; 250 default: 251 printk(KERN_ERR TTM_PFX "Illegal buffer object type\n"); 252 ret = -EINVAL; 253 break; 254 } 255 256 return ret; 257 } 258 259 static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo, 260 struct ttm_mem_reg *mem, 261 bool evict, bool interruptible, bool no_wait) 262 { 263 struct ttm_bo_device *bdev = bo->bdev; 264 bool old_is_pci = ttm_mem_reg_is_pci(bdev, &bo->mem); 265 bool new_is_pci = ttm_mem_reg_is_pci(bdev, mem); 266 struct ttm_mem_type_manager *old_man = &bdev->man[bo->mem.mem_type]; 267 struct ttm_mem_type_manager *new_man = &bdev->man[mem->mem_type]; 268 int ret = 0; 269 270 if (old_is_pci || new_is_pci || 271 ((mem->placement & bo->mem.placement & TTM_PL_MASK_CACHING) == 0)) 272 ttm_bo_unmap_virtual(bo); 273 274 /* 275 * Create and bind a ttm if required. 276 */ 277 278 if (!(new_man->flags & TTM_MEMTYPE_FLAG_FIXED) && (bo->ttm == NULL)) { 279 ret = ttm_bo_add_ttm(bo, false); 280 if (ret) 281 goto out_err; 282 283 ret = ttm_tt_set_placement_caching(bo->ttm, mem->placement); 284 if (ret) 285 goto out_err; 286 287 if (mem->mem_type != TTM_PL_SYSTEM) { 288 ret = ttm_tt_bind(bo->ttm, mem); 289 if (ret) 290 goto out_err; 291 } 292 293 if (bo->mem.mem_type == TTM_PL_SYSTEM) { 294 295 struct ttm_mem_reg *old_mem = &bo->mem; 296 uint32_t save_flags = old_mem->placement; 297 298 *old_mem = *mem; 299 mem->mm_node = NULL; 300 ttm_flag_masked(&save_flags, mem->placement, 301 TTM_PL_MASK_MEMTYPE); 302 goto moved; 303 } 304 305 } 306 307 if (!(old_man->flags & TTM_MEMTYPE_FLAG_FIXED) && 308 !(new_man->flags & TTM_MEMTYPE_FLAG_FIXED)) 309 ret = ttm_bo_move_ttm(bo, evict, no_wait, mem); 310 else if (bdev->driver->move) 311 ret = bdev->driver->move(bo, evict, interruptible, 312 no_wait, mem); 313 else 314 ret = ttm_bo_move_memcpy(bo, evict, no_wait, mem); 315 316 if (ret) 317 goto out_err; 318 319 moved: 320 if (bo->evicted) { 321 ret = bdev->driver->invalidate_caches(bdev, bo->mem.placement); 322 if (ret) 323 printk(KERN_ERR TTM_PFX "Can not flush read caches\n"); 324 bo->evicted = false; 325 } 326 327 if (bo->mem.mm_node) { 328 spin_lock(&bo->lock); 329 bo->offset = (bo->mem.mm_node->start << PAGE_SHIFT) + 330 bdev->man[bo->mem.mem_type].gpu_offset; 331 bo->cur_placement = bo->mem.placement; 332 spin_unlock(&bo->lock); 333 } 334 335 return 0; 336 337 out_err: 338 new_man = &bdev->man[bo->mem.mem_type]; 339 if ((new_man->flags & TTM_MEMTYPE_FLAG_FIXED) && bo->ttm) { 340 ttm_tt_unbind(bo->ttm); 341 ttm_tt_destroy(bo->ttm); 342 bo->ttm = NULL; 343 } 344 345 return ret; 346 } 347 348 /** 349 * If bo idle, remove from delayed- and lru lists, and unref. 350 * If not idle, and already on delayed list, do nothing. 351 * If not idle, and not on delayed list, put on delayed list, 352 * up the list_kref and schedule a delayed list check. 353 */ 354 355 static int ttm_bo_cleanup_refs(struct ttm_buffer_object *bo, bool remove_all) 356 { 357 struct ttm_bo_device *bdev = bo->bdev; 358 struct ttm_bo_driver *driver = bdev->driver; 359 int ret; 360 361 spin_lock(&bo->lock); 362 (void) ttm_bo_wait(bo, false, false, !remove_all); 363 364 if (!bo->sync_obj) { 365 int put_count; 366 367 spin_unlock(&bo->lock); 368 369 spin_lock(&bdev->lru_lock); 370 ret = ttm_bo_reserve_locked(bo, false, false, false, 0); 371 BUG_ON(ret); 372 if (bo->ttm) 373 ttm_tt_unbind(bo->ttm); 374 375 if (!list_empty(&bo->ddestroy)) { 376 list_del_init(&bo->ddestroy); 377 kref_put(&bo->list_kref, ttm_bo_ref_bug); 378 } 379 if (bo->mem.mm_node) { 380 drm_mm_put_block(bo->mem.mm_node); 381 bo->mem.mm_node = NULL; 382 } 383 put_count = ttm_bo_del_from_lru(bo); 384 spin_unlock(&bdev->lru_lock); 385 386 atomic_set(&bo->reserved, 0); 387 388 while (put_count--) 389 kref_put(&bo->list_kref, ttm_bo_release_list); 390 391 return 0; 392 } 393 394 spin_lock(&bdev->lru_lock); 395 if (list_empty(&bo->ddestroy)) { 396 void *sync_obj = bo->sync_obj; 397 void *sync_obj_arg = bo->sync_obj_arg; 398 399 kref_get(&bo->list_kref); 400 list_add_tail(&bo->ddestroy, &bdev->ddestroy); 401 spin_unlock(&bdev->lru_lock); 402 spin_unlock(&bo->lock); 403 404 if (sync_obj) 405 driver->sync_obj_flush(sync_obj, sync_obj_arg); 406 schedule_delayed_work(&bdev->wq, 407 ((HZ / 100) < 1) ? 1 : HZ / 100); 408 ret = 0; 409 410 } else { 411 spin_unlock(&bdev->lru_lock); 412 spin_unlock(&bo->lock); 413 ret = -EBUSY; 414 } 415 416 return ret; 417 } 418 419 /** 420 * Traverse the delayed list, and call ttm_bo_cleanup_refs on all 421 * encountered buffers. 422 */ 423 424 static int ttm_bo_delayed_delete(struct ttm_bo_device *bdev, bool remove_all) 425 { 426 struct ttm_buffer_object *entry, *nentry; 427 struct list_head *list, *next; 428 int ret; 429 430 spin_lock(&bdev->lru_lock); 431 list_for_each_safe(list, next, &bdev->ddestroy) { 432 entry = list_entry(list, struct ttm_buffer_object, ddestroy); 433 nentry = NULL; 434 435 /* 436 * Protect the next list entry from destruction while we 437 * unlock the lru_lock. 438 */ 439 440 if (next != &bdev->ddestroy) { 441 nentry = list_entry(next, struct ttm_buffer_object, 442 ddestroy); 443 kref_get(&nentry->list_kref); 444 } 445 kref_get(&entry->list_kref); 446 447 spin_unlock(&bdev->lru_lock); 448 ret = ttm_bo_cleanup_refs(entry, remove_all); 449 kref_put(&entry->list_kref, ttm_bo_release_list); 450 451 spin_lock(&bdev->lru_lock); 452 if (nentry) { 453 bool next_onlist = !list_empty(next); 454 spin_unlock(&bdev->lru_lock); 455 kref_put(&nentry->list_kref, ttm_bo_release_list); 456 spin_lock(&bdev->lru_lock); 457 /* 458 * Someone might have raced us and removed the 459 * next entry from the list. We don't bother restarting 460 * list traversal. 461 */ 462 463 if (!next_onlist) 464 break; 465 } 466 if (ret) 467 break; 468 } 469 ret = !list_empty(&bdev->ddestroy); 470 spin_unlock(&bdev->lru_lock); 471 472 return ret; 473 } 474 475 static void ttm_bo_delayed_workqueue(struct work_struct *work) 476 { 477 struct ttm_bo_device *bdev = 478 container_of(work, struct ttm_bo_device, wq.work); 479 480 if (ttm_bo_delayed_delete(bdev, false)) { 481 schedule_delayed_work(&bdev->wq, 482 ((HZ / 100) < 1) ? 1 : HZ / 100); 483 } 484 } 485 486 static void ttm_bo_release(struct kref *kref) 487 { 488 struct ttm_buffer_object *bo = 489 container_of(kref, struct ttm_buffer_object, kref); 490 struct ttm_bo_device *bdev = bo->bdev; 491 492 if (likely(bo->vm_node != NULL)) { 493 rb_erase(&bo->vm_rb, &bdev->addr_space_rb); 494 drm_mm_put_block(bo->vm_node); 495 bo->vm_node = NULL; 496 } 497 write_unlock(&bdev->vm_lock); 498 ttm_bo_cleanup_refs(bo, false); 499 kref_put(&bo->list_kref, ttm_bo_release_list); 500 write_lock(&bdev->vm_lock); 501 } 502 503 void ttm_bo_unref(struct ttm_buffer_object **p_bo) 504 { 505 struct ttm_buffer_object *bo = *p_bo; 506 struct ttm_bo_device *bdev = bo->bdev; 507 508 *p_bo = NULL; 509 write_lock(&bdev->vm_lock); 510 kref_put(&bo->kref, ttm_bo_release); 511 write_unlock(&bdev->vm_lock); 512 } 513 EXPORT_SYMBOL(ttm_bo_unref); 514 515 static int ttm_bo_evict(struct ttm_buffer_object *bo, unsigned mem_type, 516 bool interruptible, bool no_wait) 517 { 518 int ret = 0; 519 struct ttm_bo_device *bdev = bo->bdev; 520 struct ttm_mem_reg evict_mem; 521 uint32_t proposed_placement; 522 523 if (bo->mem.mem_type != mem_type) 524 goto out; 525 526 spin_lock(&bo->lock); 527 ret = ttm_bo_wait(bo, false, interruptible, no_wait); 528 spin_unlock(&bo->lock); 529 530 if (unlikely(ret != 0)) { 531 if (ret != -ERESTART) { 532 printk(KERN_ERR TTM_PFX 533 "Failed to expire sync object before " 534 "buffer eviction.\n"); 535 } 536 goto out; 537 } 538 539 BUG_ON(!atomic_read(&bo->reserved)); 540 541 evict_mem = bo->mem; 542 evict_mem.mm_node = NULL; 543 544 proposed_placement = bdev->driver->evict_flags(bo); 545 546 ret = ttm_bo_mem_space(bo, proposed_placement, 547 &evict_mem, interruptible, no_wait); 548 if (unlikely(ret != 0 && ret != -ERESTART)) 549 ret = ttm_bo_mem_space(bo, TTM_PL_FLAG_SYSTEM, 550 &evict_mem, interruptible, no_wait); 551 552 if (ret) { 553 if (ret != -ERESTART) 554 printk(KERN_ERR TTM_PFX 555 "Failed to find memory space for " 556 "buffer 0x%p eviction.\n", bo); 557 goto out; 558 } 559 560 ret = ttm_bo_handle_move_mem(bo, &evict_mem, true, interruptible, 561 no_wait); 562 if (ret) { 563 if (ret != -ERESTART) 564 printk(KERN_ERR TTM_PFX "Buffer eviction failed\n"); 565 goto out; 566 } 567 568 spin_lock(&bdev->lru_lock); 569 if (evict_mem.mm_node) { 570 drm_mm_put_block(evict_mem.mm_node); 571 evict_mem.mm_node = NULL; 572 } 573 spin_unlock(&bdev->lru_lock); 574 bo->evicted = true; 575 out: 576 return ret; 577 } 578 579 /** 580 * Repeatedly evict memory from the LRU for @mem_type until we create enough 581 * space, or we've evicted everything and there isn't enough space. 582 */ 583 static int ttm_bo_mem_force_space(struct ttm_bo_device *bdev, 584 struct ttm_mem_reg *mem, 585 uint32_t mem_type, 586 bool interruptible, bool no_wait) 587 { 588 struct drm_mm_node *node; 589 struct ttm_buffer_object *entry; 590 struct ttm_mem_type_manager *man = &bdev->man[mem_type]; 591 struct list_head *lru; 592 unsigned long num_pages = mem->num_pages; 593 int put_count = 0; 594 int ret; 595 596 retry_pre_get: 597 ret = drm_mm_pre_get(&man->manager); 598 if (unlikely(ret != 0)) 599 return ret; 600 601 spin_lock(&bdev->lru_lock); 602 do { 603 node = drm_mm_search_free(&man->manager, num_pages, 604 mem->page_alignment, 1); 605 if (node) 606 break; 607 608 lru = &man->lru; 609 if (list_empty(lru)) 610 break; 611 612 entry = list_first_entry(lru, struct ttm_buffer_object, lru); 613 kref_get(&entry->list_kref); 614 615 ret = 616 ttm_bo_reserve_locked(entry, interruptible, no_wait, 617 false, 0); 618 619 if (likely(ret == 0)) 620 put_count = ttm_bo_del_from_lru(entry); 621 622 spin_unlock(&bdev->lru_lock); 623 624 if (unlikely(ret != 0)) 625 return ret; 626 627 while (put_count--) 628 kref_put(&entry->list_kref, ttm_bo_ref_bug); 629 630 ret = ttm_bo_evict(entry, mem_type, interruptible, no_wait); 631 632 ttm_bo_unreserve(entry); 633 634 kref_put(&entry->list_kref, ttm_bo_release_list); 635 if (ret) 636 return ret; 637 638 spin_lock(&bdev->lru_lock); 639 } while (1); 640 641 if (!node) { 642 spin_unlock(&bdev->lru_lock); 643 return -ENOMEM; 644 } 645 646 node = drm_mm_get_block_atomic(node, num_pages, mem->page_alignment); 647 if (unlikely(!node)) { 648 spin_unlock(&bdev->lru_lock); 649 goto retry_pre_get; 650 } 651 652 spin_unlock(&bdev->lru_lock); 653 mem->mm_node = node; 654 mem->mem_type = mem_type; 655 return 0; 656 } 657 658 static bool ttm_bo_mt_compatible(struct ttm_mem_type_manager *man, 659 bool disallow_fixed, 660 uint32_t mem_type, 661 uint32_t mask, uint32_t *res_mask) 662 { 663 uint32_t cur_flags = ttm_bo_type_flags(mem_type); 664 665 if ((man->flags & TTM_MEMTYPE_FLAG_FIXED) && disallow_fixed) 666 return false; 667 668 if ((cur_flags & mask & TTM_PL_MASK_MEM) == 0) 669 return false; 670 671 if ((mask & man->available_caching) == 0) 672 return false; 673 if (mask & man->default_caching) 674 cur_flags |= man->default_caching; 675 else if (mask & TTM_PL_FLAG_CACHED) 676 cur_flags |= TTM_PL_FLAG_CACHED; 677 else if (mask & TTM_PL_FLAG_WC) 678 cur_flags |= TTM_PL_FLAG_WC; 679 else 680 cur_flags |= TTM_PL_FLAG_UNCACHED; 681 682 *res_mask = cur_flags; 683 return true; 684 } 685 686 /** 687 * Creates space for memory region @mem according to its type. 688 * 689 * This function first searches for free space in compatible memory types in 690 * the priority order defined by the driver. If free space isn't found, then 691 * ttm_bo_mem_force_space is attempted in priority order to evict and find 692 * space. 693 */ 694 int ttm_bo_mem_space(struct ttm_buffer_object *bo, 695 uint32_t proposed_placement, 696 struct ttm_mem_reg *mem, 697 bool interruptible, bool no_wait) 698 { 699 struct ttm_bo_device *bdev = bo->bdev; 700 struct ttm_mem_type_manager *man; 701 702 uint32_t num_prios = bdev->driver->num_mem_type_prio; 703 const uint32_t *prios = bdev->driver->mem_type_prio; 704 uint32_t i; 705 uint32_t mem_type = TTM_PL_SYSTEM; 706 uint32_t cur_flags = 0; 707 bool type_found = false; 708 bool type_ok = false; 709 bool has_eagain = false; 710 struct drm_mm_node *node = NULL; 711 int ret; 712 713 mem->mm_node = NULL; 714 for (i = 0; i < num_prios; ++i) { 715 mem_type = prios[i]; 716 man = &bdev->man[mem_type]; 717 718 type_ok = ttm_bo_mt_compatible(man, 719 bo->type == ttm_bo_type_user, 720 mem_type, proposed_placement, 721 &cur_flags); 722 723 if (!type_ok) 724 continue; 725 726 if (mem_type == TTM_PL_SYSTEM) 727 break; 728 729 if (man->has_type && man->use_type) { 730 type_found = true; 731 do { 732 ret = drm_mm_pre_get(&man->manager); 733 if (unlikely(ret)) 734 return ret; 735 736 spin_lock(&bdev->lru_lock); 737 node = drm_mm_search_free(&man->manager, 738 mem->num_pages, 739 mem->page_alignment, 740 1); 741 if (unlikely(!node)) { 742 spin_unlock(&bdev->lru_lock); 743 break; 744 } 745 node = drm_mm_get_block_atomic(node, 746 mem->num_pages, 747 mem-> 748 page_alignment); 749 spin_unlock(&bdev->lru_lock); 750 } while (!node); 751 } 752 if (node) 753 break; 754 } 755 756 if ((type_ok && (mem_type == TTM_PL_SYSTEM)) || node) { 757 mem->mm_node = node; 758 mem->mem_type = mem_type; 759 mem->placement = cur_flags; 760 return 0; 761 } 762 763 if (!type_found) 764 return -EINVAL; 765 766 num_prios = bdev->driver->num_mem_busy_prio; 767 prios = bdev->driver->mem_busy_prio; 768 769 for (i = 0; i < num_prios; ++i) { 770 mem_type = prios[i]; 771 man = &bdev->man[mem_type]; 772 773 if (!man->has_type) 774 continue; 775 776 if (!ttm_bo_mt_compatible(man, 777 bo->type == ttm_bo_type_user, 778 mem_type, 779 proposed_placement, &cur_flags)) 780 continue; 781 782 ret = ttm_bo_mem_force_space(bdev, mem, mem_type, 783 interruptible, no_wait); 784 785 if (ret == 0 && mem->mm_node) { 786 mem->placement = cur_flags; 787 return 0; 788 } 789 790 if (ret == -ERESTART) 791 has_eagain = true; 792 } 793 794 ret = (has_eagain) ? -ERESTART : -ENOMEM; 795 return ret; 796 } 797 EXPORT_SYMBOL(ttm_bo_mem_space); 798 799 int ttm_bo_wait_cpu(struct ttm_buffer_object *bo, bool no_wait) 800 { 801 int ret = 0; 802 803 if ((atomic_read(&bo->cpu_writers) > 0) && no_wait) 804 return -EBUSY; 805 806 ret = wait_event_interruptible(bo->event_queue, 807 atomic_read(&bo->cpu_writers) == 0); 808 809 if (ret == -ERESTARTSYS) 810 ret = -ERESTART; 811 812 return ret; 813 } 814 815 int ttm_bo_move_buffer(struct ttm_buffer_object *bo, 816 uint32_t proposed_placement, 817 bool interruptible, bool no_wait) 818 { 819 struct ttm_bo_device *bdev = bo->bdev; 820 int ret = 0; 821 struct ttm_mem_reg mem; 822 823 BUG_ON(!atomic_read(&bo->reserved)); 824 825 /* 826 * FIXME: It's possible to pipeline buffer moves. 827 * Have the driver move function wait for idle when necessary, 828 * instead of doing it here. 829 */ 830 831 spin_lock(&bo->lock); 832 ret = ttm_bo_wait(bo, false, interruptible, no_wait); 833 spin_unlock(&bo->lock); 834 835 if (ret) 836 return ret; 837 838 mem.num_pages = bo->num_pages; 839 mem.size = mem.num_pages << PAGE_SHIFT; 840 mem.page_alignment = bo->mem.page_alignment; 841 842 /* 843 * Determine where to move the buffer. 844 */ 845 846 ret = ttm_bo_mem_space(bo, proposed_placement, &mem, 847 interruptible, no_wait); 848 if (ret) 849 goto out_unlock; 850 851 ret = ttm_bo_handle_move_mem(bo, &mem, false, interruptible, no_wait); 852 853 out_unlock: 854 if (ret && mem.mm_node) { 855 spin_lock(&bdev->lru_lock); 856 drm_mm_put_block(mem.mm_node); 857 spin_unlock(&bdev->lru_lock); 858 } 859 return ret; 860 } 861 862 static int ttm_bo_mem_compat(uint32_t proposed_placement, 863 struct ttm_mem_reg *mem) 864 { 865 if ((proposed_placement & mem->placement & TTM_PL_MASK_MEM) == 0) 866 return 0; 867 if ((proposed_placement & mem->placement & TTM_PL_MASK_CACHING) == 0) 868 return 0; 869 870 return 1; 871 } 872 873 int ttm_buffer_object_validate(struct ttm_buffer_object *bo, 874 uint32_t proposed_placement, 875 bool interruptible, bool no_wait) 876 { 877 int ret; 878 879 BUG_ON(!atomic_read(&bo->reserved)); 880 bo->proposed_placement = proposed_placement; 881 882 TTM_DEBUG("Proposed placement 0x%08lx, Old flags 0x%08lx\n", 883 (unsigned long)proposed_placement, 884 (unsigned long)bo->mem.placement); 885 886 /* 887 * Check whether we need to move buffer. 888 */ 889 890 if (!ttm_bo_mem_compat(bo->proposed_placement, &bo->mem)) { 891 ret = ttm_bo_move_buffer(bo, bo->proposed_placement, 892 interruptible, no_wait); 893 if (ret) { 894 if (ret != -ERESTART) 895 printk(KERN_ERR TTM_PFX 896 "Failed moving buffer. " 897 "Proposed placement 0x%08x\n", 898 bo->proposed_placement); 899 if (ret == -ENOMEM) 900 printk(KERN_ERR TTM_PFX 901 "Out of aperture space or " 902 "DRM memory quota.\n"); 903 return ret; 904 } 905 } 906 907 /* 908 * We might need to add a TTM. 909 */ 910 911 if (bo->mem.mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) { 912 ret = ttm_bo_add_ttm(bo, true); 913 if (ret) 914 return ret; 915 } 916 /* 917 * Validation has succeeded, move the access and other 918 * non-mapping-related flag bits from the proposed flags to 919 * the active flags 920 */ 921 922 ttm_flag_masked(&bo->mem.placement, bo->proposed_placement, 923 ~TTM_PL_MASK_MEMTYPE); 924 925 return 0; 926 } 927 EXPORT_SYMBOL(ttm_buffer_object_validate); 928 929 int 930 ttm_bo_check_placement(struct ttm_buffer_object *bo, 931 uint32_t set_flags, uint32_t clr_flags) 932 { 933 uint32_t new_mask = set_flags | clr_flags; 934 935 if ((bo->type == ttm_bo_type_user) && 936 (clr_flags & TTM_PL_FLAG_CACHED)) { 937 printk(KERN_ERR TTM_PFX 938 "User buffers require cache-coherent memory.\n"); 939 return -EINVAL; 940 } 941 942 if (!capable(CAP_SYS_ADMIN)) { 943 if (new_mask & TTM_PL_FLAG_NO_EVICT) { 944 printk(KERN_ERR TTM_PFX "Need to be root to modify" 945 " NO_EVICT status.\n"); 946 return -EINVAL; 947 } 948 949 if ((clr_flags & bo->mem.placement & TTM_PL_MASK_MEMTYPE) && 950 (bo->mem.placement & TTM_PL_FLAG_NO_EVICT)) { 951 printk(KERN_ERR TTM_PFX 952 "Incompatible memory specification" 953 " for NO_EVICT buffer.\n"); 954 return -EINVAL; 955 } 956 } 957 return 0; 958 } 959 960 int ttm_buffer_object_init(struct ttm_bo_device *bdev, 961 struct ttm_buffer_object *bo, 962 unsigned long size, 963 enum ttm_bo_type type, 964 uint32_t flags, 965 uint32_t page_alignment, 966 unsigned long buffer_start, 967 bool interruptible, 968 struct file *persistant_swap_storage, 969 size_t acc_size, 970 void (*destroy) (struct ttm_buffer_object *)) 971 { 972 int ret = 0; 973 unsigned long num_pages; 974 975 size += buffer_start & ~PAGE_MASK; 976 num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; 977 if (num_pages == 0) { 978 printk(KERN_ERR TTM_PFX "Illegal buffer object size.\n"); 979 return -EINVAL; 980 } 981 bo->destroy = destroy; 982 983 spin_lock_init(&bo->lock); 984 kref_init(&bo->kref); 985 kref_init(&bo->list_kref); 986 atomic_set(&bo->cpu_writers, 0); 987 atomic_set(&bo->reserved, 1); 988 init_waitqueue_head(&bo->event_queue); 989 INIT_LIST_HEAD(&bo->lru); 990 INIT_LIST_HEAD(&bo->ddestroy); 991 INIT_LIST_HEAD(&bo->swap); 992 bo->bdev = bdev; 993 bo->type = type; 994 bo->num_pages = num_pages; 995 bo->mem.mem_type = TTM_PL_SYSTEM; 996 bo->mem.num_pages = bo->num_pages; 997 bo->mem.mm_node = NULL; 998 bo->mem.page_alignment = page_alignment; 999 bo->buffer_start = buffer_start & PAGE_MASK; 1000 bo->priv_flags = 0; 1001 bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED); 1002 bo->seq_valid = false; 1003 bo->persistant_swap_storage = persistant_swap_storage; 1004 bo->acc_size = acc_size; 1005 1006 ret = ttm_bo_check_placement(bo, flags, 0ULL); 1007 if (unlikely(ret != 0)) 1008 goto out_err; 1009 1010 /* 1011 * If no caching attributes are set, accept any form of caching. 1012 */ 1013 1014 if ((flags & TTM_PL_MASK_CACHING) == 0) 1015 flags |= TTM_PL_MASK_CACHING; 1016 1017 /* 1018 * For ttm_bo_type_device buffers, allocate 1019 * address space from the device. 1020 */ 1021 1022 if (bo->type == ttm_bo_type_device) { 1023 ret = ttm_bo_setup_vm(bo); 1024 if (ret) 1025 goto out_err; 1026 } 1027 1028 ret = ttm_buffer_object_validate(bo, flags, interruptible, false); 1029 if (ret) 1030 goto out_err; 1031 1032 ttm_bo_unreserve(bo); 1033 return 0; 1034 1035 out_err: 1036 ttm_bo_unreserve(bo); 1037 ttm_bo_unref(&bo); 1038 1039 return ret; 1040 } 1041 EXPORT_SYMBOL(ttm_buffer_object_init); 1042 1043 static inline size_t ttm_bo_size(struct ttm_bo_device *bdev, 1044 unsigned long num_pages) 1045 { 1046 size_t page_array_size = (num_pages * sizeof(void *) + PAGE_SIZE - 1) & 1047 PAGE_MASK; 1048 1049 return bdev->ttm_bo_size + 2 * page_array_size; 1050 } 1051 1052 int ttm_buffer_object_create(struct ttm_bo_device *bdev, 1053 unsigned long size, 1054 enum ttm_bo_type type, 1055 uint32_t flags, 1056 uint32_t page_alignment, 1057 unsigned long buffer_start, 1058 bool interruptible, 1059 struct file *persistant_swap_storage, 1060 struct ttm_buffer_object **p_bo) 1061 { 1062 struct ttm_buffer_object *bo; 1063 int ret; 1064 struct ttm_mem_global *mem_glob = bdev->mem_glob; 1065 1066 size_t acc_size = 1067 ttm_bo_size(bdev, (size + PAGE_SIZE - 1) >> PAGE_SHIFT); 1068 ret = ttm_mem_global_alloc(mem_glob, acc_size, false, false, false); 1069 if (unlikely(ret != 0)) 1070 return ret; 1071 1072 bo = kzalloc(sizeof(*bo), GFP_KERNEL); 1073 1074 if (unlikely(bo == NULL)) { 1075 ttm_mem_global_free(mem_glob, acc_size, false); 1076 return -ENOMEM; 1077 } 1078 1079 ret = ttm_buffer_object_init(bdev, bo, size, type, flags, 1080 page_alignment, buffer_start, 1081 interruptible, 1082 persistant_swap_storage, acc_size, NULL); 1083 if (likely(ret == 0)) 1084 *p_bo = bo; 1085 1086 return ret; 1087 } 1088 1089 static int ttm_bo_leave_list(struct ttm_buffer_object *bo, 1090 uint32_t mem_type, bool allow_errors) 1091 { 1092 int ret; 1093 1094 spin_lock(&bo->lock); 1095 ret = ttm_bo_wait(bo, false, false, false); 1096 spin_unlock(&bo->lock); 1097 1098 if (ret && allow_errors) 1099 goto out; 1100 1101 if (bo->mem.mem_type == mem_type) 1102 ret = ttm_bo_evict(bo, mem_type, false, false); 1103 1104 if (ret) { 1105 if (allow_errors) { 1106 goto out; 1107 } else { 1108 ret = 0; 1109 printk(KERN_ERR TTM_PFX "Cleanup eviction failed\n"); 1110 } 1111 } 1112 1113 out: 1114 return ret; 1115 } 1116 1117 static int ttm_bo_force_list_clean(struct ttm_bo_device *bdev, 1118 struct list_head *head, 1119 unsigned mem_type, bool allow_errors) 1120 { 1121 struct ttm_buffer_object *entry; 1122 int ret; 1123 int put_count; 1124 1125 /* 1126 * Can't use standard list traversal since we're unlocking. 1127 */ 1128 1129 spin_lock(&bdev->lru_lock); 1130 1131 while (!list_empty(head)) { 1132 entry = list_first_entry(head, struct ttm_buffer_object, lru); 1133 kref_get(&entry->list_kref); 1134 ret = ttm_bo_reserve_locked(entry, false, false, false, 0); 1135 put_count = ttm_bo_del_from_lru(entry); 1136 spin_unlock(&bdev->lru_lock); 1137 while (put_count--) 1138 kref_put(&entry->list_kref, ttm_bo_ref_bug); 1139 BUG_ON(ret); 1140 ret = ttm_bo_leave_list(entry, mem_type, allow_errors); 1141 ttm_bo_unreserve(entry); 1142 kref_put(&entry->list_kref, ttm_bo_release_list); 1143 spin_lock(&bdev->lru_lock); 1144 } 1145 1146 spin_unlock(&bdev->lru_lock); 1147 1148 return 0; 1149 } 1150 1151 int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned mem_type) 1152 { 1153 struct ttm_mem_type_manager *man = &bdev->man[mem_type]; 1154 int ret = -EINVAL; 1155 1156 if (mem_type >= TTM_NUM_MEM_TYPES) { 1157 printk(KERN_ERR TTM_PFX "Illegal memory type %d\n", mem_type); 1158 return ret; 1159 } 1160 1161 if (!man->has_type) { 1162 printk(KERN_ERR TTM_PFX "Trying to take down uninitialized " 1163 "memory manager type %u\n", mem_type); 1164 return ret; 1165 } 1166 1167 man->use_type = false; 1168 man->has_type = false; 1169 1170 ret = 0; 1171 if (mem_type > 0) { 1172 ttm_bo_force_list_clean(bdev, &man->lru, mem_type, false); 1173 1174 spin_lock(&bdev->lru_lock); 1175 if (drm_mm_clean(&man->manager)) 1176 drm_mm_takedown(&man->manager); 1177 else 1178 ret = -EBUSY; 1179 1180 spin_unlock(&bdev->lru_lock); 1181 } 1182 1183 return ret; 1184 } 1185 EXPORT_SYMBOL(ttm_bo_clean_mm); 1186 1187 int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type) 1188 { 1189 struct ttm_mem_type_manager *man = &bdev->man[mem_type]; 1190 1191 if (mem_type == 0 || mem_type >= TTM_NUM_MEM_TYPES) { 1192 printk(KERN_ERR TTM_PFX 1193 "Illegal memory manager memory type %u.\n", 1194 mem_type); 1195 return -EINVAL; 1196 } 1197 1198 if (!man->has_type) { 1199 printk(KERN_ERR TTM_PFX 1200 "Memory type %u has not been initialized.\n", 1201 mem_type); 1202 return 0; 1203 } 1204 1205 return ttm_bo_force_list_clean(bdev, &man->lru, mem_type, true); 1206 } 1207 EXPORT_SYMBOL(ttm_bo_evict_mm); 1208 1209 int ttm_bo_init_mm(struct ttm_bo_device *bdev, unsigned type, 1210 unsigned long p_offset, unsigned long p_size) 1211 { 1212 int ret = -EINVAL; 1213 struct ttm_mem_type_manager *man; 1214 1215 if (type >= TTM_NUM_MEM_TYPES) { 1216 printk(KERN_ERR TTM_PFX "Illegal memory type %d\n", type); 1217 return ret; 1218 } 1219 1220 man = &bdev->man[type]; 1221 if (man->has_type) { 1222 printk(KERN_ERR TTM_PFX 1223 "Memory manager already initialized for type %d\n", 1224 type); 1225 return ret; 1226 } 1227 1228 ret = bdev->driver->init_mem_type(bdev, type, man); 1229 if (ret) 1230 return ret; 1231 1232 ret = 0; 1233 if (type != TTM_PL_SYSTEM) { 1234 if (!p_size) { 1235 printk(KERN_ERR TTM_PFX 1236 "Zero size memory manager type %d\n", 1237 type); 1238 return ret; 1239 } 1240 ret = drm_mm_init(&man->manager, p_offset, p_size); 1241 if (ret) 1242 return ret; 1243 } 1244 man->has_type = true; 1245 man->use_type = true; 1246 man->size = p_size; 1247 1248 INIT_LIST_HEAD(&man->lru); 1249 1250 return 0; 1251 } 1252 EXPORT_SYMBOL(ttm_bo_init_mm); 1253 1254 int ttm_bo_device_release(struct ttm_bo_device *bdev) 1255 { 1256 int ret = 0; 1257 unsigned i = TTM_NUM_MEM_TYPES; 1258 struct ttm_mem_type_manager *man; 1259 1260 while (i--) { 1261 man = &bdev->man[i]; 1262 if (man->has_type) { 1263 man->use_type = false; 1264 if ((i != TTM_PL_SYSTEM) && ttm_bo_clean_mm(bdev, i)) { 1265 ret = -EBUSY; 1266 printk(KERN_ERR TTM_PFX 1267 "DRM memory manager type %d " 1268 "is not clean.\n", i); 1269 } 1270 man->has_type = false; 1271 } 1272 } 1273 1274 if (!cancel_delayed_work(&bdev->wq)) 1275 flush_scheduled_work(); 1276 1277 while (ttm_bo_delayed_delete(bdev, true)) 1278 ; 1279 1280 spin_lock(&bdev->lru_lock); 1281 if (list_empty(&bdev->ddestroy)) 1282 TTM_DEBUG("Delayed destroy list was clean\n"); 1283 1284 if (list_empty(&bdev->man[0].lru)) 1285 TTM_DEBUG("Swap list was clean\n"); 1286 spin_unlock(&bdev->lru_lock); 1287 1288 ttm_mem_unregister_shrink(bdev->mem_glob, &bdev->shrink); 1289 BUG_ON(!drm_mm_clean(&bdev->addr_space_mm)); 1290 write_lock(&bdev->vm_lock); 1291 drm_mm_takedown(&bdev->addr_space_mm); 1292 write_unlock(&bdev->vm_lock); 1293 1294 __free_page(bdev->dummy_read_page); 1295 return ret; 1296 } 1297 EXPORT_SYMBOL(ttm_bo_device_release); 1298 1299 /* 1300 * This function is intended to be called on drm driver load. 1301 * If you decide to call it from firstopen, you must protect the call 1302 * from a potentially racing ttm_bo_driver_finish in lastclose. 1303 * (This may happen on X server restart). 1304 */ 1305 1306 int ttm_bo_device_init(struct ttm_bo_device *bdev, 1307 struct ttm_mem_global *mem_glob, 1308 struct ttm_bo_driver *driver, uint64_t file_page_offset) 1309 { 1310 int ret = -EINVAL; 1311 1312 bdev->dummy_read_page = NULL; 1313 rwlock_init(&bdev->vm_lock); 1314 spin_lock_init(&bdev->lru_lock); 1315 1316 bdev->driver = driver; 1317 bdev->mem_glob = mem_glob; 1318 1319 memset(bdev->man, 0, sizeof(bdev->man)); 1320 1321 bdev->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32); 1322 if (unlikely(bdev->dummy_read_page == NULL)) { 1323 ret = -ENOMEM; 1324 goto out_err0; 1325 } 1326 1327 /* 1328 * Initialize the system memory buffer type. 1329 * Other types need to be driver / IOCTL initialized. 1330 */ 1331 ret = ttm_bo_init_mm(bdev, TTM_PL_SYSTEM, 0, 0); 1332 if (unlikely(ret != 0)) 1333 goto out_err1; 1334 1335 bdev->addr_space_rb = RB_ROOT; 1336 ret = drm_mm_init(&bdev->addr_space_mm, file_page_offset, 0x10000000); 1337 if (unlikely(ret != 0)) 1338 goto out_err2; 1339 1340 INIT_DELAYED_WORK(&bdev->wq, ttm_bo_delayed_workqueue); 1341 bdev->nice_mode = true; 1342 INIT_LIST_HEAD(&bdev->ddestroy); 1343 INIT_LIST_HEAD(&bdev->swap_lru); 1344 bdev->dev_mapping = NULL; 1345 ttm_mem_init_shrink(&bdev->shrink, ttm_bo_swapout); 1346 ret = ttm_mem_register_shrink(mem_glob, &bdev->shrink); 1347 if (unlikely(ret != 0)) { 1348 printk(KERN_ERR TTM_PFX 1349 "Could not register buffer object swapout.\n"); 1350 goto out_err2; 1351 } 1352 1353 bdev->ttm_bo_extra_size = 1354 ttm_round_pot(sizeof(struct ttm_tt)) + 1355 ttm_round_pot(sizeof(struct ttm_backend)); 1356 1357 bdev->ttm_bo_size = bdev->ttm_bo_extra_size + 1358 ttm_round_pot(sizeof(struct ttm_buffer_object)); 1359 1360 return 0; 1361 out_err2: 1362 ttm_bo_clean_mm(bdev, 0); 1363 out_err1: 1364 __free_page(bdev->dummy_read_page); 1365 out_err0: 1366 return ret; 1367 } 1368 EXPORT_SYMBOL(ttm_bo_device_init); 1369 1370 /* 1371 * buffer object vm functions. 1372 */ 1373 1374 bool ttm_mem_reg_is_pci(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) 1375 { 1376 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type]; 1377 1378 if (!(man->flags & TTM_MEMTYPE_FLAG_FIXED)) { 1379 if (mem->mem_type == TTM_PL_SYSTEM) 1380 return false; 1381 1382 if (man->flags & TTM_MEMTYPE_FLAG_CMA) 1383 return false; 1384 1385 if (mem->placement & TTM_PL_FLAG_CACHED) 1386 return false; 1387 } 1388 return true; 1389 } 1390 1391 int ttm_bo_pci_offset(struct ttm_bo_device *bdev, 1392 struct ttm_mem_reg *mem, 1393 unsigned long *bus_base, 1394 unsigned long *bus_offset, unsigned long *bus_size) 1395 { 1396 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type]; 1397 1398 *bus_size = 0; 1399 if (!(man->flags & TTM_MEMTYPE_FLAG_MAPPABLE)) 1400 return -EINVAL; 1401 1402 if (ttm_mem_reg_is_pci(bdev, mem)) { 1403 *bus_offset = mem->mm_node->start << PAGE_SHIFT; 1404 *bus_size = mem->num_pages << PAGE_SHIFT; 1405 *bus_base = man->io_offset; 1406 } 1407 1408 return 0; 1409 } 1410 1411 void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo) 1412 { 1413 struct ttm_bo_device *bdev = bo->bdev; 1414 loff_t offset = (loff_t) bo->addr_space_offset; 1415 loff_t holelen = ((loff_t) bo->mem.num_pages) << PAGE_SHIFT; 1416 1417 if (!bdev->dev_mapping) 1418 return; 1419 1420 unmap_mapping_range(bdev->dev_mapping, offset, holelen, 1); 1421 } 1422 1423 static void ttm_bo_vm_insert_rb(struct ttm_buffer_object *bo) 1424 { 1425 struct ttm_bo_device *bdev = bo->bdev; 1426 struct rb_node **cur = &bdev->addr_space_rb.rb_node; 1427 struct rb_node *parent = NULL; 1428 struct ttm_buffer_object *cur_bo; 1429 unsigned long offset = bo->vm_node->start; 1430 unsigned long cur_offset; 1431 1432 while (*cur) { 1433 parent = *cur; 1434 cur_bo = rb_entry(parent, struct ttm_buffer_object, vm_rb); 1435 cur_offset = cur_bo->vm_node->start; 1436 if (offset < cur_offset) 1437 cur = &parent->rb_left; 1438 else if (offset > cur_offset) 1439 cur = &parent->rb_right; 1440 else 1441 BUG(); 1442 } 1443 1444 rb_link_node(&bo->vm_rb, parent, cur); 1445 rb_insert_color(&bo->vm_rb, &bdev->addr_space_rb); 1446 } 1447 1448 /** 1449 * ttm_bo_setup_vm: 1450 * 1451 * @bo: the buffer to allocate address space for 1452 * 1453 * Allocate address space in the drm device so that applications 1454 * can mmap the buffer and access the contents. This only 1455 * applies to ttm_bo_type_device objects as others are not 1456 * placed in the drm device address space. 1457 */ 1458 1459 static int ttm_bo_setup_vm(struct ttm_buffer_object *bo) 1460 { 1461 struct ttm_bo_device *bdev = bo->bdev; 1462 int ret; 1463 1464 retry_pre_get: 1465 ret = drm_mm_pre_get(&bdev->addr_space_mm); 1466 if (unlikely(ret != 0)) 1467 return ret; 1468 1469 write_lock(&bdev->vm_lock); 1470 bo->vm_node = drm_mm_search_free(&bdev->addr_space_mm, 1471 bo->mem.num_pages, 0, 0); 1472 1473 if (unlikely(bo->vm_node == NULL)) { 1474 ret = -ENOMEM; 1475 goto out_unlock; 1476 } 1477 1478 bo->vm_node = drm_mm_get_block_atomic(bo->vm_node, 1479 bo->mem.num_pages, 0); 1480 1481 if (unlikely(bo->vm_node == NULL)) { 1482 write_unlock(&bdev->vm_lock); 1483 goto retry_pre_get; 1484 } 1485 1486 ttm_bo_vm_insert_rb(bo); 1487 write_unlock(&bdev->vm_lock); 1488 bo->addr_space_offset = ((uint64_t) bo->vm_node->start) << PAGE_SHIFT; 1489 1490 return 0; 1491 out_unlock: 1492 write_unlock(&bdev->vm_lock); 1493 return ret; 1494 } 1495 1496 int ttm_bo_wait(struct ttm_buffer_object *bo, 1497 bool lazy, bool interruptible, bool no_wait) 1498 { 1499 struct ttm_bo_driver *driver = bo->bdev->driver; 1500 void *sync_obj; 1501 void *sync_obj_arg; 1502 int ret = 0; 1503 1504 if (likely(bo->sync_obj == NULL)) 1505 return 0; 1506 1507 while (bo->sync_obj) { 1508 1509 if (driver->sync_obj_signaled(bo->sync_obj, bo->sync_obj_arg)) { 1510 void *tmp_obj = bo->sync_obj; 1511 bo->sync_obj = NULL; 1512 clear_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags); 1513 spin_unlock(&bo->lock); 1514 driver->sync_obj_unref(&tmp_obj); 1515 spin_lock(&bo->lock); 1516 continue; 1517 } 1518 1519 if (no_wait) 1520 return -EBUSY; 1521 1522 sync_obj = driver->sync_obj_ref(bo->sync_obj); 1523 sync_obj_arg = bo->sync_obj_arg; 1524 spin_unlock(&bo->lock); 1525 ret = driver->sync_obj_wait(sync_obj, sync_obj_arg, 1526 lazy, interruptible); 1527 if (unlikely(ret != 0)) { 1528 driver->sync_obj_unref(&sync_obj); 1529 spin_lock(&bo->lock); 1530 return ret; 1531 } 1532 spin_lock(&bo->lock); 1533 if (likely(bo->sync_obj == sync_obj && 1534 bo->sync_obj_arg == sync_obj_arg)) { 1535 void *tmp_obj = bo->sync_obj; 1536 bo->sync_obj = NULL; 1537 clear_bit(TTM_BO_PRIV_FLAG_MOVING, 1538 &bo->priv_flags); 1539 spin_unlock(&bo->lock); 1540 driver->sync_obj_unref(&sync_obj); 1541 driver->sync_obj_unref(&tmp_obj); 1542 spin_lock(&bo->lock); 1543 } 1544 } 1545 return 0; 1546 } 1547 EXPORT_SYMBOL(ttm_bo_wait); 1548 1549 void ttm_bo_unblock_reservation(struct ttm_buffer_object *bo) 1550 { 1551 atomic_set(&bo->reserved, 0); 1552 wake_up_all(&bo->event_queue); 1553 } 1554 1555 int ttm_bo_block_reservation(struct ttm_buffer_object *bo, bool interruptible, 1556 bool no_wait) 1557 { 1558 int ret; 1559 1560 while (unlikely(atomic_cmpxchg(&bo->reserved, 0, 1) != 0)) { 1561 if (no_wait) 1562 return -EBUSY; 1563 else if (interruptible) { 1564 ret = wait_event_interruptible 1565 (bo->event_queue, atomic_read(&bo->reserved) == 0); 1566 if (unlikely(ret != 0)) 1567 return -ERESTART; 1568 } else { 1569 wait_event(bo->event_queue, 1570 atomic_read(&bo->reserved) == 0); 1571 } 1572 } 1573 return 0; 1574 } 1575 1576 int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait) 1577 { 1578 int ret = 0; 1579 1580 /* 1581 * Using ttm_bo_reserve instead of ttm_bo_block_reservation 1582 * makes sure the lru lists are updated. 1583 */ 1584 1585 ret = ttm_bo_reserve(bo, true, no_wait, false, 0); 1586 if (unlikely(ret != 0)) 1587 return ret; 1588 spin_lock(&bo->lock); 1589 ret = ttm_bo_wait(bo, false, true, no_wait); 1590 spin_unlock(&bo->lock); 1591 if (likely(ret == 0)) 1592 atomic_inc(&bo->cpu_writers); 1593 ttm_bo_unreserve(bo); 1594 return ret; 1595 } 1596 1597 void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo) 1598 { 1599 if (atomic_dec_and_test(&bo->cpu_writers)) 1600 wake_up_all(&bo->event_queue); 1601 } 1602 1603 /** 1604 * A buffer object shrink method that tries to swap out the first 1605 * buffer object on the bo_global::swap_lru list. 1606 */ 1607 1608 static int ttm_bo_swapout(struct ttm_mem_shrink *shrink) 1609 { 1610 struct ttm_bo_device *bdev = 1611 container_of(shrink, struct ttm_bo_device, shrink); 1612 struct ttm_buffer_object *bo; 1613 int ret = -EBUSY; 1614 int put_count; 1615 uint32_t swap_placement = (TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM); 1616 1617 spin_lock(&bdev->lru_lock); 1618 while (ret == -EBUSY) { 1619 if (unlikely(list_empty(&bdev->swap_lru))) { 1620 spin_unlock(&bdev->lru_lock); 1621 return -EBUSY; 1622 } 1623 1624 bo = list_first_entry(&bdev->swap_lru, 1625 struct ttm_buffer_object, swap); 1626 kref_get(&bo->list_kref); 1627 1628 /** 1629 * Reserve buffer. Since we unlock while sleeping, we need 1630 * to re-check that nobody removed us from the swap-list while 1631 * we slept. 1632 */ 1633 1634 ret = ttm_bo_reserve_locked(bo, false, true, false, 0); 1635 if (unlikely(ret == -EBUSY)) { 1636 spin_unlock(&bdev->lru_lock); 1637 ttm_bo_wait_unreserved(bo, false); 1638 kref_put(&bo->list_kref, ttm_bo_release_list); 1639 spin_lock(&bdev->lru_lock); 1640 } 1641 } 1642 1643 BUG_ON(ret != 0); 1644 put_count = ttm_bo_del_from_lru(bo); 1645 spin_unlock(&bdev->lru_lock); 1646 1647 while (put_count--) 1648 kref_put(&bo->list_kref, ttm_bo_ref_bug); 1649 1650 /** 1651 * Wait for GPU, then move to system cached. 1652 */ 1653 1654 spin_lock(&bo->lock); 1655 ret = ttm_bo_wait(bo, false, false, false); 1656 spin_unlock(&bo->lock); 1657 1658 if (unlikely(ret != 0)) 1659 goto out; 1660 1661 if ((bo->mem.placement & swap_placement) != swap_placement) { 1662 struct ttm_mem_reg evict_mem; 1663 1664 evict_mem = bo->mem; 1665 evict_mem.mm_node = NULL; 1666 evict_mem.placement = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED; 1667 evict_mem.mem_type = TTM_PL_SYSTEM; 1668 1669 ret = ttm_bo_handle_move_mem(bo, &evict_mem, true, 1670 false, false); 1671 if (unlikely(ret != 0)) 1672 goto out; 1673 } 1674 1675 ttm_bo_unmap_virtual(bo); 1676 1677 /** 1678 * Swap out. Buffer will be swapped in again as soon as 1679 * anyone tries to access a ttm page. 1680 */ 1681 1682 ret = ttm_tt_swapout(bo->ttm, bo->persistant_swap_storage); 1683 out: 1684 1685 /** 1686 * 1687 * Unreserve without putting on LRU to avoid swapping out an 1688 * already swapped buffer. 1689 */ 1690 1691 atomic_set(&bo->reserved, 0); 1692 wake_up_all(&bo->event_queue); 1693 kref_put(&bo->list_kref, ttm_bo_release_list); 1694 return ret; 1695 } 1696 1697 void ttm_bo_swapout_all(struct ttm_bo_device *bdev) 1698 { 1699 while (ttm_bo_swapout(&bdev->shrink) == 0) 1700 ; 1701 } 1702