From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751319AbcAPJh2 (ORCPT ); Sat, 16 Jan 2016 04:37:28 -0500 Received: from mailout2.samsung.com ([203.254.224.25]:50090 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750808AbcAPJhZ (ORCPT ); Sat, 16 Jan 2016 04:37:25 -0500 X-AuditID: cbfee61b-f793c6d00000236c-15-569a0f52ec71 From: Chao Yu To: Jaegeuk Kim Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH 1/2] f2fs: flush dirty nat entries when exceeding threshold Date: Sat, 16 Jan 2016 17:36:40 +0800 Message-id: <017d01d15041$7fad3890$7f07a9b0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdFQPsSKrExsF3XVTTGYwwHTf8WE1g== Content-language: zh-cn X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrNLMWRmVeSWpSXmKPExsVy+t9jAd0g/llhBv8m6lk8WT+L2eLSIneL y7vmsDkwe2xa1cnmsXvBZyaPz5vkApijuGxSUnMyy1KL9O0SuDKO373MWPBDuKLj4QrmBsYF Al2MHBwSAiYSU15IdTFyApliEhfurWfrYuTiEBJYyijRsLubCcJ5xSjx7v4eRpAqNgEVieUd /5lAbBEg+9Ciy+wgNrOAh0Rjx3dWEFtYwFvi/esusDiLgKrE65Wv2EBsXgFLidlnZrNA2IIS PybfY4Ho1ZJYv/M4E4QtL7F5zVtmiIsUJHacfc0IsUtPYumP+6wQNeISG4/cYpnAKDALyahZ SEbNQjJqFpKWBYwsqxglUguSC4qT0nON8lLL9YoTc4tL89L1kvNzNzGCg/iZ9A7Gw7vcDzEK cDAq8fBucJwZJsSaWFZcmXuIUYKDWUmE9w/vrDAh3pTEyqrUovz4otKc1OJDjNIcLErivPsu RYYJCaQnlqRmp6YWpBbBZJk4OKUaGNflXvnO8XLP/bM6PWcqBL1P1oV8ctlwtUv7p86dU3Vq xS1PmWQfWChrnLX3mFr2uvHlKyObYh/3L2cv3vfrVnJecO0+66aU82dX2DrpHvj17iPPnLqX 1d/KVh3/cipRXSm27/m0tvmr7YtCuXJKrn30WvLG4cSnE+13A/TSEm0mJ1d7Ll///LgSS3FG oqEWc1FxIgCL2WMGXgIAAA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When testing f2fs with xfstest, generic/251 is stuck for long time, the case uses below serials to obtain fresh released space in device, in order to preparing for following fstrim test. 1. rm -rf /mnt/dir 2. mkdir /mnt/dir/ 3. cp -axT `pwd`/ /mnt/dir/ 4. goto 1 During preparing step, all nat entries will be cached in nat cache, most of them are dirty entries with invalid blkaddr, which means nodes related to these entries have been truncated, and they could be reused after the dirty entries been checkpointed. However, there was no checkpoint been triggered, so nid allocators (e.g. mkdir, creat) will run into long journey of iterating all NAT pages, looking for free nids in alloc_nid->build_free_nids. Here, we give another chance to f2fs_balance_fs_bg to do checkpoint to flush nat entries for reusing in free nid cache when dirty entry count exceeds 10% of max count. Signed-off-by: Chao Yu --- fs/f2fs/node.h | 8 ++++++++ fs/f2fs/segment.c | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h index d4d1f63..630c62d 100644 --- a/fs/f2fs/node.h +++ b/fs/f2fs/node.h @@ -25,6 +25,8 @@ /* control the memory footprint threshold (10MB per 1GB ram) */ #define DEF_RAM_THRESHOLD 10 +#define DEF_DIRTY_NAT_THRESHOLD 10 /* 10% over max nid */ + /* vector size for gang look-up from nat cache that consists of radix tree */ #define NATVEC_SIZE 64 #define SETVEC_SIZE 32 @@ -117,6 +119,12 @@ static inline void raw_nat_from_node_info(struct f2fs_nat_entry *raw_ne, raw_ne->version = ni->version; } +static inline bool excess_dirty_nats(struct f2fs_sb_info *sbi) +{ + return NM_I(sbi)->dirty_nat_cnt >= + NM_I(sbi)->max_nid * DEF_DIRTY_NAT_THRESHOLD / 100; +} + enum mem_type { FREE_NIDS, /* indicates the free nid list */ NAT_ENTRIES, /* indicates the cached nat entry */ diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 5904a41..68800e6 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -291,8 +291,9 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi) /* checkpoint is the only way to shrink partial cached entries */ if (!available_free_memory(sbi, NAT_ENTRIES) || - excess_prefree_segs(sbi) || !available_free_memory(sbi, INO_ENTRIES) || + excess_prefree_segs(sbi) || + excess_dirty_nats(sbi) || (is_idle(sbi) && f2fs_time_over(sbi, CP_TIME))) { if (test_opt(sbi, DATA_FLUSH)) sync_dirty_inodes(sbi, FILE_INODE); -- 2.6.3