Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp11858720ybi; Fri, 26 Jul 2019 00:44:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqzJsQ1U3ZilSzCdTv1WqPEzDzkEg2zh/Q/n5zLixAIfBb8ZWd/4O5Yxmo8wnoRY9jvWiYa+ X-Received: by 2002:a17:90a:33c4:: with SMTP id n62mr99294573pjb.28.1564127043815; Fri, 26 Jul 2019 00:44:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564127043; cv=none; d=google.com; s=arc-20160816; b=BS+HTBVQF3IDpcwyFxBiOyHFrJuqaoIcMsJSxRj68Wa3cXQidJLAXxr976EkOaUqW8 yvmnWKn2S2zBmZ16kyTZBbcZ1ZvLKcu/29pZ5fjk2YjGYIDRyJBTzqjp3Pa4BxwFRrR0 7joYPse7CnMkB+fU/V4raY8ARPe5YhJTypEsSR83XGzXCGg2SEKoWfAWzRaFYYDUe+z7 8CaxaJI2oWye61UyXDuEX/omATXUF4rPVBwsYBv4DyEKs/Zwn+c3a/U/AZ3/l2OcrcCR 3583jy/YgSbyYXn+KmanyH1WupKCI846DNBDM3vnjR9ZDCSnUQyZMR0UG00Sbob/5v+o /MDg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from; bh=FLA3h3Kxu4OhOmR3sgfeBhghxR1J5jOG+eTa5YOeqwA=; b=Ouc1ijFW4aL1o7sR5EZE7itHqCpHxoBLT9KZWM0snpUNxphxwErGQIRnTyYf2e+NId SaHdtZwY0vTCMsQBrzBPXiSII3Yyd3RlRM5UCP+u0dQ96GwIDBLmmNshDQFpJbjLW9ds 3DJ7bHo8cOBhcWcCNyCZtOB5aORfQGwEe9Oq4b3X3uP45RLuw/8qagEDG4/7T/ooTXhH msZDEb6QDpdoak7jwwAqbB3CgVEUldID//qEcebwQ9AiCwYpng+5FQ9Tf39OF7pmzsNp cAr/VKX/C8MToJtsxAQXS73Fp+7dv9RJeVBMSimz8jtO1W668dSUQDSbJM7ZyvjfICha JslQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w10si20140857pgt.451.2019.07.26.00.43.48; Fri, 26 Jul 2019 00:44:03 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726256AbfGZHlc (ORCPT + 99 others); Fri, 26 Jul 2019 03:41:32 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:2766 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725867AbfGZHlc (ORCPT ); Fri, 26 Jul 2019 03:41:32 -0400 Received: from DGGEMS403-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id CEFB2AD5269EB315813C; Fri, 26 Jul 2019 15:41:30 +0800 (CST) Received: from szvp000203569.huawei.com (10.120.216.130) by DGGEMS403-HUB.china.huawei.com (10.3.19.203) with Microsoft SMTP Server id 14.3.439.0; Fri, 26 Jul 2019 15:41:23 +0800 From: Chao Yu To: CC: , , , Chao Yu , Chen Gong Subject: [PATCH v2] f2fs: allocate memory in batch in build_sit_info() Date: Fri, 26 Jul 2019 15:41:20 +0800 Message-ID: <20190726074120.3278-1-yuchao0@huawei.com> X-Mailer: git-send-email 2.18.0.rc1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.120.216.130] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org build_sit_info() allocate all bitmaps for each segment one by one, it's quite low efficiency, this pach changes to allocate large continuous memory at a time, and divide it and assign for each bitmaps of segment. For large size image, it can expect improving its mount speed. Signed-off-by: Chen Gong Signed-off-by: Chao Yu --- v2: - fix warning triggered in kmalloc() if requested memory size exceeds 4MB. fs/f2fs/segment.c | 51 +++++++++++++++++++++-------------------------- fs/f2fs/segment.h | 1 + 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index a661ac32e829..d720eacd9c57 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -3941,7 +3941,7 @@ static int build_sit_info(struct f2fs_sb_info *sbi) struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); struct sit_info *sit_i; unsigned int sit_segs, start; - char *src_bitmap; + char *src_bitmap, *bitmap; unsigned int bitmap_size; /* allocate memory for SIT information */ @@ -3964,27 +3964,31 @@ static int build_sit_info(struct f2fs_sb_info *sbi) if (!sit_i->dirty_sentries_bitmap) return -ENOMEM; +#ifdef CONFIG_F2FS_CHECK_FS + bitmap_size = MAIN_SEGS(sbi) * SIT_VBLOCK_MAP_SIZE * 4; +#else + bitmap_size = MAIN_SEGS(sbi) * SIT_VBLOCK_MAP_SIZE * 3; +#endif + sit_i->bitmap = f2fs_kvzalloc(sbi, bitmap_size, GFP_KERNEL); + if (!sit_i->bitmap) + return -ENOMEM; + + bitmap = sit_i->bitmap; + for (start = 0; start < MAIN_SEGS(sbi); start++) { - sit_i->sentries[start].cur_valid_map - = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); - sit_i->sentries[start].ckpt_valid_map - = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); - if (!sit_i->sentries[start].cur_valid_map || - !sit_i->sentries[start].ckpt_valid_map) - return -ENOMEM; + sit_i->sentries[start].cur_valid_map = bitmap; + bitmap += SIT_VBLOCK_MAP_SIZE; + + sit_i->sentries[start].ckpt_valid_map = bitmap; + bitmap += SIT_VBLOCK_MAP_SIZE; #ifdef CONFIG_F2FS_CHECK_FS - sit_i->sentries[start].cur_valid_map_mir - = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); - if (!sit_i->sentries[start].cur_valid_map_mir) - return -ENOMEM; + sit_i->sentries[start].cur_valid_map_mir = bitmap; + bitmap += SIT_VBLOCK_MAP_SIZE; #endif - sit_i->sentries[start].discard_map - = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, - GFP_KERNEL); - if (!sit_i->sentries[start].discard_map) - return -ENOMEM; + sit_i->sentries[start].discard_map = bitmap; + bitmap += SIT_VBLOCK_MAP_SIZE; } sit_i->tmp_map = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); @@ -4492,21 +4496,12 @@ static void destroy_free_segmap(struct f2fs_sb_info *sbi) static void destroy_sit_info(struct f2fs_sb_info *sbi) { struct sit_info *sit_i = SIT_I(sbi); - unsigned int start; if (!sit_i) return; - if (sit_i->sentries) { - for (start = 0; start < MAIN_SEGS(sbi); start++) { - kvfree(sit_i->sentries[start].cur_valid_map); -#ifdef CONFIG_F2FS_CHECK_FS - kvfree(sit_i->sentries[start].cur_valid_map_mir); -#endif - kvfree(sit_i->sentries[start].ckpt_valid_map); - kvfree(sit_i->sentries[start].discard_map); - } - } + if (sit_i->sentries) + kvfree(sit_i->bitmap); kvfree(sit_i->tmp_map); kvfree(sit_i->sentries); diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index b74602813a05..ec4d568fd58c 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h @@ -226,6 +226,7 @@ struct sit_info { block_t sit_base_addr; /* start block address of SIT area */ block_t sit_blocks; /* # of blocks used by SIT area */ block_t written_valid_blocks; /* # of valid blocks in main area */ + char *bitmap; /* all bitmaps pointer */ char *sit_bitmap; /* SIT bitmap pointer */ #ifdef CONFIG_F2FS_CHECK_FS char *sit_bitmap_mir; /* SIT bitmap mirror */ -- 2.18.0.rc1