From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751664AbcBNKyQ (ORCPT ); Sun, 14 Feb 2016 05:54:16 -0500 Received: from mailout2.samsung.com ([203.254.224.25]:45648 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751288AbcBNKyO (ORCPT ); Sun, 14 Feb 2016 05:54:14 -0500 X-AuditID: cbfee61a-f79266d000003652-00-56c05cd5b75c From: Chao Yu To: Jaegeuk Kim Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH 3/7] f2fs: reorder nat cache lock in cache_nat_entry Date: Sun, 14 Feb 2016 18:53:33 +0800 Message-id: <00fc01d16716$0a657de0$1f3079a0$@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: AdFnFe64SukfXQ8PRKip9LOkwOXGjg== Content-language: zh-cn X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrNLMWRmVeSWpSXmKPExsVy+t9jAd2rMQfCDA53i1k8WT+L2eLSIneL y7vmsDkwe2xa1cnmsXvBZyaPz5vkApijuGxSUnMyy1KL9O0SuDLuHz7PUnBZpKLjV1gD4z2B LkZODgkBE4k9HTPZIWwxiQv31rN1MXJxCAksZZSY8fopM4TzilHi/dUHTCBVbAIqEss7/oPZ IkD2oUWXwbqZBTwkGju+s4LYwgIuEtdePQSrYRFQldix8CVYnFfAUuLZ4hYoW1Dix+R7LBC9 WhKbtzWxQtjyEpvXvGWGuEhBYsfZ14wQu/QkPk9pZIaoEZfYeOQWywRGgVlIRs1CMmoWklGz kLQsYGRZxSiRWpBcUJyUnmuYl1quV5yYW1yal66XnJ+7iREcxM+kdjAe3OV+iFGAg1GJh3fH yv1hQqyJZcWVuYcYJTiYlUR4HaIPhAnxpiRWVqUW5ccXleakFh9ilOZgURLnffx/XZiQQHpi SWp2ampBahFMlomDU6qBcXdfh9HEtaz6GUyTlBbWPFV88cl05f6OHvfdgt+XHX8XxSP0+Kv4 xtCldzgeXPE8tsF9b0TTzTqv4F2HTeT2L+RkTrdSnr706VrRVQ8W61/6tLh+ypzU6bq9CsJH tnvXqP7JEvr06cSJ+EdX5z5KO54zf8k+9pefroSf3l9VqHpw0uM7AfE/5t9SYinOSDTUYi4q TgQASJhogl4CAAA= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In cache_nat_entry, if we fail to hit nat cache, we try to load nat entries from journal of current segment cache or NAT pages for updating, during the whole updating process, write lock of nat_tree_lock will be held to avoid inconsistent condition. But this way may cause low efficient when updating nat cache, because it serializes accessing in journal cache or reading NAT pages. Here, we reorder lock and update flow like below: - get_node_info - down_read(nat_tree_lock) - lookup nat cache --- hit -> unlock & return - lookup journal cache --- hit -> unlock & goto update - up_read(nat_tree_lock) update: - down_write(nat_tree_lock) - cache_nat_entry - lookup nat cache --- nohit -> update - up_write(nat_tree_lock) Signed-off-by: Chao Yu --- fs/f2fs/node.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 94b8016..966176b 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -257,15 +257,20 @@ static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid) return new; } -static void cache_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid, +static void cache_nat_entry(struct f2fs_sb_info *sbi, nid_t nid, struct f2fs_nat_entry *ne) { + struct f2fs_nm_info *nm_i = NM_I(sbi); struct nat_entry *e; e = __lookup_nat_cache(nm_i, nid); if (!e) { e = grab_nat_entry(nm_i, nid); node_info_from_raw_nat(&e->ni, ne); + } else { + f2fs_bug_on(sbi, nat_get_ino(e) != ne->ino || + nat_get_blkaddr(e) != ne->block_addr || + nat_get_version(e) != ne->version); } } @@ -371,15 +376,12 @@ void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, struct node_info *ni) ni->ino = nat_get_ino(e); ni->blk_addr = nat_get_blkaddr(e); ni->version = nat_get_version(e); - } - up_read(&nm_i->nat_tree_lock); - if (e) + up_read(&nm_i->nat_tree_lock); return; + } memset(&ne, 0, sizeof(struct f2fs_nat_entry)); - down_write(&nm_i->nat_tree_lock); - /* Check current segment summary */ down_read(&curseg->journal_rwsem); i = lookup_journal_in_cursum(journal, NAT_JOURNAL, nid, 0); @@ -398,8 +400,10 @@ void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, struct node_info *ni) node_info_from_raw_nat(ni, &ne); f2fs_put_page(page, 1); cache: + up_read(&nm_i->nat_tree_lock); /* cache nat entry */ - cache_nat_entry(NM_I(sbi), nid, &ne); + down_write(&nm_i->nat_tree_lock); + cache_nat_entry(sbi, nid, &ne); up_write(&nm_i->nat_tree_lock); } -- 2.7.0.2.g1b0b6dd