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