Received: by 10.223.164.202 with SMTP id h10csp1230131wrb; Sun, 26 Nov 2017 22:56:46 -0800 (PST) X-Google-Smtp-Source: AGs4zMb/hUNz5lixWTIJ9Rv1CiRWHJVaMg9Gy7qr8PsPKKvFUnGmnG2AzxI1O5exYt2lsU6qjaXX X-Received: by 10.98.66.196 with SMTP id h65mr29961487pfd.172.1511765806105; Sun, 26 Nov 2017 22:56:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511765806; cv=none; d=google.com; s=arc-20160816; b=MFqVYhOgNALJSgtGzE5VR3n7BBTUKywYQPnttoaF1uOwZ/gohf/BOpZd/LG662ekVd nTlKCOXxDi2s4N88BoTgQksxrYBkZFr6TQQ17477iLiQM2rETMbRU+C1A+85ejtraSJ/ BBi+KQNbJjbEr5E4vblqC7WwFIR4L9XISV+M2DM+93Baa7BwEkw0E3zNQBGsnKiKeRAE UsDs38bJzzahBnP0+UvADVZYSP+SplMt5tt9Jj2pRku5kyMyMJmEnbFPEdbmS7xVQB5A HthEGMDNoW1KBonKMNsAB98QHsflAaDrZK6dg49mPo2UmqY4/Qw8fpVTMkdNLW7L1VKf 721A== 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:arc-authentication-results; bh=SsXKIdGPBhbKnGRcTGVPNRJf5Zg5d2p7QTjfPjEjJd4=; b=oqO1jSXpsZUYKlu+oWitNRtqX2gy/3+aFeucfg34l66vvl+qvOdanvg0lGGTDMdM6C i9QFvIdLBiBvMkcd+va9G1+y2gQsy/WuGwBFXEHCRB7RrbEPZIqJHX6WUewJaKJ0QBQv gOFkMQx5QSH+u267IfkwgxBXnrxkFLeuCMAiphusOXUWispE63pnSM0d7oA7qcZK8LOr /vIe19vXBblfKXi8pyHVOnIIsdoQ3RcInFMyKXhoGANmHHRuowvXB7u4iw3+H8vbDJgd eKwGB+vSJrF+Z/viMeUBbOvHQQP2JmILrn/RCfLt8n3AuHGozrAkWBxgVcU0G7m6f582 0gFg== 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 f14si19844109pln.364.2017.11.26.22.56.34; Sun, 26 Nov 2017 22:56:46 -0800 (PST) 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 S1752006AbdK0GzV (ORCPT + 78 others); Mon, 27 Nov 2017 01:55:21 -0500 Received: from szxga04-in.huawei.com ([45.249.212.190]:2172 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751337AbdK0GzT (ORCPT ); Mon, 27 Nov 2017 01:55:19 -0500 Received: from DGGEMS406-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 2894B5C7C231; Mon, 27 Nov 2017 14:55:13 +0800 (CST) Received: from huawei.com (10.107.193.250) by DGGEMS406-HUB.china.huawei.com (10.3.19.206) with Microsoft SMTP Server id 14.3.361.1; Mon, 27 Nov 2017 14:55:05 +0800 From: Yunlong Song To: , , , , CC: , , , , Subject: [PATCH] f2fs: avoid false positive of free secs check Date: Mon, 27 Nov 2017 14:54:59 +0800 Message-ID: <1511765699-47553-1-git-send-email-yunlong.song@huawei.com> X-Mailer: git-send-email 1.8.5.2 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.193.250] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Sometimes f2fs_gc is called with no target victim (e.g. xfstest generic/027, ndirty_node:545 ndiry_dent:1 ndirty_imeta:513 rsvd_segs:21 free_segs:27, has_not_enough_free_secs will return true). This patch first merges pages and then converts into sections. Signed-off-by: Yunlong Song --- fs/f2fs/f2fs.h | 9 --------- fs/f2fs/segment.c | 12 +++++++----- fs/f2fs/segment.h | 13 +++++++++---- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index ca6b0c9..e89cff7 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1675,15 +1675,6 @@ static inline int get_dirty_pages(struct inode *inode) return atomic_read(&F2FS_I(inode)->dirty_pages); } -static inline int get_blocktype_secs(struct f2fs_sb_info *sbi, int block_type) -{ - unsigned int pages_per_sec = sbi->segs_per_sec * sbi->blocks_per_seg; - unsigned int segs = (get_pages(sbi, block_type) + pages_per_sec - 1) >> - sbi->log_blocks_per_seg; - - return segs / sbi->segs_per_sec; -} - static inline block_t valid_user_blocks(struct f2fs_sb_info *sbi) { return sbi->total_valid_block_count; diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index c117e09..603f805 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -171,17 +171,19 @@ static unsigned long __find_rev_next_zero_bit(const unsigned long *addr, bool need_SSR(struct f2fs_sb_info *sbi) { - int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES); - int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS); - int imeta_secs = get_blocktype_secs(sbi, F2FS_DIRTY_IMETA); + s64 node_pages = get_pages(sbi, F2FS_DIRTY_NODES); + s64 dent_pages = get_pages(sbi, F2FS_DIRTY_DENTS); + s64 imeta_pages = get_pages(sbi, F2FS_DIRTY_IMETA); if (test_opt(sbi, LFS)) return false; if (sbi->gc_thread && sbi->gc_thread->gc_urgent) return true; - return free_sections(sbi) <= (node_secs + 2 * dent_secs + imeta_secs + - SM_I(sbi)->min_ssr_sections + reserved_sections(sbi)); + return free_sections(sbi) <= + (PAGE2SEC(sbi, node_pages + imeta_pages) + + PAGE2SEC(sbi, 2 * dent_pages) + + SM_I(sbi)->min_ssr_sections + reserved_sections(sbi)); } void register_inmem_page(struct inode *inode, struct page *page) diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index d1d394c..723d79e 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h @@ -115,6 +115,10 @@ #define SECTOR_TO_BLOCK(sectors) \ ((sectors) >> F2FS_LOG_SECTORS_PER_BLOCK) +#define PAGE2SEC(sbi, pages) \ + ((((pages) + BLKS_PER_SEC(sbi) - 1) \ + >> sbi->log_blocks_per_seg) / sbi->segs_per_sec) + /* * indicate a block allocation direction: RIGHT and LEFT. * RIGHT means allocating new sections towards the end of volume. @@ -527,9 +531,9 @@ static inline bool has_curseg_enough_space(struct f2fs_sb_info *sbi) static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi, int freed, int needed) { - int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES); - int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS); - int imeta_secs = get_blocktype_secs(sbi, F2FS_DIRTY_IMETA); + s64 node_pages = get_pages(sbi, F2FS_DIRTY_NODES); + s64 dent_pages = get_pages(sbi, F2FS_DIRTY_DENTS); + s64 imeta_pages = get_pages(sbi, F2FS_DIRTY_IMETA); if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) return false; @@ -538,7 +542,8 @@ static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi, has_curseg_enough_space(sbi)) return false; return (free_sections(sbi) + freed) <= - (node_secs + 2 * dent_secs + imeta_secs + + (PAGE2SEC(sbi, node_pages + imeta_pages) + + PAGE2SEC(sbi, 2 * dent_pages) + reserved_sections(sbi) + needed); } -- 1.8.5.2 From 1585470908314765136@xxx Thu Nov 30 06:21:24 +0000 2017 X-GM-THRID: 1585267341347902132 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread