Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753321AbbKWGX7 (ORCPT ); Mon, 23 Nov 2015 01:23:59 -0500 Received: from LGEAMRELO11.lge.com ([156.147.23.51]:46608 "EHLO lgeamrelo11.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752822AbbKWGX6 (ORCPT ); Mon, 23 Nov 2015 01:23:58 -0500 X-Original-SENDERIP: 156.147.1.125 X-Original-MAILFROM: kyeongdon.kim@lge.com X-Original-SENDERIP: 165.244.98.204 X-Original-MAILFROM: kyeongdon.kim@lge.com X-Original-SENDERIP: 10.175.204.26 X-Original-MAILFROM: kyeongdon.kim@lge.com From: Kyeongdon Kim To: , , CC: linux-kernel@vger.kernel.org, Kyeongdon Kim Subject: [PATCH v3] zram: try vmalloc() after kmalloc() Date: Mon, 23 Nov 2015 15:21:15 +0900 Message-ID: <1448259675-29888-1-git-send-email-kyeongdon.kim@lge.com> X-Mailer: git-send-email 1.8.2 X-MIMETrack: Itemize by SMTP Server on LGEKRMHUB07/LGE/LG Group(Release 8.5.3FP6|November 21, 2013) at 2015/11/23 15:23:56, Serialize by Router on LGEKRMHUB07/LGE/LG Group(Release 8.5.3FP6|November 21, 2013) at 2015/11/23 15:23:56, Serialize complete at 2015/11/23 15:23:56 MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4316 Lines: 128 When we're using LZ4 multi compression streams for zram swap, we found out page allocation failure message in system running test. That was not only once, but a few(2 - 5 times per test). Also, some failure cases were continually occurring to try allocation order 3. In order to make parallel compression private data, we should call kzalloc() with order 2/3 in runtime(lzo/lz4). But if there is no order 2/3 size memory to allocate in that time, page allocation fails. This patch makes to use vmalloc() as fallback of kmalloc(), this prevents page alloc failure warning. After using this, we never found warning message in running test, also It could reduce process startup latency about 60-120ms in each case. For reference a call trace : Binder_1: page allocation failure: order:3, mode:0x10c0d0 CPU: 0 PID: 424 Comm: Binder_1 Tainted: GW 3.10.49-perf-g991d02b-dirty #20 Call trace: [] dump_backtrace+0x0/0x270 [] show_stack+0x10/0x1c [] dump_stack+0x1c/0x28 [] warn_alloc_failed+0xfc/0x11c [] __alloc_pages_nodemask+0x724/0x7f0 [] __get_free_pages+0x14/0x5c [] kmalloc_order_trace+0x38/0xd8 [] zcomp_lz4_create+0x2c/0x38 [] zcomp_strm_alloc+0x34/0x78 [] zcomp_strm_multi_find+0x124/0x1ec [] zcomp_strm_find+0xc/0x18 [] zram_bvec_rw+0x2fc/0x780 [] zram_make_request+0x25c/0x2d4 [] generic_make_request+0x80/0xbc [] submit_bio+0xa4/0x15c [] __swap_writepage+0x218/0x230 [] swap_writepage+0x3c/0x4c [] shrink_page_list+0x51c/0x8d0 [] shrink_inactive_list+0x3f8/0x60c [] shrink_lruvec+0x33c/0x4cc [] shrink_zone+0x3c/0x100 [] try_to_free_pages+0x2b8/0x54c [] __alloc_pages_nodemask+0x514/0x7f0 [] __get_free_pages+0x14/0x5c [] proc_info_read+0x50/0xe4 [] vfs_read+0xa0/0x12c [] SyS_read+0x44/0x74 DMA: 3397*4kB (MC) 26*8kB (RC) 0*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 13796kB Signed-off-by: Kyeongdon Kim --- drivers/block/zram/zcomp_lz4.c | 12 ++++++++++-- drivers/block/zram/zcomp_lzo.c | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/drivers/block/zram/zcomp_lz4.c b/drivers/block/zram/zcomp_lz4.c index f2afb7e..0cc4799 100644 --- a/drivers/block/zram/zcomp_lz4.c +++ b/drivers/block/zram/zcomp_lz4.c @@ -10,17 +10,25 @@ #include #include #include +#include +#include #include "zcomp_lz4.h" static void *zcomp_lz4_create(void) { - return kzalloc(LZ4_MEM_COMPRESS, GFP_KERNEL); + void *ret; + + ret = kzalloc(LZ4_MEM_COMPRESS, + __GFP_NORETRY|__GFP_NOWARN|__GFP_NOMEMALLOC); + if (!ret) + ret = vzalloc(LZ4_MEM_COMPRESS); + return ret; } static void zcomp_lz4_destroy(void *private) { - kfree(private); + kvfree(private); } static int zcomp_lz4_compress(const unsigned char *src, unsigned char *dst, diff --git a/drivers/block/zram/zcomp_lzo.c b/drivers/block/zram/zcomp_lzo.c index da1bc47..59b8aa4 100644 --- a/drivers/block/zram/zcomp_lzo.c +++ b/drivers/block/zram/zcomp_lzo.c @@ -10,17 +10,25 @@ #include #include #include +#include +#include #include "zcomp_lzo.h" static void *lzo_create(void) { - return kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); + void *ret; + + ret = kzalloc(LZO1X_MEM_COMPRESS, + __GFP_NORETRY|__GFP_NOWARN|__GFP_NOMEMALLOC); + if (!ret) + ret = vzalloc(LZO1X_MEM_COMPRESS); + return ret; } static void lzo_destroy(void *private) { - kfree(private); + kvfree(private); } static int lzo_compress(const unsigned char *src, unsigned char *dst, -- 1.8.2 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/