zram: use __GFP_MOVABLE for memory allocation
authorMinchan Kim <minchan@kernel.org>
Tue, 26 Jul 2016 22:23:34 +0000 (15:23 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 26 Jul 2016 23:19:19 +0000 (16:19 -0700)
Zsmalloc is ready for page migration so zram can use __GFP_MOVABLE from
now on.

I did test to see how it helps to make higher order pages.  Test
scenario is as follows.

KVM guest, 1G memory, ext4 formated zram block device,

  for i in `seq 1 8`;
  do
          dd if=/dev/vda1 of=mnt/test$i.txt bs=128M count=1 &
  done

  wait `pidof dd`

  for i in `seq 1 2 8`;
  do
          rm -rf mnt/test$i.txt
  done
  fstrim -v mnt

  echo "init"
  cat /proc/buddyinfo

  echo "compaction"
  echo 1 > /proc/sys/vm/compact_memory
  cat /proc/buddyinfo

old:

  init
  Node 0, zone      DMA    208    120     51     41     11      0      0      0      0      0      0
  Node 0, zone    DMA32  16380  13777   9184   3805    789     54      3      0      0      0      0
  compaction
  Node 0, zone      DMA    132     82     40     39     16      2      1      0      0      0      0
  Node 0, zone    DMA32   5219   5526   4969   3455   1831    677    139     15      0      0      0

new:

  init
  Node 0, zone      DMA    379    115     97     19      2      0      0      0      0      0      0
  Node 0, zone    DMA32  18891  16774  10862   3947    637     21      0      0      0      0      0
  compaction
  Node 0, zone      DMA    214     66     87     29     10      3      0      0      0      0      0
  Node 0, zone    DMA32   1612   3139   3154   2469   1745    990    384     94      7      0      0

As you can see, compaction made so many high-order pages. Yay!

Link: http://lkml.kernel.org/r/1464736881-24886-13-git-send-email-minchan@kernel.org
Signed-off-by: Minchan Kim <minchan@kernel.org>
Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/block/zram/zram_drv.c

index c2a1d7dbaec90a4e0fdf7f632c89ccd5dd624763..9e2a83c3f19f9756604fac5ca5858bf2082543d3 100644 (file)
@@ -738,7 +738,8 @@ compress_again:
                handle = zs_malloc(meta->mem_pool, clen,
                                __GFP_KSWAPD_RECLAIM |
                                __GFP_NOWARN |
-                               __GFP_HIGHMEM);
+                               __GFP_HIGHMEM |
+                               __GFP_MOVABLE);
        if (!handle) {
                zcomp_stream_put(zram->comp);
                zstrm = NULL;
@@ -746,7 +747,8 @@ compress_again:
                atomic64_inc(&zram->stats.writestall);
 
                handle = zs_malloc(meta->mem_pool, clen,
-                               GFP_NOIO | __GFP_HIGHMEM);
+                               GFP_NOIO | __GFP_HIGHMEM |
+                               __GFP_MOVABLE);
                if (handle)
                        goto compress_again;