All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: Liu Shixin <liushixin2@huawei.com>
Cc: Seth Jennings <sjenning@redhat.com>,
	Dan Streetman <ddstreet@ieee.org>,
	Vitaly Wool <vitaly.wool@konsulko.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Nathan Chancellor <nathan@kernel.org>,
	Christoph Hellwig <hch@lst.de>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: Re: [PATCH -next v6 2/2] mm/zswap: delay the initializaton of zswap
Date: Thu, 23 Mar 2023 09:04:43 +0100	[thread overview]
Message-ID: <20230323080443.GC20444@lst.de> (raw)
In-Reply-To: <20230322102006.780624-3-liushixin2@huawei.com>

On Wed, Mar 22, 2023 at 06:20:06PM +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@huawei.com>
> ---
>  mm/zswap.c | 51 +++++++++++++++++++++++++++++++++++++++++----------
>  1 file changed, 41 insertions(+), 10 deletions(-)
> 
> diff --git a/mm/zswap.c b/mm/zswap.c
> index 09fa956920fa..3aed3b26524a 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 *,
> @@ -220,6 +222,9 @@ static bool zswap_init_started;
>  /* fatal error during init */
>  static bool zswap_init_failed;
>  
> +/* 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;
>  
> @@ -272,13 +277,13 @@ static void zswap_update_total_size(void)
>  **********************************/
>  static struct kmem_cache *zswap_entry_cache;
>  
> -static int __init zswap_entry_cache_create(void)
> +static int zswap_entry_cache_create(void)
>  {
>  	zswap_entry_cache = KMEM_CACHE(zswap_entry, 0);
>  	return zswap_entry_cache == NULL;
>  }

Please add a cleanup patch to remove this helper first, it just
massivel confuses the reader.

> -static void __init zswap_entry_cache_destroy(void)
> +static void zswap_entry_cache_destroy(void)
>  {
>  	kmem_cache_destroy(zswap_entry_cache);
>  }

Same here.

> @@ -663,7 +668,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;
>  
> @@ -784,8 +789,15 @@ static int __zswap_param_set(const char *val, const struct kernel_param *kp,
>  	/* if this is load-time (pre-init) param setting,
>  	 * don't create a pool; that's done during init.
>  	 */
> -	if (!zswap_init_started)
> -		return param_set_charp(s, kp);
> +	if (!zswap_init_started) {
> +		mutex_lock(&zswap_init_lock);
> +		if (!zswap_init_started) {
> +			ret = param_set_charp(s, kp);
> +			mutex_unlock(&zswap_init_lock);
> +			return ret;
> +		}
> +		mutex_unlock(&zswap_init_lock);
> +	}

Just take the lock around the whole function.  No need to micro-optimize
setting a kernel paramter.

> @@ -884,6 +896,15 @@ static int zswap_enabled_param_set(const char *val,
>  	if (res == *(bool *)kp->arg)
>  		return 0;
>  
> +	if (!zswap_init_started && (system_state == SYSTEM_RUNNING)) {

No need for the inner braces.  But directly looking at
SYSTEM_RUNNING, especially without a comment is a bit of a mess.
Is there any better way to deal with this?

Also the zswap_init_started variable name has always been a bit
confusing.  If everything around it takes zswap_init_lock now,
it can be replaced with a check for successful zswap initialization
as all the initializtion is covered by the lock.  That would really
help to clean up the code.

> +static int zswap_debugfs_init(void)
>  {
>  	if (!debugfs_initialized())
>  		return -ENODEV;
> @@ -1482,7 +1503,7 @@ static int __init zswap_debugfs_init(void)
>  	return 0;
>  }
>  #else
> -static int __init zswap_debugfs_init(void)
> +static int zswap_debugfs_init(void)

Is there any reason to not just always initialize debugfs and
only defer the expensive allocations?


  parent reply	other threads:[~2023-03-23  8:04 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-22 10:20 [PATCH -next v6 0/2] Delay the initialization of zswap Liu Shixin
2023-03-22 10:20 ` [PATCH -next v6 1/2] mm/zswap: skip invalid or unchanged parameter Liu Shixin
2023-03-22 10:20 ` [PATCH -next v6 2/2] mm/zswap: delay the initializaton of zswap Liu Shixin
2023-03-22 17:17   ` Vitaly Wool
2023-03-23  7:59     ` Christoph Hellwig
2023-03-27  6:19       ` Vitaly Wool
2023-03-23  8:04   ` Christoph Hellwig [this message]
2023-03-24  9:03     ` Liu Shixin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230323080443.GC20444@lst.de \
    --to=hch@lst.de \
    --cc=akpm@linux-foundation.org \
    --cc=ddstreet@ieee.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=liushixin2@huawei.com \
    --cc=nathan@kernel.org \
    --cc=sjenning@redhat.com \
    --cc=vitaly.wool@konsulko.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.