1 /* 2 * Copyright (c) Red Hat Inc. 3 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sub license, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the 12 * next paragraph) shall be included in all copies or substantial portions 13 * of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 * 23 * Authors: Dave Airlie <airlied@redhat.com> 24 * Jerome Glisse <jglisse@redhat.com> 25 * Pauli Nieminen <suokkos@gmail.com> 26 */ 27 /* 28 * Copyright (c) 2013 The FreeBSD Foundation 29 * All rights reserved. 30 * 31 * Portions of this software were developed by Konstantin Belousov 32 * <kib@FreeBSD.org> under sponsorship from the FreeBSD Foundation. 33 */ 34 35 /* simple list based uncached page pool 36 * - Pool collects resently freed pages for reuse 37 * - Use page->lru to keep a free list 38 * - doesn't track currently in use pages 39 */ 40 41 #include <sys/cdefs.h> 42 __FBSDID("$FreeBSD$"); 43 44 #include <dev/drm2/drmP.h> 45 #include <dev/drm2/ttm/ttm_bo_driver.h> 46 #include <dev/drm2/ttm/ttm_page_alloc.h> 47 48 #ifdef TTM_HAS_AGP 49 #include <asm/agp.h> 50 #endif 51 52 #define NUM_PAGES_TO_ALLOC (PAGE_SIZE/sizeof(vm_page_t)) 53 #define SMALL_ALLOCATION 16 54 #define FREE_ALL_PAGES (~0U) 55 /* times are in msecs */ 56 #define PAGE_FREE_INTERVAL 1000 57 58 /** 59 * struct ttm_page_pool - Pool to reuse recently allocated uc/wc pages. 60 * 61 * @lock: Protects the shared pool from concurrnet access. Must be used with 62 * irqsave/irqrestore variants because pool allocator maybe called from 63 * delayed work. 64 * @fill_lock: Prevent concurrent calls to fill. 65 * @list: Pool of free uc/wc pages for fast reuse. 66 * @gfp_flags: Flags to pass for alloc_page. 67 * @npages: Number of pages in pool. 68 */ 69 struct ttm_page_pool { 70 struct mtx lock; 71 bool fill_lock; 72 bool dma32; 73 struct pglist list; 74 int ttm_page_alloc_flags; 75 unsigned npages; 76 char *name; 77 unsigned long nfrees; 78 unsigned long nrefills; 79 }; 80 81 /** 82 * Limits for the pool. They are handled without locks because only place where 83 * they may change is in sysfs store. They won't have immediate effect anyway 84 * so forcing serialization to access them is pointless. 85 */ 86 87 struct ttm_pool_opts { 88 unsigned alloc_size; 89 unsigned max_size; 90 unsigned small; 91 }; 92 93 #define NUM_POOLS 4 94 95 /** 96 * struct ttm_pool_manager - Holds memory pools for fst allocation 97 * 98 * Manager is read only object for pool code so it doesn't need locking. 99 * 100 * @free_interval: minimum number of jiffies between freeing pages from pool. 101 * @page_alloc_inited: reference counting for pool allocation. 102 * @work: Work that is used to shrink the pool. Work is only run when there is 103 * some pages to free. 104 * @small_allocation: Limit in number of pages what is small allocation. 105 * 106 * @pools: All pool objects in use. 107 **/ 108 struct ttm_pool_manager { 109 unsigned int kobj_ref; 110 eventhandler_tag lowmem_handler; 111 struct ttm_pool_opts options; 112 113 union { 114 struct ttm_page_pool u_pools[NUM_POOLS]; 115 struct _utag { 116 struct ttm_page_pool u_wc_pool; 117 struct ttm_page_pool u_uc_pool; 118 struct ttm_page_pool u_wc_pool_dma32; 119 struct ttm_page_pool u_uc_pool_dma32; 120 } _ut; 121 } _u; 122 }; 123 124 #define pools _u.u_pools 125 #define wc_pool _u._ut.u_wc_pool 126 #define uc_pool _u._ut.u_uc_pool 127 #define wc_pool_dma32 _u._ut.u_wc_pool_dma32 128 #define uc_pool_dma32 _u._ut.u_uc_pool_dma32 129 130 MALLOC_DEFINE(M_TTM_POOLMGR, "ttm_poolmgr", "TTM Pool Manager"); 131 132 static void 133 ttm_vm_page_free(vm_page_t m) 134 { 135 136 KASSERT(m->object == NULL, ("ttm page %p is owned", m)); 137 KASSERT(m->wire_count == 1, ("ttm lost wire %p", m)); 138 KASSERT((m->flags & PG_FICTITIOUS) != 0, ("ttm lost fictitious %p", m)); 139 KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("ttm got unmanaged %p", m)); 140 m->flags &= ~PG_FICTITIOUS; 141 m->oflags |= VPO_UNMANAGED; 142 vm_page_unwire(m, 0); 143 vm_page_free(m); 144 } 145 146 static vm_memattr_t 147 ttm_caching_state_to_vm(enum ttm_caching_state cstate) 148 { 149 150 switch (cstate) { 151 case tt_uncached: 152 return (VM_MEMATTR_UNCACHEABLE); 153 case tt_wc: 154 return (VM_MEMATTR_WRITE_COMBINING); 155 case tt_cached: 156 return (VM_MEMATTR_WRITE_BACK); 157 } 158 panic("caching state %d\n", cstate); 159 } 160 161 static void ttm_pool_kobj_release(struct ttm_pool_manager *m) 162 { 163 164 free(m, M_TTM_POOLMGR); 165 } 166 167 #if 0 168 /* XXXKIB sysctl */ 169 static ssize_t ttm_pool_store(struct ttm_pool_manager *m, 170 struct attribute *attr, const char *buffer, size_t size) 171 { 172 int chars; 173 unsigned val; 174 chars = sscanf(buffer, "%u", &val); 175 if (chars == 0) 176 return size; 177 178 /* Convert kb to number of pages */ 179 val = val / (PAGE_SIZE >> 10); 180 181 if (attr == &ttm_page_pool_max) 182 m->options.max_size = val; 183 else if (attr == &ttm_page_pool_small) 184 m->options.small = val; 185 else if (attr == &ttm_page_pool_alloc_size) { 186 if (val > NUM_PAGES_TO_ALLOC*8) { 187 pr_err("Setting allocation size to %lu is not allowed. Recommended size is %lu\n", 188 NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 7), 189 NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 10)); 190 return size; 191 } else if (val > NUM_PAGES_TO_ALLOC) { 192 pr_warn("Setting allocation size to larger than %lu is not recommended\n", 193 NUM_PAGES_TO_ALLOC*(PAGE_SIZE >> 10)); 194 } 195 m->options.alloc_size = val; 196 } 197 198 return size; 199 } 200 201 static ssize_t ttm_pool_show(struct ttm_pool_manager *m, 202 struct attribute *attr, char *buffer) 203 { 204 unsigned val = 0; 205 206 if (attr == &ttm_page_pool_max) 207 val = m->options.max_size; 208 else if (attr == &ttm_page_pool_small) 209 val = m->options.small; 210 else if (attr == &ttm_page_pool_alloc_size) 211 val = m->options.alloc_size; 212 213 val = val * (PAGE_SIZE >> 10); 214 215 return snprintf(buffer, PAGE_SIZE, "%u\n", val); 216 } 217 #endif 218 219 static struct ttm_pool_manager *_manager; 220 221 static int set_pages_array_wb(vm_page_t *pages, int addrinarray) 222 { 223 vm_page_t m; 224 int i; 225 226 for (i = 0; i < addrinarray; i++) { 227 m = pages[i]; 228 #ifdef TTM_HAS_AGP 229 unmap_page_from_agp(m); 230 #endif 231 pmap_page_set_memattr(m, VM_MEMATTR_WRITE_BACK); 232 } 233 return 0; 234 } 235 236 static int set_pages_array_wc(vm_page_t *pages, int addrinarray) 237 { 238 vm_page_t m; 239 int i; 240 241 for (i = 0; i < addrinarray; i++) { 242 m = pages[i]; 243 #ifdef TTM_HAS_AGP 244 map_page_into_agp(pages[i]); 245 #endif 246 pmap_page_set_memattr(m, VM_MEMATTR_WRITE_COMBINING); 247 } 248 return 0; 249 } 250 251 static int set_pages_array_uc(vm_page_t *pages, int addrinarray) 252 { 253 vm_page_t m; 254 int i; 255 256 for (i = 0; i < addrinarray; i++) { 257 m = pages[i]; 258 #ifdef TTM_HAS_AGP 259 map_page_into_agp(pages[i]); 260 #endif 261 pmap_page_set_memattr(m, VM_MEMATTR_UNCACHEABLE); 262 } 263 return 0; 264 } 265 266 /** 267 * Select the right pool or requested caching state and ttm flags. */ 268 static struct ttm_page_pool *ttm_get_pool(int flags, 269 enum ttm_caching_state cstate) 270 { 271 int pool_index; 272 273 if (cstate == tt_cached) 274 return NULL; 275 276 if (cstate == tt_wc) 277 pool_index = 0x0; 278 else 279 pool_index = 0x1; 280 281 if (flags & TTM_PAGE_FLAG_DMA32) 282 pool_index |= 0x2; 283 284 return &_manager->pools[pool_index]; 285 } 286 287 /* set memory back to wb and free the pages. */ 288 static void ttm_pages_put(vm_page_t *pages, unsigned npages) 289 { 290 unsigned i; 291 292 /* Our VM handles vm memattr automatically on the page free. */ 293 if (set_pages_array_wb(pages, npages)) 294 printf("[TTM] Failed to set %d pages to wb!\n", npages); 295 for (i = 0; i < npages; ++i) 296 ttm_vm_page_free(pages[i]); 297 } 298 299 static void ttm_pool_update_free_locked(struct ttm_page_pool *pool, 300 unsigned freed_pages) 301 { 302 pool->npages -= freed_pages; 303 pool->nfrees += freed_pages; 304 } 305 306 /** 307 * Free pages from pool. 308 * 309 * To prevent hogging the ttm_swap process we only free NUM_PAGES_TO_ALLOC 310 * number of pages in one go. 311 * 312 * @pool: to free the pages from 313 * @free_all: If set to true will free all pages in pool 314 **/ 315 static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free) 316 { 317 vm_page_t p, p1; 318 vm_page_t *pages_to_free; 319 unsigned freed_pages = 0, 320 npages_to_free = nr_free; 321 unsigned i; 322 323 if (NUM_PAGES_TO_ALLOC < nr_free) 324 npages_to_free = NUM_PAGES_TO_ALLOC; 325 326 pages_to_free = malloc(npages_to_free * sizeof(vm_page_t), 327 M_TEMP, M_WAITOK | M_ZERO); 328 329 restart: 330 mtx_lock(&pool->lock); 331 332 TAILQ_FOREACH_REVERSE_SAFE(p, &pool->list, pglist, plinks.q, p1) { 333 if (freed_pages >= npages_to_free) 334 break; 335 336 pages_to_free[freed_pages++] = p; 337 /* We can only remove NUM_PAGES_TO_ALLOC at a time. */ 338 if (freed_pages >= NUM_PAGES_TO_ALLOC) { 339 /* remove range of pages from the pool */ 340 for (i = 0; i < freed_pages; i++) 341 TAILQ_REMOVE(&pool->list, pages_to_free[i], plinks.q); 342 343 ttm_pool_update_free_locked(pool, freed_pages); 344 /** 345 * Because changing page caching is costly 346 * we unlock the pool to prevent stalling. 347 */ 348 mtx_unlock(&pool->lock); 349 350 ttm_pages_put(pages_to_free, freed_pages); 351 if (likely(nr_free != FREE_ALL_PAGES)) 352 nr_free -= freed_pages; 353 354 if (NUM_PAGES_TO_ALLOC >= nr_free) 355 npages_to_free = nr_free; 356 else 357 npages_to_free = NUM_PAGES_TO_ALLOC; 358 359 freed_pages = 0; 360 361 /* free all so restart the processing */ 362 if (nr_free) 363 goto restart; 364 365 /* Not allowed to fall through or break because 366 * following context is inside spinlock while we are 367 * outside here. 368 */ 369 goto out; 370 371 } 372 } 373 374 /* remove range of pages from the pool */ 375 if (freed_pages) { 376 for (i = 0; i < freed_pages; i++) 377 TAILQ_REMOVE(&pool->list, pages_to_free[i], plinks.q); 378 379 ttm_pool_update_free_locked(pool, freed_pages); 380 nr_free -= freed_pages; 381 } 382 383 mtx_unlock(&pool->lock); 384 385 if (freed_pages) 386 ttm_pages_put(pages_to_free, freed_pages); 387 out: 388 free(pages_to_free, M_TEMP); 389 return nr_free; 390 } 391 392 /* Get good estimation how many pages are free in pools */ 393 static int ttm_pool_get_num_unused_pages(void) 394 { 395 unsigned i; 396 int total = 0; 397 for (i = 0; i < NUM_POOLS; ++i) 398 total += _manager->pools[i].npages; 399 400 return total; 401 } 402 403 /** 404 * Callback for mm to request pool to reduce number of page held. 405 */ 406 static int ttm_pool_mm_shrink(void *arg) 407 { 408 static unsigned int start_pool = 0; 409 unsigned i; 410 unsigned pool_offset = atomic_fetchadd_int(&start_pool, 1); 411 struct ttm_page_pool *pool; 412 int shrink_pages = 100; /* XXXKIB */ 413 414 pool_offset = pool_offset % NUM_POOLS; 415 /* select start pool in round robin fashion */ 416 for (i = 0; i < NUM_POOLS; ++i) { 417 unsigned nr_free = shrink_pages; 418 if (shrink_pages == 0) 419 break; 420 pool = &_manager->pools[(i + pool_offset)%NUM_POOLS]; 421 shrink_pages = ttm_page_pool_free(pool, nr_free); 422 } 423 /* return estimated number of unused pages in pool */ 424 return ttm_pool_get_num_unused_pages(); 425 } 426 427 static void ttm_pool_mm_shrink_init(struct ttm_pool_manager *manager) 428 { 429 430 manager->lowmem_handler = EVENTHANDLER_REGISTER(vm_lowmem, 431 ttm_pool_mm_shrink, manager, EVENTHANDLER_PRI_ANY); 432 } 433 434 static void ttm_pool_mm_shrink_fini(struct ttm_pool_manager *manager) 435 { 436 437 EVENTHANDLER_DEREGISTER(vm_lowmem, manager->lowmem_handler); 438 } 439 440 static int ttm_set_pages_caching(vm_page_t *pages, 441 enum ttm_caching_state cstate, unsigned cpages) 442 { 443 int r = 0; 444 /* Set page caching */ 445 switch (cstate) { 446 case tt_uncached: 447 r = set_pages_array_uc(pages, cpages); 448 if (r) 449 printf("[TTM] Failed to set %d pages to uc!\n", cpages); 450 break; 451 case tt_wc: 452 r = set_pages_array_wc(pages, cpages); 453 if (r) 454 printf("[TTM] Failed to set %d pages to wc!\n", cpages); 455 break; 456 default: 457 break; 458 } 459 return r; 460 } 461 462 /** 463 * Free pages the pages that failed to change the caching state. If there is 464 * any pages that have changed their caching state already put them to the 465 * pool. 466 */ 467 static void ttm_handle_caching_state_failure(struct pglist *pages, 468 int ttm_flags, enum ttm_caching_state cstate, 469 vm_page_t *failed_pages, unsigned cpages) 470 { 471 unsigned i; 472 /* Failed pages have to be freed */ 473 for (i = 0; i < cpages; ++i) { 474 TAILQ_REMOVE(pages, failed_pages[i], plinks.q); 475 ttm_vm_page_free(failed_pages[i]); 476 } 477 } 478 479 /** 480 * Allocate new pages with correct caching. 481 * 482 * This function is reentrant if caller updates count depending on number of 483 * pages returned in pages array. 484 */ 485 static int ttm_alloc_new_pages(struct pglist *pages, int ttm_alloc_flags, 486 int ttm_flags, enum ttm_caching_state cstate, unsigned count) 487 { 488 vm_page_t *caching_array; 489 vm_page_t p; 490 int r = 0; 491 unsigned i, cpages, aflags; 492 unsigned max_cpages = min(count, 493 (unsigned)(PAGE_SIZE/sizeof(vm_page_t))); 494 495 aflags = VM_ALLOC_NORMAL | VM_ALLOC_WIRED | VM_ALLOC_NOOBJ | 496 ((ttm_alloc_flags & TTM_PAGE_FLAG_ZERO_ALLOC) != 0 ? 497 VM_ALLOC_ZERO : 0); 498 499 /* allocate array for page caching change */ 500 caching_array = malloc(max_cpages * sizeof(vm_page_t), M_TEMP, 501 M_WAITOK | M_ZERO); 502 503 for (i = 0, cpages = 0; i < count; ++i) { 504 p = vm_page_alloc_contig(NULL, 0, aflags, 1, 0, 505 (ttm_alloc_flags & TTM_PAGE_FLAG_DMA32) ? 0xffffffff : 506 VM_MAX_ADDRESS, PAGE_SIZE, 0, 507 ttm_caching_state_to_vm(cstate)); 508 if (!p) { 509 printf("[TTM] Unable to get page %u\n", i); 510 511 /* store already allocated pages in the pool after 512 * setting the caching state */ 513 if (cpages) { 514 r = ttm_set_pages_caching(caching_array, 515 cstate, cpages); 516 if (r) 517 ttm_handle_caching_state_failure(pages, 518 ttm_flags, cstate, 519 caching_array, cpages); 520 } 521 r = -ENOMEM; 522 goto out; 523 } 524 p->oflags &= ~VPO_UNMANAGED; 525 p->flags |= PG_FICTITIOUS; 526 527 #ifdef CONFIG_HIGHMEM /* KIB: nop */ 528 /* gfp flags of highmem page should never be dma32 so we 529 * we should be fine in such case 530 */ 531 if (!PageHighMem(p)) 532 #endif 533 { 534 caching_array[cpages++] = p; 535 if (cpages == max_cpages) { 536 537 r = ttm_set_pages_caching(caching_array, 538 cstate, cpages); 539 if (r) { 540 ttm_handle_caching_state_failure(pages, 541 ttm_flags, cstate, 542 caching_array, cpages); 543 goto out; 544 } 545 cpages = 0; 546 } 547 } 548 549 TAILQ_INSERT_HEAD(pages, p, plinks.q); 550 } 551 552 if (cpages) { 553 r = ttm_set_pages_caching(caching_array, cstate, cpages); 554 if (r) 555 ttm_handle_caching_state_failure(pages, 556 ttm_flags, cstate, 557 caching_array, cpages); 558 } 559 out: 560 free(caching_array, M_TEMP); 561 562 return r; 563 } 564 565 /** 566 * Fill the given pool if there aren't enough pages and the requested number of 567 * pages is small. 568 */ 569 static void ttm_page_pool_fill_locked(struct ttm_page_pool *pool, 570 int ttm_flags, enum ttm_caching_state cstate, unsigned count) 571 { 572 vm_page_t p; 573 int r; 574 unsigned cpages = 0; 575 /** 576 * Only allow one pool fill operation at a time. 577 * If pool doesn't have enough pages for the allocation new pages are 578 * allocated from outside of pool. 579 */ 580 if (pool->fill_lock) 581 return; 582 583 pool->fill_lock = true; 584 585 /* If allocation request is small and there are not enough 586 * pages in a pool we fill the pool up first. */ 587 if (count < _manager->options.small 588 && count > pool->npages) { 589 struct pglist new_pages; 590 unsigned alloc_size = _manager->options.alloc_size; 591 592 /** 593 * Can't change page caching if in irqsave context. We have to 594 * drop the pool->lock. 595 */ 596 mtx_unlock(&pool->lock); 597 598 TAILQ_INIT(&new_pages); 599 r = ttm_alloc_new_pages(&new_pages, pool->ttm_page_alloc_flags, 600 ttm_flags, cstate, alloc_size); 601 mtx_lock(&pool->lock); 602 603 if (!r) { 604 TAILQ_CONCAT(&pool->list, &new_pages, plinks.q); 605 ++pool->nrefills; 606 pool->npages += alloc_size; 607 } else { 608 printf("[TTM] Failed to fill pool (%p)\n", pool); 609 /* If we have any pages left put them to the pool. */ 610 TAILQ_FOREACH(p, &pool->list, plinks.q) { 611 ++cpages; 612 } 613 TAILQ_CONCAT(&pool->list, &new_pages, plinks.q); 614 pool->npages += cpages; 615 } 616 617 } 618 pool->fill_lock = false; 619 } 620 621 /** 622 * Cut 'count' number of pages from the pool and put them on the return list. 623 * 624 * @return count of pages still required to fulfill the request. 625 */ 626 static unsigned ttm_page_pool_get_pages(struct ttm_page_pool *pool, 627 struct pglist *pages, 628 int ttm_flags, 629 enum ttm_caching_state cstate, 630 unsigned count) 631 { 632 vm_page_t p; 633 unsigned i; 634 635 mtx_lock(&pool->lock); 636 ttm_page_pool_fill_locked(pool, ttm_flags, cstate, count); 637 638 if (count >= pool->npages) { 639 /* take all pages from the pool */ 640 TAILQ_CONCAT(pages, &pool->list, plinks.q); 641 count -= pool->npages; 642 pool->npages = 0; 643 goto out; 644 } 645 for (i = 0; i < count; i++) { 646 p = TAILQ_FIRST(&pool->list); 647 TAILQ_REMOVE(&pool->list, p, plinks.q); 648 TAILQ_INSERT_TAIL(pages, p, plinks.q); 649 } 650 pool->npages -= count; 651 count = 0; 652 out: 653 mtx_unlock(&pool->lock); 654 return count; 655 } 656 657 /* Put all pages in pages list to correct pool to wait for reuse */ 658 static void ttm_put_pages(vm_page_t *pages, unsigned npages, int flags, 659 enum ttm_caching_state cstate) 660 { 661 struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); 662 unsigned i; 663 664 if (pool == NULL) { 665 /* No pool for this memory type so free the pages */ 666 for (i = 0; i < npages; i++) { 667 if (pages[i]) { 668 ttm_vm_page_free(pages[i]); 669 pages[i] = NULL; 670 } 671 } 672 return; 673 } 674 675 mtx_lock(&pool->lock); 676 for (i = 0; i < npages; i++) { 677 if (pages[i]) { 678 TAILQ_INSERT_TAIL(&pool->list, pages[i], plinks.q); 679 pages[i] = NULL; 680 pool->npages++; 681 } 682 } 683 /* Check that we don't go over the pool limit */ 684 npages = 0; 685 if (pool->npages > _manager->options.max_size) { 686 npages = pool->npages - _manager->options.max_size; 687 /* free at least NUM_PAGES_TO_ALLOC number of pages 688 * to reduce calls to set_memory_wb */ 689 if (npages < NUM_PAGES_TO_ALLOC) 690 npages = NUM_PAGES_TO_ALLOC; 691 } 692 mtx_unlock(&pool->lock); 693 if (npages) 694 ttm_page_pool_free(pool, npages); 695 } 696 697 /* 698 * On success pages list will hold count number of correctly 699 * cached pages. 700 */ 701 static int ttm_get_pages(vm_page_t *pages, unsigned npages, int flags, 702 enum ttm_caching_state cstate) 703 { 704 struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); 705 struct pglist plist; 706 vm_page_t p = NULL; 707 int gfp_flags, aflags; 708 unsigned count; 709 int r; 710 711 aflags = VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | 712 ((flags & TTM_PAGE_FLAG_ZERO_ALLOC) != 0 ? VM_ALLOC_ZERO : 0); 713 714 /* No pool for cached pages */ 715 if (pool == NULL) { 716 for (r = 0; r < npages; ++r) { 717 p = vm_page_alloc_contig(NULL, 0, aflags, 1, 0, 718 (flags & TTM_PAGE_FLAG_DMA32) ? 0xffffffff : 719 VM_MAX_ADDRESS, PAGE_SIZE, 720 0, ttm_caching_state_to_vm(cstate)); 721 if (!p) { 722 printf("[TTM] Unable to allocate page\n"); 723 return -ENOMEM; 724 } 725 p->oflags &= ~VPO_UNMANAGED; 726 p->flags |= PG_FICTITIOUS; 727 pages[r] = p; 728 } 729 return 0; 730 } 731 732 /* combine zero flag to pool flags */ 733 gfp_flags = flags | pool->ttm_page_alloc_flags; 734 735 /* First we take pages from the pool */ 736 TAILQ_INIT(&plist); 737 npages = ttm_page_pool_get_pages(pool, &plist, flags, cstate, npages); 738 count = 0; 739 TAILQ_FOREACH(p, &plist, plinks.q) { 740 pages[count++] = p; 741 } 742 743 /* clear the pages coming from the pool if requested */ 744 if (flags & TTM_PAGE_FLAG_ZERO_ALLOC) { 745 TAILQ_FOREACH(p, &plist, plinks.q) { 746 pmap_zero_page(p); 747 } 748 } 749 750 /* If pool didn't have enough pages allocate new one. */ 751 if (npages > 0) { 752 /* ttm_alloc_new_pages doesn't reference pool so we can run 753 * multiple requests in parallel. 754 **/ 755 TAILQ_INIT(&plist); 756 r = ttm_alloc_new_pages(&plist, gfp_flags, flags, cstate, 757 npages); 758 TAILQ_FOREACH(p, &plist, plinks.q) { 759 pages[count++] = p; 760 } 761 if (r) { 762 /* If there is any pages in the list put them back to 763 * the pool. */ 764 printf("[TTM] Failed to allocate extra pages for large request\n"); 765 ttm_put_pages(pages, count, flags, cstate); 766 return r; 767 } 768 } 769 770 return 0; 771 } 772 773 static void ttm_page_pool_init_locked(struct ttm_page_pool *pool, int flags, 774 char *name) 775 { 776 mtx_init(&pool->lock, "ttmpool", NULL, MTX_DEF); 777 pool->fill_lock = false; 778 TAILQ_INIT(&pool->list); 779 pool->npages = pool->nfrees = 0; 780 pool->ttm_page_alloc_flags = flags; 781 pool->name = name; 782 } 783 784 int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages) 785 { 786 787 if (_manager != NULL) 788 printf("[TTM] manager != NULL\n"); 789 printf("[TTM] Initializing pool allocator\n"); 790 791 _manager = malloc(sizeof(*_manager), M_TTM_POOLMGR, M_WAITOK | M_ZERO); 792 793 ttm_page_pool_init_locked(&_manager->wc_pool, 0, "wc"); 794 ttm_page_pool_init_locked(&_manager->uc_pool, 0, "uc"); 795 ttm_page_pool_init_locked(&_manager->wc_pool_dma32, 796 TTM_PAGE_FLAG_DMA32, "wc dma"); 797 ttm_page_pool_init_locked(&_manager->uc_pool_dma32, 798 TTM_PAGE_FLAG_DMA32, "uc dma"); 799 800 _manager->options.max_size = max_pages; 801 _manager->options.small = SMALL_ALLOCATION; 802 _manager->options.alloc_size = NUM_PAGES_TO_ALLOC; 803 804 refcount_init(&_manager->kobj_ref, 1); 805 ttm_pool_mm_shrink_init(_manager); 806 807 return 0; 808 } 809 810 void ttm_page_alloc_fini(void) 811 { 812 int i; 813 814 printf("[TTM] Finalizing pool allocator\n"); 815 ttm_pool_mm_shrink_fini(_manager); 816 817 for (i = 0; i < NUM_POOLS; ++i) 818 ttm_page_pool_free(&_manager->pools[i], FREE_ALL_PAGES); 819 820 if (refcount_release(&_manager->kobj_ref)) 821 ttm_pool_kobj_release(_manager); 822 _manager = NULL; 823 } 824 825 int ttm_pool_populate(struct ttm_tt *ttm) 826 { 827 struct ttm_mem_global *mem_glob = ttm->glob->mem_glob; 828 unsigned i; 829 int ret; 830 831 if (ttm->state != tt_unpopulated) 832 return 0; 833 834 for (i = 0; i < ttm->num_pages; ++i) { 835 ret = ttm_get_pages(&ttm->pages[i], 1, 836 ttm->page_flags, 837 ttm->caching_state); 838 if (ret != 0) { 839 ttm_pool_unpopulate(ttm); 840 return -ENOMEM; 841 } 842 843 ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i], 844 false, false); 845 if (unlikely(ret != 0)) { 846 ttm_pool_unpopulate(ttm); 847 return -ENOMEM; 848 } 849 } 850 851 if (unlikely(ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)) { 852 ret = ttm_tt_swapin(ttm); 853 if (unlikely(ret != 0)) { 854 ttm_pool_unpopulate(ttm); 855 return ret; 856 } 857 } 858 859 ttm->state = tt_unbound; 860 return 0; 861 } 862 863 void ttm_pool_unpopulate(struct ttm_tt *ttm) 864 { 865 unsigned i; 866 867 for (i = 0; i < ttm->num_pages; ++i) { 868 if (ttm->pages[i]) { 869 ttm_mem_global_free_page(ttm->glob->mem_glob, 870 ttm->pages[i]); 871 ttm_put_pages(&ttm->pages[i], 1, 872 ttm->page_flags, 873 ttm->caching_state); 874 } 875 } 876 ttm->state = tt_unpopulated; 877 } 878 879 #if 0 880 /* XXXKIB sysctl */ 881 int ttm_page_alloc_debugfs(struct seq_file *m, void *data) 882 { 883 struct ttm_page_pool *p; 884 unsigned i; 885 char *h[] = {"pool", "refills", "pages freed", "size"}; 886 if (!_manager) { 887 seq_printf(m, "No pool allocator running.\n"); 888 return 0; 889 } 890 seq_printf(m, "%6s %12s %13s %8s\n", 891 h[0], h[1], h[2], h[3]); 892 for (i = 0; i < NUM_POOLS; ++i) { 893 p = &_manager->pools[i]; 894 895 seq_printf(m, "%6s %12ld %13ld %8d\n", 896 p->name, p->nrefills, 897 p->nfrees, p->npages); 898 } 899 return 0; 900 } 901 #endif 902