All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vishal Moola <vishal.moola@gmail.com>
To: alexs@kernel.org
Cc: Vitaly Wool <vitaly.wool@konsulko.com>,
	Miaohe Lin <linmiaohe@huawei.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	minchan@kernel.org, willy@infradead.org,
	senozhatsky@chromium.org, david@redhat.com, 42.hyeyoo@gmail.com,
	Yosry Ahmed <yosryahmed@google.com>,
	nphamcs@gmail.com
Subject: Re: [PATCH v4 02/22] mm/zsmalloc: use zpdesc in trylock_zspage/lock_zspage
Date: Fri, 2 Aug 2024 12:02:02 -0700	[thread overview]
Message-ID: <66ad2d2d.170a0220.668d3.6c80@mx.google.com> (raw)
In-Reply-To: <20240729112534.3416707-3-alexs@kernel.org>

On Mon, Jul 29, 2024 at 07:25:14PM +0800, alexs@kernel.org wrote:
> From: Alex Shi <alexs@kernel.org>
> 
> To use zpdesc in trylock_zspage/lock_zspage funcs, we add couple of helpers:
> zpdesc_lock/zpdesc_unlock/zpdesc_trylock/zpdesc_wait_locked and
> zpdesc_get/zpdesc_put for this purpose.

You should always include the "()" following function names. It just
makes everything more readable.

> Here we use the folio series func in guts for 2 reasons, one zswap.zpool
> only get single page, and use folio could save some compound_head checking;
> two, folio_put could bypass devmap checking that we don't need.
> 
> Originally-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
> Signed-off-by: Alex Shi <alexs@kernel.org>
> ---
>  mm/zpdesc.h   | 30 ++++++++++++++++++++++++
>  mm/zsmalloc.c | 64 ++++++++++++++++++++++++++++++++++-----------------
>  2 files changed, 73 insertions(+), 21 deletions(-)
> 
> diff --git a/mm/zpdesc.h b/mm/zpdesc.h
> index 2dbef231f616..3b04197cec9d 100644
> --- a/mm/zpdesc.h
> +++ b/mm/zpdesc.h
> @@ -63,4 +63,34 @@ static_assert(sizeof(struct zpdesc) <= sizeof(struct page));
>  	const struct page *:		(const struct zpdesc *)(p),	\
>  	struct page *:			(struct zpdesc *)(p)))
>  
> +static inline void zpdesc_lock(struct zpdesc *zpdesc)
> +{
> +	folio_lock(zpdesc_folio(zpdesc));
> +}
> +
> +static inline bool zpdesc_trylock(struct zpdesc *zpdesc)
> +{
> +	return folio_trylock(zpdesc_folio(zpdesc));
> +}
> +
> +static inline void zpdesc_unlock(struct zpdesc *zpdesc)
> +{
> +	folio_unlock(zpdesc_folio(zpdesc));
> +}
> +
> +static inline void zpdesc_wait_locked(struct zpdesc *zpdesc)
> +{
> +	folio_wait_locked(zpdesc_folio(zpdesc));
> +}

The more I look at zsmalloc, the more skeptical I get about it "needing"
the folio_lock. At a glance it seems like a zspage already has its own lock,
and the migration doesn't appear to be truly physical? There's probably
something I'm missing... it would make this code a lot simpler to drop
many of the folio locks.

> +
> +static inline void zpdesc_get(struct zpdesc *zpdesc)
> +{
> +	folio_get(zpdesc_folio(zpdesc));
> +}
> +
> +static inline void zpdesc_put(struct zpdesc *zpdesc)
> +{
> +	folio_put(zpdesc_folio(zpdesc));
> +}
> +
>  #endif
> diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
> index a532851025f9..243677a9c6d2 100644
> --- a/mm/zsmalloc.c
> +++ b/mm/zsmalloc.c
> @@ -433,13 +433,17 @@ static __maybe_unused int is_first_page(struct page *page)
>  	return PagePrivate(page);
>  }
>  
> +static int is_first_zpdesc(struct zpdesc *zpdesc)
> +{
> +	return PagePrivate(zpdesc_page(zpdesc));
> +}
> +

I feel like we might not even need to use the PG_private flag for
zpages? It seems to me like its just used for sanity checking. Can
zpage->first_page ever not point to the first zpdesc?

