mbox series

[RFC,v3,00/21] mm/zsmalloc: Split zsdesc from struct page

Message ID 20231130101242.2590384-1-42.hyeyoo@gmail.com (mailing list archive)
Headers show
Series mm/zsmalloc: Split zsdesc from struct page | expand

Message

Harry (Hyeonggon) Yoo Nov. 30, 2023, 10:12 a.m. UTC
RFC v2: https://lore.kernel.org/linux-mm/20230713042037.980211-1-42.hyeyoo@gmail.com/

v2 -> v3:
 - rebased to the latest mm-unstable
 - adjusted comments from Sergey Senozhatsky (Moving zsdesc definition,
   kerneldoc fix) and Yosry Ahmed (adding memcg_data field to zsdesc)


V3 update is a bit late, but I still believe this is worth doing.
It would be nice to get comments/reviews/acks from maintainers/people.

Cover Letter:

The purpose of this series is to define own memory descriptor for zsmalloc,
instead of re-using various fields of struct page. This is a part of the
effort to reduce the size of struct page to unsigned long and enable
dynamic allocation of memory descriptors.

While [1] outlines this ultimate objective, the current use of struct page
is highly dependent on its definition, making it challenging to separately
allocate memory descriptors.

Therefore, this series introduces new descriptor for zsmalloc, called
zsdesc. It overlays struct page for now, but will eventually be allocated
independently in the future. And apart from dynamic allocation of descriptors,
this is a nice cleanup.

This work is also available at:
	https://gitlab.com/hyeyoo/linux/-/tree/separate_zsdesc_rfc-v3

[1] State Of The Page, August 2022
https://lore.kernel.org/lkml/YvV1KTyzZ+Jrtj9x@casper.infradead.org

Hyeonggon Yoo (21):
  mm/zsmalloc: create new struct zsdesc
  mm/zsmalloc: add utility functions for zsdesc
  mm/zsmalloc: replace first_page to first_zsdesc in struct zspage
  mm/zsmalloc: add alternatives of frequently used helper functions
  mm/zsmalloc: convert {try,}lock_zspage() to use zsdesc
  mm/zsmalloc: convert __zs_{map,unmap}_object() to use zsdesc
  mm/zsmalloc: convert obj_to_location() and its users to use zsdesc
  mm/zsmalloc: convert obj_malloc() to use zsdesc
  mm/zsmalloc: convert create_page_chain() and its users to use zsdesc
  mm/zsmalloc: convert obj_allocated() and related helpers to use zsdesc
  mm/zsmalloc: convert init_zspage() to use zsdesc
  mm/zsmalloc: convert obj_to_page() and zs_free() to use zsdesc
  mm/zsmalloc: convert reset_page() to reset_zsdesc()
  mm/zsmalloc: convert zs_page_{isolate,migrate,putback} to use zsdesc
  mm/zsmalloc: convert __free_zspage() to use zsdesc
  mm/zsmalloc: convert location_to_obj() to use zsdesc
  mm/zsmalloc: convert migrate_zspage() to use zsdesc
  mm/zsmalloc: convert get_zspage() to take zsdesc
  mm/zsmalloc: convert SetZsPageMovable() to use zsdesc
  mm/zsmalloc: remove now unused helper functions
  mm/zsmalloc: convert {get,set}_first_obj_offset() to use zsdesc

 mm/zsmalloc.c | 578 +++++++++++++++++++++++++++++++-------------------
 1 file changed, 364 insertions(+), 214 deletions(-)

Comments

Minchan Kim Dec. 1, 2023, 7:28 p.m. UTC | #1
On Thu, Nov 30, 2023 at 07:12:21PM +0900, Hyeonggon Yoo wrote:
> RFC v2: https://lore.kernel.org/linux-mm/20230713042037.980211-1-42.hyeyoo@gmail.com/
> 
> v2 -> v3:
>  - rebased to the latest mm-unstable
>  - adjusted comments from Sergey Senozhatsky (Moving zsdesc definition,
>    kerneldoc fix) and Yosry Ahmed (adding memcg_data field to zsdesc)
> 
> 
> V3 update is a bit late, but I still believe this is worth doing.
> It would be nice to get comments/reviews/acks from maintainers/people.
> 
> Cover Letter:
> 
> The purpose of this series is to define own memory descriptor for zsmalloc,
> instead of re-using various fields of struct page. This is a part of the
> effort to reduce the size of struct page to unsigned long and enable
> dynamic allocation of memory descriptors.
> 
> While [1] outlines this ultimate objective, the current use of struct page
> is highly dependent on its definition, making it challenging to separately
> allocate memory descriptors.
> 
> Therefore, this series introduces new descriptor for zsmalloc, called
> zsdesc. It overlays struct page for now, but will eventually be allocated
> independently in the future. And apart from dynamic allocation of descriptors,
> this is a nice cleanup.

And the new descriptor doesn't bloat anything for zsmalloc meta size. Right?
Please specify it into the description.

> 
> This work is also available at:
> 	https://gitlab.com/hyeyoo/linux/-/tree/separate_zsdesc_rfc-v3
> 
> [1] State Of The Page, August 2022
> https://lore.kernel.org/lkml/YvV1KTyzZ+Jrtj9x@casper.infradead.org
> 
> Hyeonggon Yoo (21):
>   mm/zsmalloc: create new struct zsdesc
>   mm/zsmalloc: add utility functions for zsdesc
>   mm/zsmalloc: replace first_page to first_zsdesc in struct zspage
>   mm/zsmalloc: add alternatives of frequently used helper functions
>   mm/zsmalloc: convert {try,}lock_zspage() to use zsdesc
>   mm/zsmalloc: convert __zs_{map,unmap}_object() to use zsdesc
>   mm/zsmalloc: convert obj_to_location() and its users to use zsdesc
>   mm/zsmalloc: convert obj_malloc() to use zsdesc
>   mm/zsmalloc: convert create_page_chain() and its users to use zsdesc
>   mm/zsmalloc: convert obj_allocated() and related helpers to use zsdesc
>   mm/zsmalloc: convert init_zspage() to use zsdesc
>   mm/zsmalloc: convert obj_to_page() and zs_free() to use zsdesc
>   mm/zsmalloc: convert reset_page() to reset_zsdesc()
>   mm/zsmalloc: convert zs_page_{isolate,migrate,putback} to use zsdesc
>   mm/zsmalloc: convert __free_zspage() to use zsdesc
>   mm/zsmalloc: convert location_to_obj() to use zsdesc
>   mm/zsmalloc: convert migrate_zspage() to use zsdesc
>   mm/zsmalloc: convert get_zspage() to take zsdesc
>   mm/zsmalloc: convert SetZsPageMovable() to use zsdesc
>   mm/zsmalloc: remove now unused helper functions
>   mm/zsmalloc: convert {get,set}_first_obj_offset() to use zsdesc
> 
>  mm/zsmalloc.c | 578 +++++++++++++++++++++++++++++++-------------------
>  1 file changed, 364 insertions(+), 214 deletions(-)
> 
> -- 
> 2.39.3
> 

It's straightforward, and I don't see any problems. I sincerely appreciate
your dedication to making this change.

Thank you, Hyeonggon!
Sergey Senozhatsky Dec. 2, 2023, 4:36 a.m. UTC | #2
On (23/12/01 11:28), Minchan Kim wrote:
> On Thu, Nov 30, 2023 at 07:12:21PM +0900, Hyeonggon Yoo wrote:
> > RFC v2: https://lore.kernel.org/linux-mm/20230713042037.980211-1-42.hyeyoo@gmail.com/
> > 
> > v2 -> v3:
> >  - rebased to the latest mm-unstable
> >  - adjusted comments from Sergey Senozhatsky (Moving zsdesc definition,
> >    kerneldoc fix) and Yosry Ahmed (adding memcg_data field to zsdesc)
> > 
> > 
> > V3 update is a bit late, but I still believe this is worth doing.
> > It would be nice to get comments/reviews/acks from maintainers/people.
> > 
> > Cover Letter:
> > 
> > The purpose of this series is to define own memory descriptor for zsmalloc,
> > instead of re-using various fields of struct page. This is a part of the
> > effort to reduce the size of struct page to unsigned long and enable
> > dynamic allocation of memory descriptors.
> > 
> > While [1] outlines this ultimate objective, the current use of struct page
> > is highly dependent on its definition, making it challenging to separately
> > allocate memory descriptors.
> > 
> > Therefore, this series introduces new descriptor for zsmalloc, called
> > zsdesc. It overlays struct page for now, but will eventually be allocated
> > independently in the future. And apart from dynamic allocation of descriptors,
> > this is a nice cleanup.
> 
> And the new descriptor doesn't bloat anything for zsmalloc meta size. Right?
> Please specify it into the description.

Right, that popped up [1] previously but I'm not sure if we had a definitive
answer.

https://lore.kernel.org/lkml/20230720071826.GE955071@google.com/
Matthew Wilcox Dec. 2, 2023, 10:46 p.m. UTC | #3
On Sat, Dec 02, 2023 at 01:36:37PM +0900, Sergey Senozhatsky wrote:
> On (23/12/01 11:28), Minchan Kim wrote:
> > > Therefore, this series introduces new descriptor for zsmalloc, called
> > > zsdesc. It overlays struct page for now, but will eventually be allocated
> > > independently in the future. And apart from dynamic allocation of descriptors,
> > > this is a nice cleanup.
> > 
> > And the new descriptor doesn't bloat anything for zsmalloc meta size. Right?
> > Please specify it into the description.
> 
> Right, that popped up [1] previously but I'm not sure if we had a definitive
> answer.
> 
> https://lore.kernel.org/lkml/20230720071826.GE955071@google.com/

Today, it remains an overlay of struct page.  In the future, it will be
separately allocated, and may end up shrinking.  TBD.
Harry (Hyeonggon) Yoo Dec. 3, 2023, 5:21 a.m. UTC | #4
On Sat, Dec 2, 2023 at 1:36 PM Sergey Senozhatsky
<senozhatsky@chromium.org> wrote:
>
> On (23/12/01 11:28), Minchan Kim wrote:
> > On Thu, Nov 30, 2023 at 07:12:21PM +0900, Hyeonggon Yoo wrote:
> > > RFC v2: https://lore.kernel.org/linux-mm/20230713042037.980211-1-42.hyeyoo@gmail.com/
> > >
> > > v2 -> v3:
> > >  - rebased to the latest mm-unstable
> > >  - adjusted comments from Sergey Senozhatsky (Moving zsdesc definition,
> > >    kerneldoc fix) and Yosry Ahmed (adding memcg_data field to zsdesc)
> > >
> > >
> > > V3 update is a bit late, but I still believe this is worth doing.
> > > It would be nice to get comments/reviews/acks from maintainers/people.
> > >
> > > Cover Letter:
> > >
> > > The purpose of this series is to define own memory descriptor for zsmalloc,
> > > instead of re-using various fields of struct page. This is a part of the
> > > effort to reduce the size of struct page to unsigned long and enable
> > > dynamic allocation of memory descriptors.
> > >
> > > While [1] outlines this ultimate objective, the current use of struct page
> > > is highly dependent on its definition, making it challenging to separately
> > > allocate memory descriptors.
> > >
> > > Therefore, this series introduces new descriptor for zsmalloc, called
> > > zsdesc. It overlays struct page for now, but will eventually be allocated
> > > independently in the future. And apart from dynamic allocation of descriptors,
> > > this is a nice cleanup.
> >
> > And the new descriptor doesn't bloat anything for zsmalloc meta size. Right?
> > Please specify it into the description.
>
> Right, that popped up [1] previously but I'm not sure if we had a definitive
> answer.
> https://lore.kernel.org/lkml/20230720071826.GE955071@google.com/

Oh, I thought I did, maybe I missed it.

Let me explain it here, it does not bloat the struct page:
> static_assert(sizeof(struct zsdesc) <= sizeof(struct page));
Otherwise the compiler will complain.

So with this patch series, it does not bloat the size of struct page,
nor allocates
additional memory for zsmalloc. Will add that in the description of
the next revision.

As Matthew pointed, in the future struct page and zsdesc may end up being
shrunken and separately allocated. What this series does is only
separating definition
of the descriptor (but still overlaying struct page)

Thanks a lot!
--
Hyeonggon