xref: /freebsd/sys/dev/drm2/ttm/ttm_page_alloc.c (revision 0572ccaa4543b0abef8ef81e384c1d04de9f3da1)
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