For the purpose of introducing the memdesc its fine to continue using
it; just some food for thought.


  reply	other threads:[~2024-08-02 19:02 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-29 11:25 [PATCH v4 00/22] mm/zsmalloc: add zpdesc memory descriptor for zswap.zpool alexs
2024-07-29 11:25 ` [PATCH v4 01/22] " alexs
2024-08-02 18:52   ` Vishal Moola
2024-08-05  4:06     ` Alex Shi
2024-08-08 18:21       ` Vishal Moola
2024-08-09  1:57         ` Alex Shi
2024-08-02 19:30   ` Matthew Wilcox
2024-08-05  4:36     ` Alex Shi
2024-07-29 11:25 ` [PATCH v4 02/22] mm/zsmalloc: use zpdesc in trylock_zspage/lock_zspage alexs
2024-08-02 19:02   ` Vishal Moola [this message]
2024-08-05  7:55     ` Alex Shi
2024-07-29 11:25 ` [PATCH v4 03/22] mm/zsmalloc: convert __zs_map_object/__zs_unmap_object to use zpdesc alexs
2024-07-30  9:38   ` Sergey Senozhatsky
2024-07-29 11:25 ` [PATCH v4 04/22] mm/zsmalloc: add and use pfn/zpdesc seeking funcs alexs
2024-07-29 11:25 ` [PATCH v4 05/22] mm/zsmalloc: convert obj_malloc() to use zpdesc alexs
2024-07-29 11:25 ` [PATCH v4 06/22] mm/zsmalloc: convert create_page_chain() and its users " alexs
2024-08-02 19:09   ` Vishal Moola
2024-08-05  8:20     ` Alex Shi
2024-08-08 18:25       ` Vishal Moola
2024-08-09  1:57         ` Alex Shi
2024-07-29 11:25 ` [PATCH v4 07/22] mm/zsmalloc: convert obj_allocated() and related helpers " alexs
2024-07-29 11:25 ` [PATCH v4 08/22] mm/zsmalloc: convert init_zspage() " alexs
2024-07-29 11:25 ` [PATCH v4 09/22] mm/zsmalloc: convert obj_to_page() and zs_free() " alexs
2024-07-29 11:25 ` [PATCH v4 10/22] mm/zsmalloc: add zpdesc_is_isolated/zpdesc_zone helper for zs_page_migrate alexs
2024-07-29 11:25 ` [PATCH v4 11/22] mm/zsmalloc: rename reset_page to reset_zpdesc and use zpdesc in it alexs
2024-07-29 11:25 ` [PATCH v4 12/22] mm/zsmalloc: convert __free_zspage() to use zdsesc alexs
2024-07-29 11:25 ` [PATCH v4 13/22] mm/zsmalloc: convert location_to_obj() to take zpdesc alexs
2024-07-29 11:25 ` [PATCH v4 14/22] mm/zsmalloc: convert migrate_zspage() to use zpdesc alexs
2024-07-29 11:25 ` [PATCH v4 15/22] mm/zsmalloc: convert get_zspage() to take zpdesc alexs
2024-07-29 11:25 ` [PATCH v4 16/22] mm/zsmalloc: convert SetZsPageMovable and remove unused funcs alexs
2024-07-29 11:25 ` [PATCH v4 17/22] mm/zsmalloc: convert get/set_first_obj_offset() to take zpdesc alexs
2024-07-29 11:25 ` [PATCH v4 18/22] mm/zsmalloc: introduce __zpdesc_clear_movable alexs
2024-07-30  9:34   ` Sergey Senozhatsky
2024-07-30 11:38     ` Alex Shi
2024-07-29 11:25 ` [PATCH v4 19/22] mm/zsmalloc: introduce __zpdesc_clear_zsmalloc alexs
2024-07-29 11:25 ` [PATCH v4 20/22] mm/zsmalloc: introduce __zpdesc_set_zsmalloc() alexs
2024-08-02 19:11   ` Vishal Moola
2024-08-05  8:28     ` Alex Shi
2024-07-29 11:25 ` [PATCH v4 21/22] mm/zsmalloc: fix build warning from lkp testing alexs
2024-08-02 19:13   ` Vishal Moola
2024-08-05  8:38     ` Alex Shi
2024-07-29 11:25 ` [PATCH v4 22/22] mm/zsmalloc: update comments for page->zpdesc changes alexs
2024-07-30  9:37   ` Sergey Senozhatsky
2024-07-30 11:45     ` Alex Shi
2024-07-31  2:16       ` Sergey Senozhatsky
2024-07-31  4:14         ` Alex Shi
2024-08-01  3:13           ` Sergey Senozhatsky
2024-08-01  3:35             ` Matthew Wilcox
2024-08-01  8:06               ` Alex Shi
2024-07-30 12:31 ` [PATCH 23/23] mm/zsmalloc: introduce zpdesc_clear_first() helper alexs

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=66ad2d2d.170a0220.668d3.6c80@mx.google.com \
    --to=vishal.moola@gmail.com \
    --cc=42.hyeyoo@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=alexs@kernel.org \
    --cc=david@redhat.com \
    --cc=linmiaohe@huawei.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=minchan@kernel.org \
    --cc=nphamcs@gmail.com \
    --cc=senozhatsky@chromium.org \
    --cc=vitaly.wool@konsulko.com \
    --cc=willy@infradead.org \
    --cc=yosryahmed@google.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.