Lines Matching refs:pool

151 	struct dma_pool *pool;  member
266 static int ttm_set_pages_caching(struct dma_pool *pool, in ttm_set_pages_caching() argument
271 if (pool->type & IS_UC) { in ttm_set_pages_caching()
275 pool->dev_name, cpages); in ttm_set_pages_caching()
277 if (pool->type & IS_WC) { in ttm_set_pages_caching()
281 pool->dev_name, cpages); in ttm_set_pages_caching()
286 static void __ttm_dma_free_page(struct dma_pool *pool, struct dma_page *d_page) in __ttm_dma_free_page() argument
291 if (pool->type & IS_HUGE) in __ttm_dma_free_page()
294 dma_free_attrs(pool->dev, pool->size, (void *)d_page->vaddr, dma, attrs); in __ttm_dma_free_page()
299 static struct dma_page *__ttm_dma_alloc_page(struct dma_pool *pool) in __ttm_dma_alloc_page() argument
309 if (pool->type & IS_HUGE) in __ttm_dma_alloc_page()
312 vaddr = dma_alloc_attrs(pool->dev, pool->size, &d_page->dma, in __ttm_dma_alloc_page()
313 pool->gfp_flags, attrs); in __ttm_dma_alloc_page()
320 if (pool->type & IS_HUGE) in __ttm_dma_alloc_page()
344 static void ttm_pool_update_free_locked(struct dma_pool *pool, in ttm_pool_update_free_locked() argument
347 pool->npages_free -= freed_pages; in ttm_pool_update_free_locked()
348 pool->nfrees += freed_pages; in ttm_pool_update_free_locked()
353 static void ttm_dma_page_put(struct dma_pool *pool, struct dma_page *d_page) in ttm_dma_page_put() argument
359 if (!(pool->type & IS_CACHED)) { in ttm_dma_page_put()
360 num_pages = pool->size / PAGE_SIZE; in ttm_dma_page_put()
363 pool->dev_name, num_pages); in ttm_dma_page_put()
367 __ttm_dma_free_page(pool, d_page); in ttm_dma_page_put()
370 static void ttm_dma_pages_put(struct dma_pool *pool, struct list_head *d_pages, in ttm_dma_pages_put() argument
375 if (pool->type & IS_HUGE) { in ttm_dma_pages_put()
377 ttm_dma_page_put(pool, d_page); in ttm_dma_pages_put()
383 if (npages && !(pool->type & IS_CACHED) && in ttm_dma_pages_put()
386 pool->dev_name, npages); in ttm_dma_pages_put()
390 __ttm_dma_free_page(pool, d_page); in ttm_dma_pages_put()
404 static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free, in ttm_dma_page_pool_free() argument
427 pool->dev_name); in ttm_dma_page_pool_free()
432 spin_lock_irqsave(&pool->lock, irq_flags); in ttm_dma_page_pool_free()
435 list_for_each_entry_safe_reverse(dma_p, tmp, &pool->free_list, in ttm_dma_page_pool_free()
447 ttm_pool_update_free_locked(pool, freed_pages); in ttm_dma_page_pool_free()
452 spin_unlock_irqrestore(&pool->lock, irq_flags); in ttm_dma_page_pool_free()
454 ttm_dma_pages_put(pool, &d_pages, pages_to_free, in ttm_dma_page_pool_free()
484 ttm_pool_update_free_locked(pool, freed_pages); in ttm_dma_page_pool_free()
488 spin_unlock_irqrestore(&pool->lock, irq_flags); in ttm_dma_page_pool_free()
491 ttm_dma_pages_put(pool, &d_pages, pages_to_free, freed_pages); in ttm_dma_page_pool_free()
501 struct dma_pool *pool; in ttm_dma_free_pool() local
510 pool = p->pool; in ttm_dma_free_pool()
511 if (pool->type != type) in ttm_dma_free_pool()
519 list_for_each_entry_reverse(pool, &dev->dma_pools, pools) { in ttm_dma_free_pool()
520 if (pool->type != type) in ttm_dma_free_pool()
524 ttm_dma_page_pool_free(pool, FREE_ALL_PAGES, true); in ttm_dma_free_pool()
525 WARN_ON(((pool->npages_in_use + pool->npages_free) != 0)); in ttm_dma_free_pool()
530 list_del(&pool->pools); in ttm_dma_free_pool()
531 kfree(pool); in ttm_dma_free_pool()
543 struct dma_pool *pool = *(struct dma_pool **)res; in ttm_dma_pool_release() local
545 if (pool) in ttm_dma_pool_release()
546 ttm_dma_free_pool(dev, pool->type); in ttm_dma_pool_release()
560 struct dma_pool *pool = NULL, **ptr; in ttm_dma_pool_init() local
574 pool = kmalloc_node(sizeof(struct dma_pool), GFP_KERNEL, in ttm_dma_pool_init()
576 if (!pool) in ttm_dma_pool_init()
586 sec_pool->pool = pool; in ttm_dma_pool_init()
588 INIT_LIST_HEAD(&pool->free_list); in ttm_dma_pool_init()
589 INIT_LIST_HEAD(&pool->pools); in ttm_dma_pool_init()
590 spin_lock_init(&pool->lock); in ttm_dma_pool_init()
591 pool->dev = dev; in ttm_dma_pool_init()
592 pool->npages_free = pool->npages_in_use = 0; in ttm_dma_pool_init()
593 pool->nfrees = 0; in ttm_dma_pool_init()
594 pool->gfp_flags = flags; in ttm_dma_pool_init()
597 pool->size = HPAGE_PMD_SIZE; in ttm_dma_pool_init()
602 pool->size = PAGE_SIZE; in ttm_dma_pool_init()
603 pool->type = type; in ttm_dma_pool_init()
604 pool->nrefills = 0; in ttm_dma_pool_init()
605 p = pool->name; in ttm_dma_pool_init()
608 p += snprintf(p, sizeof(pool->name) - (p - pool->name), in ttm_dma_pool_init()
615 snprintf(pool->dev_name, sizeof(pool->dev_name), "%s %s", in ttm_dma_pool_init()
622 list_add(&pool->pools, &dev->dma_pools); in ttm_dma_pool_init()
625 *ptr = pool; in ttm_dma_pool_init()
628 return pool; in ttm_dma_pool_init()
632 kfree(pool); in ttm_dma_pool_init()
639 struct dma_pool *pool, *tmp; in ttm_dma_find_pool() local
655 list_for_each_entry_safe(pool, tmp, &dev->dma_pools, pools) in ttm_dma_find_pool()
656 if (pool->type == type) in ttm_dma_find_pool()
657 return pool; in ttm_dma_find_pool()
666 static void ttm_dma_handle_caching_state_failure(struct dma_pool *pool, in ttm_dma_handle_caching_state_failure() argument
684 __ttm_dma_free_page(pool, d_page); in ttm_dma_handle_caching_state_failure()
699 static int ttm_dma_pool_alloc_new_pages(struct dma_pool *pool, in ttm_dma_pool_alloc_new_pages() argument
717 pool->dev_name); in ttm_dma_pool_alloc_new_pages()
723 pool->dev_name, pool->name, current->pid, count); in ttm_dma_pool_alloc_new_pages()
726 dma_p = __ttm_dma_alloc_page(pool); in ttm_dma_pool_alloc_new_pages()
729 pool->dev_name, i); in ttm_dma_pool_alloc_new_pages()
734 r = ttm_set_pages_caching(pool, caching_array, in ttm_dma_pool_alloc_new_pages()
738 pool, d_pages, caching_array, in ttm_dma_pool_alloc_new_pages()
755 npages = pool->size / PAGE_SIZE; in ttm_dma_pool_alloc_new_pages()
760 r = ttm_set_pages_caching(pool, caching_array, in ttm_dma_pool_alloc_new_pages()
764 pool, d_pages, caching_array, in ttm_dma_pool_alloc_new_pages()
774 r = ttm_set_pages_caching(pool, caching_array, cpages); in ttm_dma_pool_alloc_new_pages()
776 ttm_dma_handle_caching_state_failure(pool, d_pages, in ttm_dma_pool_alloc_new_pages()
787 static int ttm_dma_page_pool_fill_locked(struct dma_pool *pool, in ttm_dma_page_pool_fill_locked() argument
791 int r = pool->npages_free; in ttm_dma_page_pool_fill_locked()
793 if (count > pool->npages_free) { in ttm_dma_page_pool_fill_locked()
798 spin_unlock_irqrestore(&pool->lock, *irq_flags); in ttm_dma_page_pool_fill_locked()
802 r = ttm_dma_pool_alloc_new_pages(pool, &d_pages, count); in ttm_dma_page_pool_fill_locked()
804 spin_lock_irqsave(&pool->lock, *irq_flags); in ttm_dma_page_pool_fill_locked()
807 list_splice(&d_pages, &pool->free_list); in ttm_dma_page_pool_fill_locked()
808 ++pool->nrefills; in ttm_dma_page_pool_fill_locked()
809 pool->npages_free += count; in ttm_dma_page_pool_fill_locked()
816 pool->dev_name, pool->name, r); in ttm_dma_page_pool_fill_locked()
821 list_splice_tail(&d_pages, &pool->free_list); in ttm_dma_page_pool_fill_locked()
822 pool->npages_free += cpages; in ttm_dma_page_pool_fill_locked()
834 static struct dma_page *ttm_dma_pool_get_pages(struct dma_pool *pool, in ttm_dma_pool_get_pages() argument
843 spin_lock_irqsave(&pool->lock, irq_flags); in ttm_dma_pool_get_pages()
844 count = ttm_dma_page_pool_fill_locked(pool, &irq_flags); in ttm_dma_pool_get_pages()
846 d_page = list_first_entry(&pool->free_list, struct dma_page, page_list); in ttm_dma_pool_get_pages()
850 pool->npages_in_use += 1; in ttm_dma_pool_get_pages()
851 pool->npages_free -= 1; in ttm_dma_pool_get_pages()
853 spin_unlock_irqrestore(&pool->lock, irq_flags); in ttm_dma_pool_get_pages()
892 struct dma_pool *pool; in ttm_dma_populate() local
913 pool = ttm_dma_find_pool(dev, type | IS_HUGE); in ttm_dma_populate()
914 if (!pool) { in ttm_dma_populate()
917 pool = ttm_dma_pool_init(dev, gfp_flags, type | IS_HUGE); in ttm_dma_populate()
918 if (IS_ERR_OR_NULL(pool)) in ttm_dma_populate()
925 d_page = ttm_dma_pool_get_pages(pool, ttm_dma, i); in ttm_dma_populate()
930 pool->size, ctx); in ttm_dma_populate()
950 pool = ttm_dma_find_pool(dev, type); in ttm_dma_populate()
951 if (!pool) { in ttm_dma_populate()
954 pool = ttm_dma_pool_init(dev, gfp_flags, type); in ttm_dma_populate()
955 if (IS_ERR_OR_NULL(pool)) in ttm_dma_populate()
960 d_page = ttm_dma_pool_get_pages(pool, ttm_dma, i); in ttm_dma_populate()
967 pool->size, ctx); in ttm_dma_populate()
996 struct dma_pool *pool; in ttm_dma_unpopulate() local
1006 pool = ttm_dma_find_pool(dev, type | IS_HUGE); in ttm_dma_unpopulate()
1007 if (pool) { in ttm_dma_unpopulate()
1017 pool->size); in ttm_dma_unpopulate()
1020 ttm_dma_page_put(pool, d_page); in ttm_dma_unpopulate()
1023 spin_lock_irqsave(&pool->lock, irq_flags); in ttm_dma_unpopulate()
1024 pool->npages_in_use -= count; in ttm_dma_unpopulate()
1025 pool->nfrees += count; in ttm_dma_unpopulate()
1026 spin_unlock_irqrestore(&pool->lock, irq_flags); in ttm_dma_unpopulate()
1030 pool = ttm_dma_find_pool(dev, type); in ttm_dma_unpopulate()
1031 if (!pool) in ttm_dma_unpopulate()
1034 is_cached = (ttm_dma_find_pool(pool->dev, in ttm_dma_unpopulate()
1035 ttm_to_type(ttm->page_flags, tt_cached)) == pool); in ttm_dma_unpopulate()
1046 pool->size); in ttm_dma_unpopulate()
1051 ttm_dma_page_put(pool, d_page); in ttm_dma_unpopulate()
1054 spin_lock_irqsave(&pool->lock, irq_flags); in ttm_dma_unpopulate()
1055 pool->npages_in_use -= count; in ttm_dma_unpopulate()
1057 pool->nfrees += count; in ttm_dma_unpopulate()
1059 pool->npages_free += count; in ttm_dma_unpopulate()
1060 list_splice(&ttm_dma->pages_list, &pool->free_list); in ttm_dma_unpopulate()
1065 if (pool->npages_free >= (_manager->options.max_size + in ttm_dma_unpopulate()
1067 npages = pool->npages_free - _manager->options.max_size; in ttm_dma_unpopulate()
1069 spin_unlock_irqrestore(&pool->lock, irq_flags); in ttm_dma_unpopulate()
1079 ttm_dma_page_pool_free(pool, npages, false); in ttm_dma_unpopulate()
1122 shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free, true); in ttm_dma_pool_shrink_scan()
1126 p->pool->dev_name, p->pool->name, current->pid, in ttm_dma_pool_shrink_scan()
1143 count += p->pool->npages_free; in ttm_dma_pool_shrink_count()
1205 dev_dbg(p->dev, "(%s:%d) Freeing.\n", p->pool->name, in ttm_dma_page_alloc_fini()
1208 ttm_dma_pool_match, p->pool)); in ttm_dma_page_alloc_fini()
1209 ttm_dma_free_pool(p->dev, p->pool->type); in ttm_dma_page_alloc_fini()
1218 struct dma_pool *pool = NULL; in ttm_dma_page_alloc_debugfs() local
1230 pool = p->pool; in ttm_dma_page_alloc_debugfs()
1232 pool->name, pool->nrefills, in ttm_dma_page_alloc_debugfs()
1233 pool->nfrees, pool->npages_in_use, in ttm_dma_page_alloc_debugfs()
1234 pool->npages_free, in ttm_dma_page_alloc_debugfs()
1235 pool->dev_name); in ttm_dma_page_alloc_debugfs()