All of lore.kernel.org
 help / color / mirror / Atom feed
From: Liu Shixin <liushixin2@huawei.com>
To: Christoph Hellwig <hch@lst.de>
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>,
	<linux-kernel@vger.kernel.org>, <linux-mm@kvack.org>
Subject: Re: [PATCH -next v6 2/2] mm/zswap: delay the initializaton of zswap
Date: Fri, 24 Mar 2023 17:03:24 +0800	[thread overview]
Message-ID: <d1cc88a1-4df2-977d-c1d1-018c2fbded62@huawei.com> (raw)
In-Reply-To: <20230323080443.GC20444@lst.de>



On 2023/3/23 16:04, Christoph Hellwig wrote:
> 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.
I will, thanks.
>
>> -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.
I will, thanks.
>
>> @@ -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?
I have no idea about better way.
>
> 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.
I will, thanks.
>
>> +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?
It seems there is no need to initialize debugfs if zswap is not used.

>
> .
>


      reply	other threads:[~2023-03-24  9:03 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
2023-03-24  9:03     ` Liu Shixin [this message]

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=d1cc88a1-4df2-977d-c1d1-018c2fbded62@huawei.com \
    --to=liushixin2@huawei.com \
    --cc=akpm@linux-foundation.org \
    --cc=ddstreet@ieee.org \
    --cc=hch@lst.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --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.