Cc: a...@linux-foundation.org

The email starts at

http://lkml.kernel.org/r/20190605100630.13293-2-teawat...@linux.alibaba.com

On Wed, Jun 5, 2019 at 3:06 AM Hui Zhu <teawat...@linux.alibaba.com> wrote:
>
> This is the third version that was updated according to the comments
> from Sergey Senozhatsky https://lkml.org/lkml/2019/5/29/73 and
> Shakeel Butt https://lkml.org/lkml/2019/6/4/973
>
> zswap compresses swap pages into a dynamically allocated RAM-based
> memory pool.  The memory pool should be zbud, z3fold or zsmalloc.
> All of them will allocate unmovable pages.  It will increase the
> number of unmovable page blocks that will bad for anti-fragment.
>
> zsmalloc support page migration if request movable page:
>         handle = zs_malloc(zram->mem_pool, comp_len,
>                 GFP_NOIO | __GFP_HIGHMEM |
>                 __GFP_MOVABLE);
>
> And commit "zpool: Add malloc_support_movable to zpool_driver" add
> zpool_malloc_support_movable check malloc_support_movable to make
> sure if a zpool support allocate movable memory.
>
> This commit let zswap allocate block with gfp
> __GFP_HIGHMEM | __GFP_MOVABLE if zpool support allocate movable memory.
>
> Following part is test log in a pc that has 8G memory and 2G swap.
>
> Without this commit:
> ~# echo lz4 > /sys/module/zswap/parameters/compressor
> ~# echo zsmalloc > /sys/module/zswap/parameters/zpool
> ~# echo 1 > /sys/module/zswap/parameters/enabled
> ~# swapon /swapfile
> ~# cd /home/teawater/kernel/vm-scalability/
> /home/teawater/kernel/vm-scalability# export unit_size=$((9 * 1024 * 1024 * 
> 1024))
> /home/teawater/kernel/vm-scalability# ./case-anon-w-seq
> 2717908992 bytes / 4826062 usecs = 549973 KB/s
> 2717908992 bytes / 4864201 usecs = 545661 KB/s
> 2717908992 bytes / 4867015 usecs = 545346 KB/s
> 2717908992 bytes / 4915485 usecs = 539968 KB/s
> 397853 usecs to free memory
> 357820 usecs to free memory
> 421333 usecs to free memory
> 420454 usecs to free memory
> /home/teawater/kernel/vm-scalability# cat /proc/pagetypeinfo
> Page block order: 9
> Pages per block:  512
>
> Free pages count per migrate type at order       0      1      2      3      
> 4      5      6      7      8      9     10
> Node    0, zone      DMA, type    Unmovable      1      1      1      0      
> 2      1      1      0      1      0      0
> Node    0, zone      DMA, type      Movable      0      0      0      0      
> 0      0      0      0      0      1      3
> Node    0, zone      DMA, type  Reclaimable      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone      DMA, type   HighAtomic      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone      DMA, type          CMA      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone      DMA, type      Isolate      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone    DMA32, type    Unmovable      6      5      8      6      
> 6      5      4      1      1      1      0
> Node    0, zone    DMA32, type      Movable     25     20     20     19     
> 22     15     14     11     11      5    767
> Node    0, zone    DMA32, type  Reclaimable      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone    DMA32, type   HighAtomic      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone    DMA32, type          CMA      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone    DMA32, type      Isolate      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone   Normal, type    Unmovable   4753   5588   5159   4613   
> 3712   2520   1448    594    188     11      0
> Node    0, zone   Normal, type      Movable     16      3    457   2648   
> 2143   1435    860    459    223    224    296
> Node    0, zone   Normal, type  Reclaimable      0      0     44     38     
> 11      2      0      0      0      0      0
> Node    0, zone   Normal, type   HighAtomic      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone   Normal, type          CMA      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone   Normal, type      Isolate      0      0      0      0      
> 0      0      0      0      0      0      0
>
> Number of blocks type     Unmovable      Movable  Reclaimable   HighAtomic    
>       CMA      Isolate
> Node 0, zone      DMA            1            7            0            0     
>        0            0
> Node 0, zone    DMA32            4         1652            0            0     
>        0            0
> Node 0, zone   Normal          931         1485           15            0     
>        0            0
>
> With this commit:
> ~# echo lz4 > /sys/module/zswap/parameters/compressor
> ~# echo zsmalloc > /sys/module/zswap/parameters/zpool
> ~# echo 1 > /sys/module/zswap/parameters/enabled
> ~# swapon /swapfile
> ~# cd /home/teawater/kernel/vm-scalability/
> /home/teawater/kernel/vm-scalability# export unit_size=$((9 * 1024 * 1024 * 
> 1024))
> /home/teawater/kernel/vm-scalability# ./case-anon-w-seq
> 2717908992 bytes / 4689240 usecs = 566020 KB/s
> 2717908992 bytes / 4760605 usecs = 557535 KB/s
> 2717908992 bytes / 4803621 usecs = 552543 KB/s
> 2717908992 bytes / 5069828 usecs = 523530 KB/s
> 431546 usecs to free memory
> 383397 usecs to free memory
> 456454 usecs to free memory
> 224487 usecs to free memory
> /home/teawater/kernel/vm-scalability# cat /proc/pagetypeinfo
> Page block order: 9
> Pages per block:  512
>
> Free pages count per migrate type at order       0      1      2      3      
> 4      5      6      7      8      9     10
> Node    0, zone      DMA, type    Unmovable      1      1      1      0      
> 2      1      1      0      1      0      0
> Node    0, zone      DMA, type      Movable      0      0      0      0      
> 0      0      0      0      0      1      3
> Node    0, zone      DMA, type  Reclaimable      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone      DMA, type   HighAtomic      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone      DMA, type          CMA      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone      DMA, type      Isolate      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone    DMA32, type    Unmovable     10      8     10      9     
> 10      4      3      2      3      0      0
> Node    0, zone    DMA32, type      Movable     18     12     14     16     
> 16     11      9      5      5      6    775
> Node    0, zone    DMA32, type  Reclaimable      0      0      0      0      
> 0      0      0      0      0      0      1
> Node    0, zone    DMA32, type   HighAtomic      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone    DMA32, type          CMA      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone    DMA32, type      Isolate      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone   Normal, type    Unmovable   2669   1236    452    118     
> 37     14      4      1      2      3      0
> Node    0, zone   Normal, type      Movable   3850   6086   5274   4327   
> 3510   2494   1520    934    438    220    470
> Node    0, zone   Normal, type  Reclaimable     56     93    155    124     
> 47     31     17      7      3      0      0
> Node    0, zone   Normal, type   HighAtomic      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone   Normal, type          CMA      0      0      0      0      
> 0      0      0      0      0      0      0
> Node    0, zone   Normal, type      Isolate      0      0      0      0      
> 0      0      0      0      0      0      0
>
> Number of blocks type     Unmovable      Movable  Reclaimable   HighAtomic    
>       CMA      Isolate
> Node 0, zone      DMA            1            7            0            0     
>        0            0
> Node 0, zone    DMA32            4         1650            2            0     
>        0            0
> Node 0, zone   Normal           79         2326           26            0     
>        0            0
>
> You can see that the number of unmovable page blocks is decreased
> when the kernel has this commit.
>
> Signed-off-by: Hui Zhu <teawat...@linux.alibaba.com>
> ---
>  mm/zswap.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/mm/zswap.c b/mm/zswap.c
> index a4e4d36ec085..c6bf92bf5890 100644
> --- a/mm/zswap.c
> +++ b/mm/zswap.c
> @@ -1006,6 +1006,7 @@ static int zswap_frontswap_store(unsigned type, pgoff_t 
> offset,
>         char *buf;
>         u8 *src, *dst;
>         struct zswap_header zhdr = { .swpentry = swp_entry(type, offset) };
> +       gfp_t gfp;
>
>         /* THP isn't supported */
>         if (PageTransHuge(page)) {
> @@ -1079,9 +1080,10 @@ static int zswap_frontswap_store(unsigned type, 
> pgoff_t offset,
>
>         /* store */
>         hlen = zpool_evictable(entry->pool->zpool) ? sizeof(zhdr) : 0;
> -       ret = zpool_malloc(entry->pool->zpool, hlen + dlen,
> -                          __GFP_NORETRY | __GFP_NOWARN | 
> __GFP_KSWAPD_RECLAIM,
> -                          &handle);
> +       gfp = __GFP_NORETRY | __GFP_NOWARN | __GFP_KSWAPD_RECLAIM;
> +       if (zpool_malloc_support_movable(entry->pool->zpool))
> +               gfp |= __GFP_HIGHMEM | __GFP_MOVABLE;
> +       ret = zpool_malloc(entry->pool->zpool, hlen + dlen, gfp, &handle);
>         if (ret == -ENOSPC) {
>                 zswap_reject_compress_poor++;
>                 goto put_dstmem;
> --
> 2.21.0 (Apple Git-120)
>

Reply via email to