X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=mm%2Fzswap.c;h=4719af5f27fec5ec4447d342cf3ee77de79128fa;hb=47431c295f19913937fdd9b8cfd521e29bf6ca9c;hp=7944e3e57e781525738ad1e4ab8ffdf49086eef4;hpb=c87866ede44ad7da6b296d732221dc34ce1b154d;p=platform%2Fkernel%2Flinux-rpi.git diff --git a/mm/zswap.c b/mm/zswap.c index 7944e3e..4719af5 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -648,8 +648,9 @@ error: return NULL; } -static __init struct zswap_pool *__zswap_pool_create_fallback(void) +static bool zswap_try_pool_create(void) { + struct zswap_pool *pool; bool has_comp, has_zpool; has_comp = crypto_has_acomp(zswap_compressor, 0, 0); @@ -685,9 +686,21 @@ static __init struct zswap_pool *__zswap_pool_create_fallback(void) } if (!has_comp || !has_zpool) - return NULL; + return false; + + pool = zswap_pool_create(zswap_zpool_type, zswap_compressor); - return zswap_pool_create(zswap_zpool_type, zswap_compressor); + if (pool) { + pr_info("loaded using pool %s/%s\n", pool->tfm_name, + zpool_get_type(pool->zpool)); + list_add(&pool->list, &zswap_pools); + zswap_has_pool = true; + } else { + pr_err("pool creation failed\n"); + zswap_enabled = false; + } + + return zswap_enabled; } static void zswap_pool_destroy(struct zswap_pool *pool) @@ -860,16 +873,19 @@ static int zswap_zpool_param_set(const char *val, static int zswap_enabled_param_set(const char *val, const struct kernel_param *kp) { + int ret; + if (zswap_init_failed) { pr_err("can't enable, initialization failed\n"); return -ENODEV; } - if (!zswap_has_pool && zswap_init_started) { - pr_err("can't enable, no pool configured\n"); - return -ENODEV; - } - return param_set_bool(val, kp); + ret = param_set_bool(val, kp); + if (!ret && zswap_enabled && zswap_init_started && !zswap_has_pool) + if (!zswap_try_pool_create()) + ret = -ENODEV; + + return ret; } /********************************* @@ -1436,7 +1452,6 @@ static int __init zswap_debugfs_init(void) **********************************/ static int __init init_zswap(void) { - struct zswap_pool *pool; int ret; zswap_init_started = true; @@ -1460,29 +1475,19 @@ static int __init init_zswap(void) if (ret) goto hp_fail; - pool = __zswap_pool_create_fallback(); - if (pool) { - pr_info("loaded using pool %s/%s\n", pool->tfm_name, - zpool_get_type(pool->zpool)); - list_add(&pool->list, &zswap_pools); - zswap_has_pool = true; - } else { - pr_err("pool creation failed\n"); - zswap_enabled = false; - } - shrink_wq = create_workqueue("zswap-shrink"); if (!shrink_wq) - goto fallback_fail; + goto hp_fail; frontswap_register_ops(&zswap_frontswap_ops); if (zswap_debugfs_init()) pr_warn("debugfs initialization failed\n"); + + if (zswap_enabled) + zswap_try_pool_create(); + return 0; -fallback_fail: - if (pool) - zswap_pool_destroy(pool); hp_fail: cpuhp_remove_state(CPUHP_MM_ZSWP_MEM_PREPARE); dstmem_fail: