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)
committerDanny Wood <danwood76@gmail.com>
Fri, 27 Aug 2021 13:38:56 +0000 (14:38 +0100)
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.

Change-Id: Ic197610141c0dc2711c239db01f735a938bf3808
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>
include/linux/zpool.h
mm/zbud.c
mm/zpool.c
mm/zswap.c

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 ecf1dbef69833f56fbde1c0e2cb167e8e7b1eff7..2010b6ecf5cee9fcaed7b87bcb8e799a4d3ef7f2 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, &zbud_zpool_ops);
 }
index 179898aba1bf25bc87df11eeb693cf298e623c4e..f3ad6802b6370cd915015a41923fc1e99040c3ed 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 eca838b58ac38586f9f8fb8f91b09b370fa6c17b..1bdd2f1373ced3542e5bd6e6f9de9103d2c6ace2 100644 (file)
@@ -968,11 +968,11 @@ 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) {