#include <linux/spinlock.h>
#include <linux/highmem.h>
#include <linux/mm_types.h>
+#include <linux/module.h>
#include <linux/mm.h>
#include <asm/atomic.h>
struct list_head list;
int gfp_flags;
unsigned npages;
+ char *name;
+ unsigned long nfrees;
+ unsigned long nrefills;
};
struct ttm_pool_opts {
unsigned freed_pages)
{
pool->npages -= freed_pages;
+ pool->nfrees += freed_pages;
}
/**
}
}
-
/* remove range of pages from the pool */
if (freed_pages) {
__list_del(&p->lru, &pool->list);
if (!r) {
list_splice(&new_pages, &pool->list);
+ ++pool->nrefills;
pool->npages += alloc_size;
} else {
printk(KERN_ERR "[ttm] Failed to fill pool (%p).", pool);
ttm_page_pool_free(pool, page_count);
}
-static void ttm_page_pool_init_locked(struct ttm_page_pool *pool, int flags)
+static void ttm_page_pool_init_locked(struct ttm_page_pool *pool, int flags,
+ char *name)
{
spin_lock_init(&pool->lock);
pool->fill_lock = false;
INIT_LIST_HEAD(&pool->list);
- pool->npages = 0;
+ pool->npages = pool->nfrees = 0;
pool->gfp_flags = flags;
+ pool->name = name;
}
int ttm_page_alloc_init(unsigned max_pages)
printk(KERN_INFO "[ttm] Initializing pool allocator.\n");
- ttm_page_pool_init_locked(&_manager.wc_pool, GFP_HIGHUSER);
+ ttm_page_pool_init_locked(&_manager.wc_pool, GFP_HIGHUSER, "wc");
- ttm_page_pool_init_locked(&_manager.uc_pool, GFP_HIGHUSER);
+ ttm_page_pool_init_locked(&_manager.uc_pool, GFP_HIGHUSER, "uc");
- ttm_page_pool_init_locked(&_manager.wc_pool_dma32, GFP_USER | GFP_DMA32);
+ ttm_page_pool_init_locked(&_manager.wc_pool_dma32, GFP_USER | GFP_DMA32,
+ "wc dma");
- ttm_page_pool_init_locked(&_manager.uc_pool_dma32, GFP_USER | GFP_DMA32);
+ ttm_page_pool_init_locked(&_manager.uc_pool_dma32, GFP_USER | GFP_DMA32,
+ "uc dma");
_manager.options.max_size = max_pages;
_manager.options.small = SMALL_ALLOCATION;
for (i = 0; i < NUM_POOLS; ++i)
ttm_page_pool_free(&_manager.pools[i], FREE_ALL_PAGES);
}
+
+int ttm_page_alloc_debugfs(struct seq_file *m, void *data)
+{
+ struct ttm_page_pool *p;
+ unsigned i;
+ char *h[] = {"pool", "refills", "pages freed", "size"};
+ if (atomic_read(&_manager.page_alloc_inited) == 0) {
+ seq_printf(m, "No pool allocator running.\n");
+ return 0;
+ }
+ seq_printf(m, "%6s %12s %13s %8s\n",
+ h[0], h[1], h[2], h[3]);
+ for (i = 0; i < NUM_POOLS; ++i) {
+ p = &_manager.pools[i];
+
+ seq_printf(m, "%6s %12ld %13ld %8d\n",
+ p->name, p->nrefills,
+ p->nfrees, p->npages);
+ }
+ return 0;
+}
+EXPORT_SYMBOL(ttm_page_alloc_debugfs);