Calculate the first- and second-level indices for new page when the pool is initialized rather than calculating them on each insertion. Signed-off-by: Robert Jennings <rcj@xxxxxxxxxxxxxxxxxx> --- drivers/staging/zram/xvmalloc.c | 13 +++++++++++-- drivers/staging/zram/xvmalloc_int.h | 4 ++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/staging/zram/xvmalloc.c b/drivers/staging/zram/xvmalloc.c index 3fdbb8a..a507f95 100644 --- a/drivers/staging/zram/xvmalloc.c +++ b/drivers/staging/zram/xvmalloc.c @@ -184,8 +184,13 @@ static void insert_block(struct xv_pool *pool, struct page *page, u32 offset, u32 flindex, slindex; struct block_header *nextblock; - slindex = get_index_for_insert(block->size); - flindex = slindex / BITS_PER_LONG; + if (block->size >= (PAGE_SIZE - XV_ALIGN)) { + slindex = pagesize_slindex; + flindex = pagesize_flindex; + } else { + slindex = get_index_for_insert(block->size); + flindex = slindex / BITS_PER_LONG; + } block->link.prev_page = 0; block->link.prev_offset = 0; @@ -316,6 +321,10 @@ struct xv_pool *xv_create_pool(void) if (!pool) return NULL; + /* cache the first/second-level indices for PAGE_SIZE allocations */ + pagesize_slindex = get_index_for_insert(PAGE_SIZE); + pagesize_flindex = pagesize_slindex / BITS_PER_LONG; + spin_lock_init(&pool->lock); return pool; diff --git a/drivers/staging/zram/xvmalloc_int.h b/drivers/staging/zram/xvmalloc_int.h index 051a49b..68db384 100644 --- a/drivers/staging/zram/xvmalloc_int.h +++ b/drivers/staging/zram/xvmalloc_int.h @@ -52,6 +52,10 @@ /* End of user params */ +/* Cache of the first/second-level indices for PAGE_SIZE allocations */ +static u32 pagesize_slindex; +static u32 pagesize_flindex; + enum blockflags { BLOCK_FREE, PREV_FREE, -- 1.6.0.2 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel