All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Rapoport <rppt@kernel.org>
To: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Cc: Minchan Kim <minchan@kernel.org>,
	Sergey Senozhatsky <senozhatsky@chromium.org>,
	Matthew Wilcox <willy@infradead.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-mm@kvack.org
Subject: Re: [RFC PATCH 02/25] mm/zsmalloc: add utility functions for zsdesc
Date: Mon, 27 Feb 2023 17:30:14 +0200	[thread overview]
Message-ID: <Y/zMhnE/VbsduDI0@kernel.org> (raw)
In-Reply-To: <20230220132218.546369-3-42.hyeyoo@gmail.com>

On Mon, Feb 20, 2023 at 01:21:55PM +0000, Hyeonggon Yoo wrote:
> Introduce utility functions for zsdesc to avoid directly accessing fields
> of struct page.
> 
> zsdesc_page() is defined this way to preserve constness. page_zsdesc() does

I'd suggest "zsdesc_page() is defined with _Generic to preserve constness"
and add a line break before page_zsdesc().

> not call compound_head() because zsdesc is always a base page.
> 
> Signed-off-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
> ---
>  mm/zsmalloc.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 118 insertions(+), 2 deletions(-)
> 
> diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
> index e2e34992c439..4af9f87cafb7 100644
> --- a/mm/zsmalloc.c
> +++ b/mm/zsmalloc.c
> @@ -332,6 +332,124 @@ ZSDESC_MATCH(_refcount, _refcount);
>  #undef ZSDESC_MATCH
>  static_assert(sizeof(struct zsdesc) <= sizeof(struct page));

I didn't do through check if it's feasible, but I think it would be better
to add helpers along with their usage.

For instance, move definition of zdesc_page() and page_zsdesc() to
"mm/zsmalloc: replace first_page to first_zsdesc in struct zspage" and so
on.
  
> +#define zsdesc_page(zdesc) (_Generic((zdesc),				\
> +		const struct zsdesc *:	(const struct page *)zdesc,	\
> +		struct zsdesc *:	(struct page *)zdesc))
> +
> +static inline struct zsdesc *page_zsdesc(struct page *page)
> +{
> +	return (struct zsdesc *)page;
> +}
> +
> +static inline unsigned long zsdesc_pfn(const struct zsdesc *zsdesc)
> +{
> +	return page_to_pfn(zsdesc_page(zsdesc));
> +}
> +
> +static inline struct zsdesc *pfn_zsdesc(unsigned long pfn)
> +{
> +	return page_zsdesc(pfn_to_page(pfn));
> +}
> +
> +static inline struct zspage *zsdesc_zspage(const struct zsdesc *zsdesc)
> +{
> +	return (struct zspage *)page_private(zsdesc_page(zsdesc));
> +}
> +
> +static inline int trylock_zsdesc(struct zsdesc *zsdesc)
> +{
> +	return trylock_page(zsdesc_page(zsdesc));
> +}
> +
> +static inline void unlock_zsdesc(struct zsdesc *zsdesc)
> +{
> +	return unlock_page(zsdesc_page(zsdesc));
> +}
> +
> +static inline struct zone *zsdesc_zone(struct zsdesc *zsdesc)
> +{
> +	return page_zone(zsdesc_page(zsdesc));
> +}
> +
> +static inline void wait_on_zsdesc_locked(struct zsdesc *zsdesc)
> +{
> +	wait_on_page_locked(zsdesc_page(zsdesc));
> +}
> +
> +static inline void zsdesc_get(struct zsdesc *zsdesc)
> +{
> +	struct folio *folio = (struct folio *)zsdesc;
> +
> +	folio_get(folio);
> +}
> +
> +static inline void zsdesc_put(struct zsdesc *zsdesc)
> +{
> +	struct folio *folio = (struct folio *)zsdesc;
> +
> +	folio_put(folio);
> +}
> +
> +static inline void *zsdesc_kmap_atomic(struct zsdesc *zsdesc)
> +{
> +	return kmap_atomic(zsdesc_page(zsdesc));
> +}
> +
> +static inline void zsdesc_set_zspage(struct zsdesc *zsdesc, struct zspage *zspage)
> +{
> +	set_page_private(zsdesc_page(zsdesc), (unsigned long)zspage);
> +}
> +
> +static inline void zsdesc_set_first(struct zsdesc *zsdesc)
> +{
> +	SetPagePrivate(zsdesc_page(zsdesc));
> +}
> +
> +static inline bool zsdesc_is_locked(struct zsdesc *zsdesc)
> +{
> +	return PageLocked(zsdesc_page(zsdesc));
> +}
> +
> +static inline bool zsdesc_is_isolated(struct zsdesc *zsdesc)
> +{
> +	return PageIsolated(zsdesc_page(zsdesc));
> +}
> +
> +static inline void zsdesc_inc_zone_page_state(struct zsdesc *zsdesc)
> +{
> +	inc_zone_page_state(zsdesc_page(zsdesc), NR_ZSPAGES);
> +}
> +
> +static inline void zsdesc_dec_zone_page_state(struct zsdesc *zsdesc)
> +{
> +	dec_zone_page_state(zsdesc_page(zsdesc), NR_ZSPAGES);
> +}
> +
> +static inline struct zsdesc *alloc_zsdesc(gfp_t gfp)
> +{
> +	struct page *page = alloc_page(gfp);
> +
> +	zsdesc_inc_zone_page_state(page_zsdesc(page));
> +	return page_zsdesc(page);
> +}
> +
> +static inline void free_zsdesc(struct zsdesc *zsdesc)
> +{
> +	struct page *page = zsdesc_page(zsdesc);
> +
> +	zsdesc_dec_zone_page_state(page_zsdesc(page));
> +	__free_page(page);
> +}
> +
> +static const struct movable_operations zsmalloc_mops;
> +
> +static inline void zsdesc_set_movable(struct zsdesc *zsdesc)
> +{
> +	struct page *page = zsdesc_page(zsdesc);
> +
> +	__SetPageMovable(page, &zsmalloc_mops);
> +}
> +
>  /* huge object: pages_per_zspage == 1 && maxobj_per_zspage == 1 */
>  static void SetZsHugePage(struct zspage *zspage)
>  {
> @@ -2012,8 +2130,6 @@ static void dec_zspage_isolation(struct zspage *zspage)
>  	zspage->isolated--;
>  }
>  
> -static const struct movable_operations zsmalloc_mops;
> -
>  static void replace_sub_page(struct size_class *class, struct zspage *zspage,
>  				struct page *newpage, struct page *oldpage)
>  {
> -- 
> 2.25.1
> 
> 

-- 
Sincerely yours,
Mike.


  reply	other threads:[~2023-02-27 15:30 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-20 13:21 [RFC PATCH 00/25] mm/zsmalloc: Split zsdesc from struct page Hyeonggon Yoo
2023-02-20 13:21 ` [RFC PATCH 01/25] mm/zsmalloc: create new struct zsdesc Hyeonggon Yoo
2023-02-20 13:21 ` [RFC PATCH 02/25] mm/zsmalloc: add utility functions for zsdesc Hyeonggon Yoo
2023-02-27 15:30   ` Mike Rapoport [this message]
2023-03-01  6:19     ` Hyeonggon Yoo
2023-02-20 13:21 ` [RFC PATCH 03/25] mm/zsmalloc: replace first_page to first_zsdesc in struct zspage Hyeonggon Yoo
2023-02-20 13:21 ` [RFC PATCH 04/25] mm/zsmalloc: add alternatives of frequently used helper functions Hyeonggon Yoo
2023-02-20 13:21 ` [RFC PATCH 05/25] mm/zsmalloc: convert {try,}lock_zspage() to use zsdesc Hyeonggon Yoo
2023-02-20 13:21 ` [RFC PATCH 06/25] mm/zsmalloc: convert __zs_{map,unmap}_object() " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 07/25] mm/zsmalloc: convert obj_to_location() and its users " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 08/25] mm/zsmalloc: convert obj_malloc() " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 09/25] mm/zsmalloc: convert create_page_chain() and its users " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 10/25] mm/zsmalloc: convert obj_tagged() and related helpers " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 11/25] mm/zsmalloc: convert init_zspage() " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 12/25] mm/zsmalloc: convert obj_to_page() and zs_free() " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 13/25] mm/zsmalloc: convert reset_page() to reset_zsdesc() Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 14/25] mm/zsmalloc: convert zs_page_{isolate,migrate,putback} to use zsdesc Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 15/25] mm/zsmalloc: convert __free_zspage() " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 16/25] mm/zsmalloc: convert unlock_zspage() " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 17/25] mm/zsmalloc: convert location_to_obj() " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 18/25] mm/zsmalloc: convert free_handles() " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 19/25] mm/zsmalloc: convert zs_compact_control and its users " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 20/25] mm/zsmalloc: convert get_zspage() to take zsdesc Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 21/25] mm/zsmalloc: convert SetZsPageMovable() to use zsdesc Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 22/25] mm/zsmalloc: convert restore_freelist() " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 23/25] mm/zsmalloc: convert zs_reclaim_page() " Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 24/25] mm/zsmalloc: remove now unused helper functions Hyeonggon Yoo
2023-02-20 13:22 ` [RFC PATCH 25/25] mm/zsmalloc: convert {get,set}_first_obj_offset() to use zsdesc Hyeonggon Yoo
2023-02-24  0:01 ` [RFC PATCH 00/25] mm/zsmalloc: Split zsdesc from struct page Minchan Kim
2023-02-28  0:32   ` Hyeonggon Yoo
2023-02-28  2:02     ` Sergey Senozhatsky

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=Y/zMhnE/VbsduDI0@kernel.org \
    --to=rppt@kernel.org \
    --cc=42.hyeyoo@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-mm@kvack.org \
    --cc=minchan@kernel.org \
    --cc=senozhatsky@chromium.org \
    --cc=willy@infradead.org \
    /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.