mm/zpool: add name argument to create zpool
authorGanesh Mahendran <opensource.ganesh@gmail.com>
Thu, 12 Feb 2015 23:00:51 +0000 (15:00 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 13 Feb 2015 02:54:12 +0000 (18:54 -0800)
Currently the underlay of zpool: zsmalloc/zbud, do not know who creates
them.  There is not a method to let zsmalloc/zbud find which caller they
belong to.

Now we want to add statistics collection in zsmalloc.  We need to name the
debugfs dir for each pool created.  The way suggested by Minchan Kim is to
use a name passed by caller(such as zram) to create the zsmalloc pool.

    /sys/kernel/debug/zsmalloc/zram0

This patch adds an argument `name' to zs_create_pool() and other related
functions.

Signed-off-by: Ganesh Mahendran <opensource.ganesh@gmail.com>
Acked-by: Minchan Kim <minchan@kernel.org>
Cc: Seth Jennings <sjennings@variantweb.net>
Cc: Nitin Gupta <ngupta@vflare.org>
Cc: Dan Streetman <ddstreet@ieee.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/block/zram/zram_drv.c
include/linux/zpool.h
include/linux/zsmalloc.h
mm/zbud.c
mm/zpool.c
mm/zsmalloc.c
mm/zswap.c

index eca4b67274c183815b3189b6bcba62ad96a8e3c7..8e233edd7a097a0f91d323071c97f16e43308e5d 100644 (file)
@@ -327,9 +327,10 @@ static void zram_meta_free(struct zram_meta *meta, u64 disksize)
        kfree(meta);
 }
 
-static struct zram_meta *zram_meta_alloc(u64 disksize)
+static struct zram_meta *zram_meta_alloc(int device_id, u64 disksize)
 {
        size_t num_pages;
+       char pool_name[8];
        struct zram_meta *meta = kmalloc(sizeof(*meta), GFP_KERNEL);
 
        if (!meta)
@@ -342,7 +343,8 @@ static struct zram_meta *zram_meta_alloc(u64 disksize)
                goto out_error;
        }
 
-       meta->mem_pool = zs_create_pool(GFP_NOIO | __GFP_HIGHMEM);
+       snprintf(pool_name, sizeof(pool_name), "zram%d", device_id);
+       meta->mem_pool = zs_create_pool(pool_name, GFP_NOIO | __GFP_HIGHMEM);
        if (!meta->mem_pool) {
                pr_err("Error creating memory pool\n");
                goto out_error;
@@ -783,7 +785,7 @@ static ssize_t disksize_store(struct device *dev,
                return -EINVAL;
 
        disksize = PAGE_ALIGN(disksize);
-       meta = zram_meta_alloc(disksize);
+       meta = zram_meta_alloc(zram->disk->first_minor, disksize);
        if (!meta)
                return -ENOMEM;
 
index f14bd75f08b3952bbeb8192d30c0224e84ea3724..56529b34dc63533182d27ec87c67f8215fd05e96 100644 (file)
@@ -36,7 +36,8 @@ enum zpool_mapmode {
        ZPOOL_MM_DEFAULT = ZPOOL_MM_RW
 };
 
-struct zpool *zpool_create_pool(char *type, gfp_t gfp, struct zpool_ops *ops);
+struct zpool *zpool_create_pool(char *type, char *name,
+                       gfp_t gfp, struct zpool_ops *ops);
 
 char *zpool_get_type(struct zpool *pool);
 
@@ -80,7 +81,7 @@ struct zpool_driver {
        atomic_t refcount;
        struct list_head list;
 
-       void *(*create)(gfp_t gfp, struct zpool_ops *ops);
+       void *(*create)(char *name, gfp_t gfp, struct zpool_ops *ops);
        void (*destroy)(void *pool);
 
        int (*malloc)(void *pool, size_t size, gfp_t gfp,
index 05c21476097796d30639dbf7a3521b4e81604d4b..3283c6a55425d6ecf8afa2745545338d94875d34 100644 (file)
@@ -36,7 +36,7 @@ enum zs_mapmode {
 
 struct zs_pool;
 
-struct zs_pool *zs_create_pool(gfp_t flags);
+struct zs_pool *zs_create_pool(char *name, gfp_t flags);
 void zs_destroy_pool(struct zs_pool *pool);
 
 unsigned long zs_malloc(struct zs_pool *pool, size_t size);
index 4e387bea702eca644da2547c3bd8f9537291c189..2ee4e45204936e20f50deaad8b37f857d7bea630 100644 (file)
--- a/mm/zbud.c
+++ b/mm/zbud.c
@@ -130,7 +130,8 @@ static struct zbud_ops zbud_zpool_ops = {
        .evict =        zbud_zpool_evict
 };
 
-static void *zbud_zpool_create(gfp_t gfp, struct zpool_ops *zpool_ops)
+static void *zbud_zpool_create(char *name, gfp_t gfp,
+                       struct zpool_ops *zpool_ops)
 {
        return zbud_create_pool(gfp, zpool_ops ? &zbud_zpool_ops : NULL);
 }
index 739cdf0d183ac0e51571d16f5b6321ccc837e7d1..bacdab6e47de33694cac67443c6e3fbdd2c85c9f 100644 (file)
@@ -129,6 +129,7 @@ static void zpool_put_driver(struct zpool_driver *driver)
 /**
  * zpool_create_pool() - Create a new zpool
  * @type       The type of the zpool to create (e.g. zbud, zsmalloc)
+ * @name       The name of the zpool (e.g. zram0, zswap)
  * @gfp                The GFP flags to use when allocating the pool.
  * @ops                The optional ops callback.
  *
@@ -140,7 +141,8 @@ static void zpool_put_driver(struct zpool_driver *driver)
  *
  * Returns: New zpool on success, NULL on failure.
  */
-struct zpool *zpool_create_pool(char *type, gfp_t gfp, struct zpool_ops *ops)
+struct zpool *zpool_create_pool(char *type, char *name, gfp_t gfp,
+               struct zpool_ops *ops)
 {
        struct zpool_driver *driver;
        struct zpool *zpool;
@@ -168,7 +170,7 @@ struct zpool *zpool_create_pool(char *type, gfp_t gfp, struct zpool_ops *ops)
 
        zpool->type = driver->type;
        zpool->driver = driver;
-       zpool->pool = driver->create(gfp, ops);
+       zpool->pool = driver->create(name, gfp, ops);
        zpool->ops = ops;
 
        if (!zpool->pool) {
index b72403927aa4b06610cb08e9506d677c98a1a5cd..2359e61b02bf46e94785eef14aa641a015f38192 100644 (file)
@@ -246,9 +246,9 @@ struct mapping_area {
 
 #ifdef CONFIG_ZPOOL
 
-static void *zs_zpool_create(gfp_t gfp, struct zpool_ops *zpool_ops)
+static void *zs_zpool_create(char *name, gfp_t gfp, struct zpool_ops *zpool_ops)
 {
-       return zs_create_pool(gfp);
+       return zs_create_pool(name, gfp);
 }
 
 static void zs_zpool_destroy(void *pool)
@@ -1148,7 +1148,7 @@ EXPORT_SYMBOL_GPL(zs_free);
  * On success, a pointer to the newly created pool is returned,
  * otherwise NULL.
  */
-struct zs_pool *zs_create_pool(gfp_t flags)
+struct zs_pool *zs_create_pool(char *name, gfp_t flags)
 {
        int i;
        struct zs_pool *pool;
index 0cfce9bc51e4946c561e48b8cb5f9e6cf7669d5f..4249e82ff934d9fec506fcc7db56d57d48efaf9c 100644 (file)
@@ -906,11 +906,12 @@ static int __init init_zswap(void)
 
        pr_info("loading zswap\n");
 
-       zswap_pool = zpool_create_pool(zswap_zpool_type, gfp, &zswap_zpool_ops);
+       zswap_pool = zpool_create_pool(zswap_zpool_type, "zswap", gfp,
+                                       &zswap_zpool_ops);
        if (!zswap_pool && strcmp(zswap_zpool_type, ZSWAP_ZPOOL_DEFAULT)) {
                pr_info("%s zpool not available\n", zswap_zpool_type);
                zswap_zpool_type = ZSWAP_ZPOOL_DEFAULT;
-               zswap_pool = zpool_create_pool(zswap_zpool_type, gfp,
+               zswap_pool = zpool_create_pool(zswap_zpool_type, "zswap", gfp,
                                        &zswap_zpool_ops);
        }
        if (!zswap_pool) {