lkml.org 
[lkml]   [2016]   [May]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.5 40/88] mm/zswap: provide unique zpool name
    Date
    4.5-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Dan Streetman <ddstreet@ieee.org>

    commit 32a4e169039927bfb6ee9f0ccbbe3a8aaf13a4bc upstream.

    Instead of using "zswap" as the name for all zpools created, add an
    atomic counter and use "zswap%x" with the counter number for each zpool
    created, to provide a unique name for each new zpool.

    As zsmalloc, one of the zpool implementations, requires/expects a unique
    name for each pool created, zswap should provide a unique name. The
    zsmalloc pool creation does not fail if a new pool with a conflicting
    name is created, unless CONFIG_ZSMALLOC_STAT is enabled; in that case,
    zsmalloc pool creation fails with -ENOMEM. Then zswap will be unable to
    change its compressor parameter if its zpool is zsmalloc; it also will
    be unable to change its zpool parameter back to zsmalloc, if it has any
    existing old zpool using zsmalloc with page(s) in it. Attempts to
    change the parameters will result in failure to create the zpool. This
    changes zswap to provide a unique name for each zpool creation.

    Fixes: f1c54846ee45 ("zswap: dynamic pool creation")
    Signed-off-by: Dan Streetman <ddstreet@ieee.org>
    Reported-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Dan Streetman <dan.streetman@canonical.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    mm/zswap.c | 8 +++++++-
    1 file changed, 7 insertions(+), 1 deletion(-)

    --- a/mm/zswap.c
    +++ b/mm/zswap.c
    @@ -170,6 +170,8 @@ static struct zswap_tree *zswap_trees[MA
    static LIST_HEAD(zswap_pools);
    /* protects zswap_pools list modification */
    static DEFINE_SPINLOCK(zswap_pools_lock);
    +/* pool counter to provide unique names to zpool */
    +static atomic_t zswap_pools_count = ATOMIC_INIT(0);

    /* used by param callback function */
    static bool zswap_init_started;
    @@ -565,6 +567,7 @@ static struct zswap_pool *zswap_pool_fin
    static struct zswap_pool *zswap_pool_create(char *type, char *compressor)
    {
    struct zswap_pool *pool;
    + char name[38]; /* 'zswap' + 32 char (max) num + \0 */
    gfp_t gfp = __GFP_NORETRY | __GFP_NOWARN | __GFP_KSWAPD_RECLAIM;

    pool = kzalloc(sizeof(*pool), GFP_KERNEL);
    @@ -573,7 +576,10 @@ static struct zswap_pool *zswap_pool_cre
    return NULL;
    }

    - pool->zpool = zpool_create_pool(type, "zswap", gfp, &zswap_zpool_ops);
    + /* unique name for each pool specifically required by zsmalloc */
    + snprintf(name, 38, "zswap%x", atomic_inc_return(&zswap_pools_count));
    +
    + pool->zpool = zpool_create_pool(type, name, gfp, &zswap_zpool_ops);
    if (!pool->zpool) {
    pr_err("%s zpool not available\n", type);
    goto error;

    \
     
     \ /
      Last update: 2016-05-09 10:01    [W:2.650 / U:1.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site