Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755742AbbGEIxG (ORCPT ); Sun, 5 Jul 2015 04:53:06 -0400 Received: from mail.kernel.org ([198.145.29.136]:35075 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752851AbbGEIwz (ORCPT ); Sun, 5 Jul 2015 04:52:55 -0400 Date: Sat, 4 Jul 2015 00:03:53 -0700 From: Jaegeuk Kim To: Chao Yu Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Subject: Re: [PATCH] f2fs: reduce lock overhead of extent node releasing Message-ID: <20150704070353.GE15817@jaegeuk-mac02.hsd1.ca.comcast.net> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2358 Lines: 74 On Thu, Jul 02, 2015 at 08:40:12PM +0800, Chao Yu wrote: > >From e5c6600d01c4462c4e1ee0c70ec1d9319862077d Mon Sep 17 00:00:00 2001 > From: Chao Yu > Date: Thu, 2 Jul 2015 18:52:46 +0800 > Subject: [PATCH] f2fs: reduce lock overhead of extent node releasing > > Open and close critical section for each extent node when traversing rb-tree > results in high overhead of cpu, slows thing down. > > This patch alternates to batch mode for removing extent nodes under spin lock. > > Signed-off-by: Chao Yu > --- > fs/f2fs/data.c | 28 ++++++++++++++++++++-------- > 1 file changed, 20 insertions(+), 8 deletions(-) > > diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c > index 6a706dd..7fb56a0 100644 > --- a/fs/f2fs/data.c > +++ b/fs/f2fs/data.c > @@ -441,19 +441,31 @@ static unsigned int __free_extent_tree(struct f2fs_sb_info *sbi, > struct extent_node *en; > unsigned int count = et->count; > > - node = rb_first(&et->root); > - while (node) { > - next = rb_next(node); > - en = rb_entry(node, struct extent_node, rb_node); > + if (!et->count) > + return 0; > + > + /* 1. remove all extent nodes in global lru list */ > + if (free_all) { > + spin_lock(&sbi->extent_lock); > + node = rb_first(&et->root); > + while (node) { > + next = rb_next(node); > + en = rb_entry(node, struct extent_node, rb_node); > > - if (free_all) { > - spin_lock(&sbi->extent_lock); > if (!list_empty(&en->list)) > list_del_init(&en->list); > - spin_unlock(&sbi->extent_lock); > + node = next; > } > + spin_unlock(&sbi->extent_lock); > + } > + > + /* 2. release all extent nodes which are not in global lru list */ Hmm, Is there any overhead to traverse the rb_tree twice and any spin_lock delay caused by contention? Thanks, > + node = rb_first(&et->root); > + while (node) { > + next = rb_next(node); > + en = rb_entry(node, struct extent_node, rb_node); > > - if (free_all || list_empty(&en->list)) { > + if (list_empty(&en->list)) { > __detach_extent_node(sbi, et, en); > kmem_cache_free(extent_node_slab, en); > } > -- > 2.4.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/