msm: kgsl: Do not memset pages to zero while adding to pool
Doing a memset to zero while adding a page to pool is not efficient as the page added to the pool can be returned to system in case shrinker kicks in. In this scenario, time spent in zeroing the page is a waste. Instead of zeroing the page while adding it to pool zero the page when it is taken from the pool. This helps in reducing the time taken to free big chunk of memory. Also, allocation time shouldn't be a problem as zeroing of page anyways happens during allocation in case it is allocated from system. Change-Id: I41ab2cb88fb4fd9854d2cc9a45bb60fc7013286a Signed-off-by: Deepak Kumar <dkumar@codeaurora.org>
This commit is contained in:
parent
c1a5075d60
commit
40b830cd5e
1 changed files with 6 additions and 16 deletions
|
@ -65,26 +65,19 @@ _kgsl_get_pool_from_order(unsigned int order)
|
||||||
|
|
||||||
/* Map the page into kernel and zero it out */
|
/* Map the page into kernel and zero it out */
|
||||||
static void
|
static void
|
||||||
_kgsl_pool_zero_page(struct page *p, unsigned int pool_order)
|
_kgsl_pool_zero_page(struct page *p)
|
||||||
{
|
{
|
||||||
int i;
|
void *addr = kmap_atomic(p);
|
||||||
|
|
||||||
for (i = 0; i < (1 << pool_order); i++) {
|
memset(addr, 0, PAGE_SIZE);
|
||||||
struct page *page = nth_page(p, i);
|
dmac_flush_range(addr, addr + PAGE_SIZE);
|
||||||
void *addr = kmap_atomic(page);
|
kunmap_atomic(addr);
|
||||||
|
|
||||||
memset(addr, 0, PAGE_SIZE);
|
|
||||||
dmac_flush_range(addr, addr + PAGE_SIZE);
|
|
||||||
kunmap_atomic(addr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add a page to specified pool */
|
/* Add a page to specified pool */
|
||||||
static void
|
static void
|
||||||
_kgsl_pool_add_page(struct kgsl_page_pool *pool, struct page *p)
|
_kgsl_pool_add_page(struct kgsl_page_pool *pool, struct page *p)
|
||||||
{
|
{
|
||||||
_kgsl_pool_zero_page(p, pool->pool_order);
|
|
||||||
|
|
||||||
spin_lock(&pool->list_lock);
|
spin_lock(&pool->list_lock);
|
||||||
list_add_tail(&p->lru, &pool->page_list);
|
list_add_tail(&p->lru, &pool->page_list);
|
||||||
pool->page_count++;
|
pool->page_count++;
|
||||||
|
@ -318,7 +311,6 @@ int kgsl_pool_alloc_page(int *page_size, struct page **pages,
|
||||||
} else
|
} else
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
_kgsl_pool_zero_page(page, order);
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,7 +330,6 @@ int kgsl_pool_alloc_page(int *page_size, struct page **pages,
|
||||||
page = alloc_pages(gfp_mask, order);
|
page = alloc_pages(gfp_mask, order);
|
||||||
if (page == NULL)
|
if (page == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
_kgsl_pool_zero_page(page, order);
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -368,13 +359,12 @@ int kgsl_pool_alloc_page(int *page_size, struct page **pages,
|
||||||
} else
|
} else
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
_kgsl_pool_zero_page(page, order);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
for (j = 0; j < (*page_size >> PAGE_SHIFT); j++) {
|
for (j = 0; j < (*page_size >> PAGE_SHIFT); j++) {
|
||||||
p = nth_page(page, j);
|
p = nth_page(page, j);
|
||||||
|
_kgsl_pool_zero_page(p);
|
||||||
pages[pcount] = p;
|
pages[pcount] = p;
|
||||||
pcount++;
|
pcount++;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue