|
@@ -23,11 +23,6 @@
|
|
|
#include <linux/slab.h>
|
|
|
#include "ion_priv.h"
|
|
|
|
|
|
-struct ion_page_pool_item {
|
|
|
- struct page *page;
|
|
|
- struct list_head list;
|
|
|
-};
|
|
|
-
|
|
|
static void *ion_page_pool_alloc_pages(struct ion_page_pool *pool)
|
|
|
{
|
|
|
struct page *page = alloc_pages(pool->gfp_mask, pool->order);
|
|
@@ -47,19 +42,12 @@ static void ion_page_pool_free_pages(struct ion_page_pool *pool,
|
|
|
|
|
|
static int ion_page_pool_add(struct ion_page_pool *pool, struct page *page)
|
|
|
{
|
|
|
- struct ion_page_pool_item *item;
|
|
|
-
|
|
|
- item = kmalloc(sizeof(struct ion_page_pool_item), GFP_KERNEL);
|
|
|
- if (!item)
|
|
|
- return -ENOMEM;
|
|
|
-
|
|
|
mutex_lock(&pool->mutex);
|
|
|
- item->page = page;
|
|
|
if (PageHighMem(page)) {
|
|
|
- list_add_tail(&item->list, &pool->high_items);
|
|
|
+ list_add_tail(&page->lru, &pool->high_items);
|
|
|
pool->high_count++;
|
|
|
} else {
|
|
|
- list_add_tail(&item->list, &pool->low_items);
|
|
|
+ list_add_tail(&page->lru, &pool->low_items);
|
|
|
pool->low_count++;
|
|
|
}
|
|
|
mutex_unlock(&pool->mutex);
|
|
@@ -68,24 +56,19 @@ static int ion_page_pool_add(struct ion_page_pool *pool, struct page *page)
|
|
|
|
|
|
static struct page *ion_page_pool_remove(struct ion_page_pool *pool, bool high)
|
|
|
{
|
|
|
- struct ion_page_pool_item *item;
|
|
|
struct page *page;
|
|
|
|
|
|
if (high) {
|
|
|
BUG_ON(!pool->high_count);
|
|
|
- item = list_first_entry(&pool->high_items,
|
|
|
- struct ion_page_pool_item, list);
|
|
|
+ page = list_first_entry(&pool->high_items, struct page, lru);
|
|
|
pool->high_count--;
|
|
|
} else {
|
|
|
BUG_ON(!pool->low_count);
|
|
|
- item = list_first_entry(&pool->low_items,
|
|
|
- struct ion_page_pool_item, list);
|
|
|
+ page = list_first_entry(&pool->low_items, struct page, lru);
|
|
|
pool->low_count--;
|
|
|
}
|
|
|
|
|
|
- list_del(&item->list);
|
|
|
- page = item->page;
|
|
|
- kfree(item);
|
|
|
+ list_del(&page->lru);
|
|
|
return page;
|
|
|
}
|
|
|
|