Allow zsmalloc pool owner to specify max zspage (during pool creation), so that different pools can have different characteristics. Signed-off-by: Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> --- drivers/block/zram/zram_drv.c | 3 ++- include/linux/zsmalloc.h | 2 +- mm/zsmalloc.c | 11 ++++++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 364323713393..e3ef542f9618 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1253,7 +1253,8 @@ static bool zram_meta_alloc(struct zram *zram, u64 disksize) if (!zram->table) return false; - zram->mem_pool = zs_create_pool(zram->disk->disk_name); + zram->mem_pool = zs_create_pool(zram->disk->disk_name, + ZS_DEFAULT_PAGE_ORDER); if (!zram->mem_pool) { vfree(zram->table); return false; diff --git a/include/linux/zsmalloc.h b/include/linux/zsmalloc.h index 2110b140e0fa..4a92c5e186ad 100644 --- a/include/linux/zsmalloc.h +++ b/include/linux/zsmalloc.h @@ -53,7 +53,7 @@ struct zs_pool_stats { struct zs_pool; -struct zs_pool *zs_create_pool(const char *name); +struct zs_pool *zs_create_pool(const char *name, u32 zspage_order); void zs_destroy_pool(struct zs_pool *pool); unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t flags); diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index 6ffa32b8b6c8..fa55e0c66f8d 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -369,7 +369,7 @@ static void *zs_zpool_create(const char *name, gfp_t gfp, * different contexts and its caller must provide a valid * gfp mask. */ - return zs_create_pool(name); + return zs_create_pool(name, ZS_DEFAULT_PAGE_ORDER); } static void zs_zpool_destroy(void *pool) @@ -2177,6 +2177,7 @@ static int zs_register_shrinker(struct zs_pool *pool) /** * zs_create_pool - Creates an allocation pool to work from. * @name: pool name to be created + * @zspage_order: maximum order of zspage * * This function must be called before anything when using * the zsmalloc allocator. @@ -2184,17 +2185,21 @@ static int zs_register_shrinker(struct zs_pool *pool) * On success, a pointer to the newly created pool is returned, * otherwise NULL. */ -struct zs_pool *zs_create_pool(const char *name) +struct zs_pool *zs_create_pool(const char *name, u32 zspage_order) { int i; struct zs_pool *pool; struct size_class *prev_class = NULL; + if (WARN_ON(zspage_order < ZS_MIN_PAGE_ORDER || + zspage_order > ZS_MAX_PAGE_ORDER)) + return NULL; + pool = kzalloc(sizeof(*pool), GFP_KERNEL); if (!pool) return NULL; - pool->max_pages_per_zspage = 1U << ZS_MIN_PAGE_ORDER; + pool->max_pages_per_zspage = 1U << zspage_order; /* min_alloc_size must be multiple of ZS_ALIGN */ pool->min_alloc_size = (pool->max_pages_per_zspage << PAGE_SHIFT) >> OBJ_INDEX_BITS; -- 2.38.0.135.g90850a2211-goog