mbox series

[v7,00/21] mm/zsmalloc: add zpdesc memory descriptor for zswap.zpool

Message ID 20240902072136.578720-1-alexs@kernel.org (mailing list archive)
Headers show
Series mm/zsmalloc: add zpdesc memory descriptor for zswap.zpool | expand

Message

alexs@kernel.org Sept. 2, 2024, 7:21 a.m. UTC
From: Alex Shi <alexs@kernel.org>

According to Metthew's plan, the page descriptor will be replace by a 8
bytes mem_desc on destination purpose.
https://lore.kernel.org/lkml/YvV1KTyzZ+Jrtj9x@casper.infradead.org/

This patchset abstracts the memory descriptor used in zsmalloc by zswap/zram.
The descriptor still overlays the struct page; nothing has changed
in that regard. What this patchset accomplishes is the use of folios in
to save some code size, and the introduction of a new concept, zpdesc. 
This patchset is just an initial step; it does not bias the potential 
changes to kmem_alloc or larger zspage modifications.

To name the struct zpdesc instead of zsdesc, since there are still 3
zpools under zswap: zbud, z3fold, zsmalloc for now(z3fold maybe removed
soon), and we could easyly extend it to other zswap.zpool in needs.

For all zswap.zpools, they are all using single page since often used
under memory pressure. So the conversion via folio series helper is
better than page's for compound_head check saving.

For now, all zpools are using some page struct members, like page.flags
for PG_private/PG_locked. and list_head lru, page.mapping for page migration.

This patachset does not increase the descriptor size nor introduce any
functional changes, and could save about 122Kbytes zsmalloc.o size.

Thanks a lot for comments and suggestion from Yosry, Yoo, Sergey, Willy
and Vishal!

Thanks
Alex
---
v6->v7:
- rebase on akpm/mm-unstable on Aug 30

v5->v6:
- rebase on akpm/mm-unstable on Aug 4
- recover 2 helpers and update code comments according to Vishal's
  comments on patch 1 and 6.

v4->v5:
- rebase on akpm/mm-unstable on Aug 8 + Stephen Rothwell's build fix.
- add a helper and update code comments according to Sergey's comments
- fold patch 20/21, remove 3 helpers functions according to Vishal's
  comments 

v3->v4:
- rebase on akpm/mm-unstable Jul 21
- fixed a build warning reported by LKP
- Add a comment update for struct page to zpdesc change

v2->v3:
- Fix LKP reported build issue
- Update the Usage of struct zpdesc fields.
- Rebase onto latest mm-unstable commit 2073cda629a4

v1->v2: 
- Take Yosry and Yoo's suggestion to add more members in zpdesc,
- Rebase on latest mm-unstable commit 31334cf98dbd
Alex Shi (10):
  mm/zsmalloc: add zpdesc memory descriptor for zswap.zpool
  mm/zsmalloc: use zpdesc in trylock_zspage()/lock_zspage()
  mm/zsmalloc: convert create_page_chain() and its users to use zpdesc
  mm/zsmalloc: rename reset_page to reset_zpdesc and use zpdesc in it
  mm/zsmalloc: convert SetZsPageMovable and remove unused funcs
  mm/zsmalloc: convert get/set_first_obj_offset() to take zpdesc
  mm/zsmalloc: introduce __zpdesc_clear_movable
  mm/zsmalloc: introduce __zpdesc_clear/set_zsmalloc()
  mm/zsmalloc: introduce zpdesc_clear_first() helper
  mm/zsmalloc: update comments for page->zpdesc changes

Hyeonggon Yoo (11):
  mm/zsmalloc: convert __zs_map_object/__zs_unmap_object to use zpdesc
  mm/zsmalloc: add and use pfn/zpdesc seeking funcs
  mm/zsmalloc: convert obj_malloc() to use zpdesc
  mm/zsmalloc: convert obj_allocated() and related helpers to use zpdesc
  mm/zsmalloc: convert init_zspage() to use zpdesc
  mm/zsmalloc: convert obj_to_page() and zs_free() to use zpdesc
  mm/zsmalloc: add zpdesc_is_isolated()/zpdesc_zone() helper for
    zs_page_migrate()
  mm/zsmalloc: convert __free_zspage() to use zdsesc
  mm/zsmalloc: convert location_to_obj() to take zpdesc
  mm/zsmalloc: convert migrate_zspage() to use zpdesc
  mm/zsmalloc: convert get_zspage() to take zpdesc

 mm/zpdesc.h   | 147 +++++++++++++++
 mm/zsmalloc.c | 490 +++++++++++++++++++++++++++-----------------------
 2 files changed, 414 insertions(+), 223 deletions(-)
 create mode 100644 mm/zpdesc.h

Comments

Sergey Senozhatsky Sept. 3, 2024, 3:35 a.m. UTC | #1
On (24/09/02 15:21), alexs@kernel.org wrote:
> The descriptor still overlays the struct page; nothing has changed
> in that regard.
> [..]
> This patachset does not increase the descriptor size nor introduce any
> functional changes, and could save about 122Kbytes zsmalloc.o size.

Is this number accurate?  Where does such a large saving come from?
Sergey Senozhatsky Sept. 3, 2024, 3:45 a.m. UTC | #2
On (24/09/03 12:35), Sergey Senozhatsky wrote:
> On (24/09/02 15:21), alexs@kernel.org wrote:
> > The descriptor still overlays the struct page; nothing has changed
> > in that regard.
> > [..]
> > This patachset does not increase the descriptor size nor introduce any
> > functional changes, and could save about 122Kbytes zsmalloc.o size.
> 
> Is this number accurate?  Where does such a large saving come from?

./scripts/bloat-o-meter mm/zsmalloc.o-base mm/zsmalloc.o-patched
add/remove: 0/0 grow/shrink: 2/6 up/down: 7/-843 (-836)
Function                                     old     new   delta
obj_free                                     211     215      +4
zs_unmap_object                              568     571      +3
zs_map_object                                661     633     -28
SetZsPageMovable                             135      86     -49
free_zspage                                  310     253     -57
__free_zspage                                284     226     -58
zs_page_migrate                             1304    1136    -168
async_free_zspage                           1099     616    -483
Alex Shi Sept. 3, 2024, 8:01 a.m. UTC | #3
On 9/3/24 11:45 AM, Sergey Senozhatsky wrote:
> On (24/09/03 12:35), Sergey Senozhatsky wrote:
>> On (24/09/02 15:21), alexs@kernel.org wrote:
>>> The descriptor still overlays the struct page; nothing has changed
>>> in that regard.
>>> [..]
>>> This patachset does not increase the descriptor size nor introduce any
>>> functional changes, and could save about 122Kbytes zsmalloc.o size.
>>
>> Is this number accurate?  Where does such a large saving come from?

Hi Sergey,

Thanks for asking, I collected some data on Aug 2, before the patchset,
zsmalloc.o is 1200960 bytes, after patched, it's 1076144 bytes. At that
time it's saved about 124KB, about 10%, with some debug option enabled.

Just test again with x86defconfig + ZSMALLOC + ZSMALLOC_STAT, 
on mm-unstable tree, zsmalloc.o reduces to 34960 bytes from 37328 bytes,
that's 6.3% saved.

The bloat-o-meter show in machine:
$ ./scripts/bloat-o-meter x86def/mm/zsmalloc.o x86def/mm/zsmalloc-patched.o 
add/remove: 1/1 grow/shrink: 1/5 up/down: 100/-1068 (-968)
Function                                     old     new   delta
create_zpdesc_chain                            -      92     +92
zs_compact                                  2352    2360      +8
zs_malloc                                   1334    1277     -57
__free_zspage                                291     223     -68
free_zspage                                  289     211     -78
create_page_chain                             95       -     -95
zs_page_migrate                              950     807    -143
async_free_zspage                           1252     625    -627
Total: Before=11868, After=10900, chg -8.16%

> 
> ./scripts/bloat-o-meter mm/zsmalloc.o-base mm/zsmalloc.o-patched
> add/remove: 0/0 grow/shrink: 2/6 up/down: 7/-843 (-836)
> Function                                     old     new   delta
> obj_free                                     211     215      +4
> zs_unmap_object                              568     571      +3
> zs_map_object                                661     633     -28
> SetZsPageMovable                             135      86     -49
> free_zspage                                  310     253     -57
> __free_zspage                                284     226     -58
> zs_page_migrate                             1304    1136    -168
> async_free_zspage                           1099     616    -483

Many thanks for detailed data here!

Thanks
Alex
Alex Shi Sept. 4, 2024, 6:54 a.m. UTC | #4
On 9/2/24 3:21 PM, alexs@kernel.org wrote:
> From: Alex Shi <alexs@kernel.org>
> 
...

> 
> This patchset abstracts the memory descriptor used in zsmalloc by zswap/zram.
> The descriptor still overlays the struct page; nothing has changed
> in that regard. What this patchset accomplishes is the use of folios in
> to save some code size, and the introduction of a new concept, zpdesc. 
> This patchset is just an initial step; it does not bias the potential 
> changes to kmem_alloc or larger zspage modifications.
> 
...
> 
> Thanks a lot for comments and suggestion from Yosry, Yoo, Sergey, Willy
> and Vishal!
> 

This patchset could save 6.3% code size, and it's a nice abstract of zsmalloc
memory usage.
Is there any more comments, or mind to give a reviewed-by?

Thanks
Alex
Vishal Moola (Oracle) Sept. 4, 2024, 8:04 p.m. UTC | #5
On Wed, Sep 04, 2024 at 02:54:14PM +0800, Alex Shi wrote:
> 
> 
> On 9/2/24 3:21 PM, alexs@kernel.org wrote:
> > From: Alex Shi <alexs@kernel.org>
> > 
> ...
> 
> > 
> > This patchset abstracts the memory descriptor used in zsmalloc by zswap/zram.
> > The descriptor still overlays the struct page; nothing has changed
> > in that regard. What this patchset accomplishes is the use of folios in
> > to save some code size, and the introduction of a new concept, zpdesc. 
> > This patchset is just an initial step; it does not bias the potential 
> > changes to kmem_alloc or larger zspage modifications.
> > 
> ...
> > 
> > Thanks a lot for comments and suggestion from Yosry, Yoo, Sergey, Willy
> > and Vishal!
> > 
> 
> This patchset could save 6.3% code size, and it's a nice abstract of zsmalloc
> memory usage.
> Is there any more comments, or mind to give a reviewed-by?

Please CC me on future versions. Most of the zsmalloc conversions seem
ok, but I'd hold off on further iterations of the descriptor patches until
the maintainers decide on what/how this descriptor will be used
(i.e. our end goals).

> Thanks
> Alex
Alex Shi Sept. 12, 2024, 2:28 a.m. UTC | #6
On 9/5/24 4:04 AM, Vishal Moola wrote:
> On Wed, Sep 04, 2024 at 02:54:14PM +0800, Alex Shi wrote:
>>
>>
>> On 9/2/24 3:21 PM, alexs@kernel.org wrote:
>>> From: Alex Shi <alexs@kernel.org>
>>>
>> ...
>>
>>>
>>> This patchset abstracts the memory descriptor used in zsmalloc by zswap/zram.
>>> The descriptor still overlays the struct page; nothing has changed
>>> in that regard. What this patchset accomplishes is the use of folios in
>>> to save some code size, and the introduction of a new concept, zpdesc. 
>>> This patchset is just an initial step; it does not bias the potential 
>>> changes to kmem_alloc or larger zspage modifications.
>>>
>> ...
>>>
>>> Thanks a lot for comments and suggestion from Yosry, Yoo, Sergey, Willy
>>> and Vishal!
>>>
>>
>> This patchset could save 6.3% code size, and it's a nice abstract of zsmalloc
>> memory usage.
>> Is there any more comments, or mind to give a reviewed-by?
> 
> Please CC me on future versions. Most of the zsmalloc conversions seem
> ok, but I'd hold off on further iterations of the descriptor patches until
> the maintainers decide on what/how this descriptor will be used
> (i.e. our end goals).

Thanks for your care.

Is there some places or some conversion should be changed?

btw, the descriptor is used now and could save a few code size. :)

Thanks