On Mon, Apr 03, 2023 at 08:13:18PM +0800, Liu Shixin wrote: > Since some users may not use zswap, the zswap_pool is wasted. Save memory > by delaying the initialization of zswap until enabled. > > Signed-off-by: Liu Shixin <liushixin2@xxxxxxxxxx> > --- > mm/zswap.c | 56 +++++++++++++++++++++++++++++++++++++++++------------- > 1 file changed, 43 insertions(+), 13 deletions(-) > > diff --git a/mm/zswap.c b/mm/zswap.c > index 9169c2baee87..14db57450bfd 100644 > --- a/mm/zswap.c > +++ b/mm/zswap.c > @@ -81,6 +81,8 @@ static bool zswap_pool_reached_full; > > #define ZSWAP_PARAM_UNSET "" > > +static int zswap_setup(void); > + > /* Enable/disable zswap */ > static bool zswap_enabled = IS_ENABLED(CONFIG_ZSWAP_DEFAULT_ON); > static int zswap_enabled_param_set(const char *, > @@ -222,6 +224,9 @@ enum zswap_init_type { > > static enum zswap_init_type zswap_init_state; > > +/* used to ensure the integrity of initialization */ > +static DEFINE_MUTEX(zswap_init_lock); > + > /* init completed, but couldn't create the initial pool */ > static bool zswap_has_pool; > > @@ -654,7 +659,7 @@ static struct zswap_pool *zswap_pool_create(char *type, char *compressor) > return NULL; > } > > -static __init struct zswap_pool *__zswap_pool_create_fallback(void) > +static struct zswap_pool *__zswap_pool_create_fallback(void) > { > bool has_comp, has_zpool; > > @@ -763,21 +768,28 @@ static int __zswap_param_set(const char *val, const struct kernel_param *kp, > char *s = strstrip((char *)val); > int ret; > > + mutex_lock(&zswap_init_lock); > switch (zswap_init_state) { > case ZSWAP_UNINIT: > /* if this is load-time (pre-init) param setting, > * don't create a pool; that's done during init. > */ > - return param_set_charp(s, kp); > + ret = param_set_charp(s, kp); > + mutex_unlock(&zswap_init_lock); > + return ret; > case ZSWAP_INIT_SUCCEED: > /* no change required */ > - if (!strcmp(s, *(char **)kp->arg) && zswap_has_pool) > + if (!strcmp(s, *(char **)kp->arg) && zswap_has_pool) { > + mutex_unlock(&zswap_init_lock); > return 0; > + } > break; > case ZSWAP_INIT_FAILED: > pr_err("can't set param, initialization failed\n"); > + mutex_unlock(&zswap_init_lock); > return -ENODEV; > } > + mutex_unlock(&zswap_init_lock); The pattern here looks a bit odd. Can you split the code that the ZSWAP_INIT_SUCCEED case falls through into a helper, then just assign ret inside the switch statement, break out and do a single unlock and return? > + /*if this is load-time (pre-init) param setting, only set param.*/ missing space after the initial and before the last * here. But except for these nitpicks this version looks good to me now.