lkml.org 
[lkml]   [2016]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 18/18] zram: use __GFP_MOVABLE for memory allocation
    Date
    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 1
    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!

    Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Signed-off-by: Minchan Kim <minchan@kernel.org>
    ---
    drivers/block/zram/zram_drv.c | 3 ++-
    mm/zsmalloc.c | 2 +-
    2 files changed, 3 insertions(+), 2 deletions(-)

    diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
    index 46055dbc4095..da8298b9f05e 100644
    --- a/drivers/block/zram/zram_drv.c
    +++ b/drivers/block/zram/zram_drv.c
    @@ -517,7 +517,8 @@ static struct zram_meta *zram_meta_alloc(char *pool_name, u64 disksize)
    goto out_error;
    }

    - meta->mem_pool = zs_create_pool(pool_name, GFP_NOIO | __GFP_HIGHMEM);
    + meta->mem_pool = zs_create_pool(pool_name, GFP_NOIO|__GFP_HIGHMEM
    + |__GFP_MOVABLE);
    if (!meta->mem_pool) {
    pr_err("Error creating memory pool\n");
    goto out_error;
    diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
    index 35bafa0bc3f1..8557da6dbaf2 100644
    --- a/mm/zsmalloc.c
    +++ b/mm/zsmalloc.c
    @@ -308,7 +308,7 @@ static void destroy_handle_cache(struct zs_pool *pool)
    static unsigned long alloc_handle(struct zs_pool *pool)
    {
    return (unsigned long)kmem_cache_alloc(pool->handle_cachep,
    - pool->flags & ~__GFP_HIGHMEM);
    + pool->flags & ~(__GFP_HIGHMEM|__GFP_MOVABLE));
    }

    static void free_handle(struct zs_pool *pool, unsigned long handle)
    --
    1.9.1
    \
     
     \ /
      Last update: 2016-03-21 08:01    [W:4.162 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site