Lines Matching refs:pool
20 struct dmabuf_page_pool pool; member
28 struct page *dmabuf_page_pool_alloc_pages(struct dmabuf_page_pool *pool) in dmabuf_page_pool_alloc_pages() argument
32 return alloc_pages(pool->gfp_mask, pool->order); in dmabuf_page_pool_alloc_pages()
35 static inline void dmabuf_page_pool_free_pages(struct dmabuf_page_pool *pool, in dmabuf_page_pool_free_pages() argument
38 __free_pages(page, pool->order); in dmabuf_page_pool_free_pages()
41 static void dmabuf_page_pool_add(struct dmabuf_page_pool *pool, struct page *page) in dmabuf_page_pool_add() argument
45 container_of(pool, struct dmabuf_page_pool_with_spinlock, pool); in dmabuf_page_pool_add()
53 list_add_tail(&page->lru, &pool->items[index]); in dmabuf_page_pool_add()
54 pool->count[index]++; in dmabuf_page_pool_add()
57 1 << pool->order); in dmabuf_page_pool_add()
60 static struct page *dmabuf_page_pool_remove(struct dmabuf_page_pool *pool, int index) in dmabuf_page_pool_remove() argument
64 container_of(pool, struct dmabuf_page_pool_with_spinlock, pool); in dmabuf_page_pool_remove()
67 page = list_first_entry_or_null(&pool->items[index], struct page, lru); in dmabuf_page_pool_remove()
69 pool->count[index]--; in dmabuf_page_pool_remove()
73 -(1 << pool->order)); in dmabuf_page_pool_remove()
82 static struct page *dmabuf_page_pool_fetch(struct dmabuf_page_pool *pool) in dmabuf_page_pool_fetch() argument
86 page = dmabuf_page_pool_remove(pool, POOL_HIGHPAGE); in dmabuf_page_pool_fetch()
88 page = dmabuf_page_pool_remove(pool, POOL_LOWPAGE); in dmabuf_page_pool_fetch()
93 struct page *dmabuf_page_pool_alloc(struct dmabuf_page_pool *pool) in dmabuf_page_pool_alloc() argument
97 if (WARN_ON(!pool)) in dmabuf_page_pool_alloc()
100 page = dmabuf_page_pool_fetch(pool); in dmabuf_page_pool_alloc()
103 page = dmabuf_page_pool_alloc_pages(pool); in dmabuf_page_pool_alloc()
108 void dmabuf_page_pool_free(struct dmabuf_page_pool *pool, struct page *page) in dmabuf_page_pool_free() argument
110 if (WARN_ON(pool->order != compound_order(page))) in dmabuf_page_pool_free()
113 dmabuf_page_pool_add(pool, page); in dmabuf_page_pool_free()
117 static int dmabuf_page_pool_total(struct dmabuf_page_pool *pool, bool high) in dmabuf_page_pool_total() argument
119 int count = pool->count[POOL_LOWPAGE]; in dmabuf_page_pool_total()
122 count += pool->count[POOL_HIGHPAGE]; in dmabuf_page_pool_total()
124 return count << pool->order; in dmabuf_page_pool_total()
129 struct dmabuf_page_pool *pool; in dmabuf_page_pool_create() local
138 pool = &container_pool->pool; in dmabuf_page_pool_create()
141 pool->count[i] = 0; in dmabuf_page_pool_create()
142 INIT_LIST_HEAD(&pool->items[i]); in dmabuf_page_pool_create()
144 pool->gfp_mask = gfp_mask | __GFP_COMP; in dmabuf_page_pool_create()
145 pool->order = order; in dmabuf_page_pool_create()
146 mutex_init(&pool->mutex); /* No longer used! */ in dmabuf_page_pool_create()
147 mutex_lock(&pool->mutex); /* Make sure anyone who attempts to acquire this hangs */ in dmabuf_page_pool_create()
150 list_add(&pool->list, &pool_list); in dmabuf_page_pool_create()
153 return pool; in dmabuf_page_pool_create()
157 void dmabuf_page_pool_destroy(struct dmabuf_page_pool *pool) in dmabuf_page_pool_destroy() argument
165 list_del(&pool->list); in dmabuf_page_pool_destroy()
170 while ((page = dmabuf_page_pool_remove(pool, i))) in dmabuf_page_pool_destroy()
171 dmabuf_page_pool_free_pages(pool, page); in dmabuf_page_pool_destroy()
174 container_pool = container_of(pool, struct dmabuf_page_pool_with_spinlock, pool); in dmabuf_page_pool_destroy()
179 static int dmabuf_page_pool_do_shrink(struct dmabuf_page_pool *pool, gfp_t gfp_mask, in dmabuf_page_pool_do_shrink() argument
191 return dmabuf_page_pool_total(pool, high); in dmabuf_page_pool_do_shrink()
197 page = dmabuf_page_pool_remove(pool, POOL_LOWPAGE); in dmabuf_page_pool_do_shrink()
199 page = dmabuf_page_pool_remove(pool, POOL_HIGHPAGE); in dmabuf_page_pool_do_shrink()
204 dmabuf_page_pool_free_pages(pool, page); in dmabuf_page_pool_do_shrink()
205 freed += (1 << pool->order); in dmabuf_page_pool_do_shrink()
213 struct dmabuf_page_pool *pool; in dmabuf_page_pool_shrink() local
222 list_for_each_entry(pool, &pool_list, list) { in dmabuf_page_pool_shrink()
224 nr_total += dmabuf_page_pool_do_shrink(pool, in dmabuf_page_pool_shrink()
228 nr_freed = dmabuf_page_pool_do_shrink(pool, in dmabuf_page_pool_shrink()