diff options
author | Álvaro Fernández Rojas <noltari@gmail.com> | 2022-05-16 23:40:32 +0200 |
---|---|---|
committer | Álvaro Fernández Rojas <noltari@gmail.com> | 2022-05-17 15:11:22 +0200 |
commit | 20ea6adbf199097c4f5f591ffee088340630dae4 (patch) | |
tree | d6719d95e136611a1c25bbf7789652d6d402779d /target/linux/bcm27xx/patches-5.15/950-0235-zswap-Defer-zswap-initialisation.patch | |
parent | bca05bd072180dc38ef740b37ded9572a6db1981 (diff) | |
download | upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.gz upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.bz2 upstream-20ea6adbf199097c4f5f591ffee088340630dae4.zip |
bcm27xx: add support for linux v5.15
Build system: x86_64
Build-tested: bcm2708, bcm2709, bcm2710, bcm2711
Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B
Signed-off-by: Marty Jones <mj8263788@gmail.com>
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0235-zswap-Defer-zswap-initialisation.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.15/950-0235-zswap-Defer-zswap-initialisation.patch | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0235-zswap-Defer-zswap-initialisation.patch b/target/linux/bcm27xx/patches-5.15/950-0235-zswap-Defer-zswap-initialisation.patch new file mode 100644 index 0000000000..d9619f1c1d --- /dev/null +++ b/target/linux/bcm27xx/patches-5.15/950-0235-zswap-Defer-zswap-initialisation.patch @@ -0,0 +1,125 @@ +From 42487c7c83a14fd00b69038932baf6373d422b59 Mon Sep 17 00:00:00 2001 +From: Phil Elwell <phil@raspberrypi.com> +Date: Tue, 5 May 2020 15:23:32 +0100 +Subject: [PATCH] zswap: Defer zswap initialisation + +Enabling zswap support in the kernel configuration costs about 1.5MB +of RAM, even when zswap is not enabled at runtime. This cost can be +reduced significantly by deferring initialisation (including pool +creation) until the "enabled" parameter is set to true. There is a +small cost to this in that some initialisation code has to remain in +memory after the init phase, just in case they are needed later, +but the total size increase is negligible. + +See: https://github.com/raspberrypi/linux/pull/3432 + +Signed-off-by: Phil Elwell <phil@raspberrypi.com> +--- + mm/zswap.c | 53 +++++++++++++++++++++++++++++------------------------ + 1 file changed, 29 insertions(+), 24 deletions(-) + +--- 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 + } + + 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 c + 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(voi + **********************************/ + 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: |