Prev: [PATCH 00/10] zram: various improvements and cleanups
Next: rcu,debug_core: allow the kernel debugger to reset the rcu stall timer
From: Nitin Gupta on 9 Aug 2010 13:30 - xvmalloc: Remove unnecessary stat_{inc,dec} and increment pages_stored directly - xvmalloc: Initialize pointers with NULL instead of 0 - zram: Remove verbose message when use sets insane disksize - zram: Mark some messages as pr_debug - zram: Refine some comments Signed-off-by: Nitin Gupta <ngupta(a)vflare.org> --- drivers/staging/zram/xvmalloc.c | 22 ++++------------- drivers/staging/zram/zram_drv.c | 49 +++++++++++++------------------------- drivers/staging/zram/zram_drv.h | 26 ++++---------------- 3 files changed, 28 insertions(+), 69 deletions(-) diff --git a/drivers/staging/zram/xvmalloc.c b/drivers/staging/zram/xvmalloc.c index 3fdbb8a..6268f65 100644 --- a/drivers/staging/zram/xvmalloc.c +++ b/drivers/staging/zram/xvmalloc.c @@ -20,16 +20,6 @@ #include "xvmalloc.h" #include "xvmalloc_int.h" -static void stat_inc(u64 *value) -{ - *value = *value + 1; -} - -static void stat_dec(u64 *value) -{ - *value = *value - 1; -} - static int test_flag(struct block_header *block, enum blockflags flag) { return block->prev & BIT(flag); @@ -187,7 +177,7 @@ static void insert_block(struct xv_pool *pool, struct page *page, u32 offset, slindex = get_index_for_insert(block->size); flindex = slindex / BITS_PER_LONG; - block->link.prev_page = 0; + block->link.prev_page = NULL; block->link.prev_offset = 0; block->link.next_page = pool->freelist[slindex].page; block->link.next_offset = pool->freelist[slindex].offset; @@ -217,7 +207,7 @@ static void remove_block_head(struct xv_pool *pool, pool->freelist[slindex].page = block->link.next_page; pool->freelist[slindex].offset = block->link.next_offset; - block->link.prev_page = 0; + block->link.prev_page = NULL; block->link.prev_offset = 0; if (!pool->freelist[slindex].page) { @@ -232,7 +222,7 @@ static void remove_block_head(struct xv_pool *pool, */ tmpblock = get_ptr_atomic(pool->freelist[slindex].page, pool->freelist[slindex].offset, KM_USER1); - tmpblock->link.prev_page = 0; + tmpblock->link.prev_page = NULL; tmpblock->link.prev_offset = 0; put_ptr_atomic(tmpblock, KM_USER1); } @@ -284,7 +274,7 @@ static int grow_pool(struct xv_pool *pool, gfp_t flags) if (unlikely(!page)) return -ENOMEM; - stat_inc(&pool->total_pages); + pool->total_pages++; spin_lock(&pool->lock); block = get_ptr_atomic(page, 0, KM_USER0); @@ -361,8 +351,6 @@ int xv_malloc(struct xv_pool *pool, u32 size, struct page **page, if (!*page) { spin_unlock(&pool->lock); - if (flags & GFP_NOWAIT) - return -ENOMEM; error = grow_pool(pool, flags); if (unlikely(error)) return error; @@ -472,7 +460,7 @@ void xv_free(struct xv_pool *pool, struct page *page, u32 offset) spin_unlock(&pool->lock); __free_page(page); - stat_dec(&pool->total_pages); + pool->total_pages--; return; } diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c index 0f9785f..42aa271 100644 --- a/drivers/staging/zram/zram_drv.c +++ b/drivers/staging/zram/zram_drv.c @@ -9,7 +9,7 @@ * Released under the terms of 3-clause BSD License * Released under the terms of GNU General Public License Version 2.0 * - * Project home: http://compcache.googlecode.com + * Project home: http://compcache.googlecode.com/ */ #define KMSG_COMPONENT "zram" @@ -130,33 +130,15 @@ static void zram_insert_obj(struct zram *zram, u32 index, struct page *page, zram->table[index].addr = addr; } -static void zram_set_disksize(struct zram *zram, size_t totalram_bytes) +static u64 zram_default_disksize(void) { - if (!zram->disksize) { - pr_info( - "disk size not provided. You can use disksize_kb module " - "param to specify size.\nUsing default: (%u%% of RAM).\n", - default_disksize_perc_ram - ); - zram->disksize = default_disksize_perc_ram * - (totalram_bytes / 100); - } + u64 disksize; - if (zram->disksize > 2 * (totalram_bytes)) { - pr_info( - "There is little point creating a zram of greater than " - "twice the size of memory since we expect a 2:1 compression " - "ratio. Note that zram uses about 0.1%% of the size of " - "the disk when not in use so a huge zram is " - "wasteful.\n" - "\tMemory Size: %zu kB\n" - "\tSize you selected: %llu kB\n" - "Continuing anyway ...\n", - totalram_bytes >> 10, zram->disksize - ); - } + disksize = default_disksize_perc_ram * + (totalram_pages / 100); + disksize = (disksize << PAGE_SHIFT) & PAGE_MASK; - zram->disksize &= PAGE_MASK; + return disksize; } static void zram_free_page(struct zram *zram, size_t index) @@ -459,7 +441,7 @@ static int zram_make_request(struct request_queue *queue, struct bio *bio) int ret = 0; struct zram *zram = queue->queuedata; - if (!valid_io_request(zram, bio)) { + if (unlikely(!valid_io_request(zram, bio))) { zram_inc_stat(zram, ZRAM_STAT_INVALID_IO); bio_io_error(bio); return 0; @@ -504,7 +486,7 @@ void zram_reset_device(struct zram *zram) /* Reset stats */ memset(&zram->stats, 0, sizeof(zram->stats)); - zram->disksize = 0; + zram->disksize = zram_default_disksize(); mutex_unlock(&zram->init_lock); } @@ -520,7 +502,8 @@ int zram_init_device(struct zram *zram) return 0; } - zram_set_disksize(zram, totalram_pages << PAGE_SHIFT); + if (!zram->disksize) + zram->disksize = zram_default_disksize(); num_pages = zram->disksize >> PAGE_SHIFT; zram->table = vmalloc(num_pages * sizeof(*zram->table)); @@ -566,7 +549,8 @@ fail: return ret; } -void zram_slot_free_notify(struct block_device *bdev, unsigned long index) +static void zram_slot_free_notify(struct block_device *bdev, + unsigned long index) { struct zram *zram; @@ -614,8 +598,9 @@ static int create_device(struct zram *zram, int device_id) zram->disk->private_data = zram; snprintf(zram->disk->disk_name, 16, "zram%d", device_id); - /* Actual capacity set using syfs (/sys/block/zram<id>/disksize */ - set_capacity(zram->disk, 0); + /* Custom size can be set using syfs (/sys/block/zram<id>/disksize) */ + zram->disksize = zram_default_disksize(); + set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); /* * To ensure that we always get PAGE_SIZE aligned @@ -739,7 +724,7 @@ static int __init zram_init(void) } /* Allocate the device array and initialize each one */ - pr_info("Creating %u devices ...\n", num_devices); + pr_debug("Creating %u devices ...\n", num_devices); devices = kzalloc(num_devices * sizeof(struct zram), GFP_KERNEL); if (!devices) { ret = -ENOMEM; diff --git a/drivers/staging/zram/zram_drv.h b/drivers/staging/zram/zram_drv.h index bcc51ea..2cf36db 100644 --- a/drivers/staging/zram/zram_drv.h +++ b/drivers/staging/zram/zram_drv.h @@ -9,7 +9,7 @@ * Released under the terms of 3-clause BSD License * Released under the terms of GNU General Public License Version 2.0 * - * Project home: http://compcache.googlecode.com + * Project home: http://compcache.googlecode.com/ */ #ifndef _ZRAM_DRV_H_ @@ -26,18 +26,6 @@ */ static const unsigned max_num_devices = 32; -/* - * Stored at beginning of each compressed object. - * - * It stores back-reference to table entry which points to this - * object. This is required to support memory defragmentation. - */ -struct zobj_header { -#if 0 - u32 table_idx; -#endif -}; - /*-- Configurable parameters */ /* Default zram disk size: 25% of total RAM */ @@ -50,8 +38,7 @@ static const unsigned default_disksize_perc_ram = 25; static const unsigned max_zpage_size = PAGE_SIZE / 8 * 7; /* - * NOTE: max_zpage_size must be less than or equal to: - * XV_MAX_ALLOC_SIZE - sizeof(struct zobj_header) + * NOTE: max_zpage_size must be less than or equal to XV_MAX_ALLOC_SIZE * otherwise, xv_malloc() would always return failure. */ @@ -92,16 +79,15 @@ struct zram { struct table *table; struct request_queue *queue; struct gendisk *disk; - int init_done; + unsigned int init_done; /* Prevent concurrent execution of device init and reset */ struct mutex init_lock; /* * This is the limit on amount of *uncompressed* worth of data - * we can store in a disk. + * we can store in a disk (in bytes). */ - u64 disksize; /* bytes */ - - struct zram_stats_cpu *stats; + u64 disksize; + struct zram_stats_cpu *stats; /* percpu stats */ }; extern struct zram *devices; -- 1.7.2.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |