From: Barry Song <v-songbaohua@xxxxxxxx> mTHP is generally considered to potentially waste memory due to fragmentation, but it may also serve as a source of memory savings. When large folios are compressed at a larger granularity, we observe a remarkable decrease in CPU utilization and a significant improvement in compression ratios. The following data illustrates the time and compressed data for typical anonymous pages gathered from Android phones. granularity orig_data_size compr_data_size time(us) 4KiB-zstd 1048576000 246876055 50259962 64KiB-zstd 1048576000 199763892 18330605 Due to mTHP's ability to be swapped out without splitting[1] and swapped in as a whole[2], it enables compression and decompression to be performed at larger granularities. This patchset enhances zsmalloc and zram by introducing support for dividing large folios into multi-pages, typically configured with a 4-order granularity. Here are concrete examples: * If a large folio's size is 32KiB, it will still be compressed and stored at a 4KiB granularity. * If a large folio's size is 64KiB, it will be compressed and stored as a single 64KiB block. * If a large folio's size is 128KiB, it will be compressed and stored as two 64KiB multi-pages. Without the patchset, a large folio is always divided into nr_pages 4KiB blocks. The granularity can be configured using the ZSMALLOC_MULTI_PAGES_ORDER setting. [1] https://lore.kernel.org/linux-mm/20240327144537.4165578-1-ryan.roberts@xxxxxxx/ [2] https://lore.kernel.org/linux-mm/20240304081348.197341-1-21cnbao@xxxxxxxxx/ Tangquan Zheng (2): mm: zsmalloc: support objects compressed based on multiple pages zram: support compression at the granularity of multi-pages drivers/block/zram/Kconfig | 9 + drivers/block/zram/zcomp.c | 23 ++- drivers/block/zram/zcomp.h | 12 +- drivers/block/zram/zram_drv.c | 372 +++++++++++++++++++++++++++++++--- drivers/block/zram/zram_drv.h | 21 ++ include/linux/zsmalloc.h | 10 +- mm/Kconfig | 18 ++ mm/zsmalloc.c | 215 +++++++++++++++----- 8 files changed, 586 insertions(+), 94 deletions(-) -- 2.34.1