From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751283AbdJ1LEG (ORCPT ); Sat, 28 Oct 2017 07:04:06 -0400 Received: from mailout4.samsung.com ([203.254.224.34]:41932 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751000AbdJ1LEE (ORCPT ); Sat, 28 Oct 2017 07:04:04 -0400 DKIM-Filter: OpenDKIM Filter v2.11.0 mailout4.samsung.com 20171028110401epoutp04da05a038233e744dbfa8d9903f0aa094~xtxLiW6YT1621416214epoutp04f X-AuditID: b6c32a37-f0bff70000001049-99-59f464201147 From: Fan Li To: "'Chao Yu'" , jaegeuk@kernel.org Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Subject: [f2fs-dev] [PATCH] f2fs: add a function to move nid Date: Sat, 28 Oct 2017 19:03:37 +0800 Message-id: <000001d34fdc$7d461260$77d23720$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset="Windows-1252" Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Content-language: en-us Thread-index: AdNP3D75Bk43+IaxTcuyrj0o9H62sw== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrFIsWRmVeSWpSXmKPExsWy7bCmnq5CypdIg+fzdS2erJ/FbHFpkbvF 5V1z2CymPl7L6sDi0XLkLavHplWdbB67F3xm8vi8SS6AJYrLJiU1J7MstUjfLoErY9PfOUwF Z1UrnkxOa2D8L9fFyMkhIWAice7wLuYuRi4OIYEdjBK3fzQyQTjfGSW+bXzKAlPVNLmbBSKx m1Hi8u97YAkhgVeMEut+m4DYbALqEltmdjOB2CICZhJnTs8HquHgYBbwkNh1rBQkLCxgI/Fm 61NGEJtFQFXi6PwLYOW8ApYS32YsZ4SwBSV+TIYYzyxgIPH61xJ2CFteYvOat8wQ9yhI7Dj7 mhEiLi4x6cFDdpBVIgJ6Ei2rY0DOlBBYwCbRcekmI0S9i8SiD0fYIGxhiVfHt4DVSwhIS1w6 agsRXsco8fmMBUTvdkaJeR8/MkEkrIH2/oK6gU/i3dceVoheXomONiGIEg+J71PaoU5zlNj4 6Ag7JHRiJX6s+cs4gVFuFpLPZiH5bBaSz2Yh+WYBI8sqRrHUguLc9NRiwwJjveLE3OLSvHS9 5PzcTYzgFKFlvoNxwzmfQ4wCHIxKPLwSuZ8jhVgTy4orcw8xSnAwK4nwXvT5EinEm5JYWZVa lB9fVJqTWnyIUZqDRUmcV2z9tQghgfTEktTs1NSC1CKYLBMHp1QDo1xv+NRpjw4HbHqkP+Ur c878J1UPVVi4p2WYF3RvODc7oGK244qk/uPWW1Mmqmde3XXtyaROH9EXd0rajotlduX96Z7o xmBoMav/+9nDPB2zOv1ZlqZPVv3wKXlbz7G6x+XTn7NMVt29TbbUItL44NrXtipT7Xn0uxbF 5B/RYtE53T575U6jdUosxRmJhlrMRcWJAAJTdIANAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrBLMWRmVeSWpSXmKPExsVy+t9jAV2FlC+RBh+Oc1g8WT+L2eLSIneL y7vmsFlMfbyW1YHFo+XIW1aPTas62Tx2L/jM5PF5k1wASxSXTUpqTmZZapG+XQJXxqa/c5gK zqpWPJmc1sD4X66LkZNDQsBEomlyN0sXIxeHkMBORon1G9ZDOa8YJT43PWEFqWITUJfYMrOb CcQWETCTOHN6PlARBwezgIfErmOlIGFhARuJN1ufMoLYLAKqEkfnXwAr5xWwlPg2YzkjhC0o 8WPyPRYQm1lAT+Ljn9uMELa8xOY1b5khDlKQ2HH2NVRcXGLSg4fsIKtEgOpbVsdMYOSfhWTS LCSTZiGZNAtJ9wJGllWMkqkFxbnpucVGBYZ5qeV6xYm5xaV56XrJ+bmbGIHhu+2wVt8OxvtL 4g8xCnAwKvHwSuR+jhRiTSwrrsw9xCjBwawkwnvR50ukEG9KYmVValF+fFFpTmrxIUZpDhYl cd7beccihQTSE0tSs1NTC1KLYLJMHJxSDYwGm9Jr/37dd5bp5sWKt8+UbuUvqopKmxw0wfhn g4W6ob/15ptv961Omabw0sV4kdUe52c+FzfaBSw/lx11vnyC3pnaTr5N9sqHekvNRH7JOLtc viHxfruwWFFjucTrsIV/n/lfPS31sSUl4ofPt9PXz2YsmWy42Ed6hnNQp+/SqT3hQdVCXxcp sRRnJBpqMRcVJwIADt0ujFsCAAA= X-CMS-MailID: 20171028110400epcas1p2cd8fd0105884f449b5116b1ee9cf6092 X-Msg-Generator: CA CMS-TYPE: 101P X-CMS-RootMailID: 20171028110400epcas1p2cd8fd0105884f449b5116b1ee9cf6092 X-RootMTR: 20171028110400epcas1p2cd8fd0105884f449b5116b1ee9cf6092 References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch add a new function to move nid from one state to another. Move operation is heavily used, by adding a new function for it we can cut down some branches from several flow. Signed-off-by: Fan li --- fs/f2fs/node.c | 51 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index ac629d6..8116b50 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -1763,15 +1763,13 @@ static struct free_nid *__lookup_free_nid_list(struct f2fs_nm_info *nm_i, } static int __insert_free_nid(struct f2fs_sb_info *sbi, - struct free_nid *i, enum nid_state state, bool new) + struct free_nid *i, enum nid_state state) { struct f2fs_nm_info *nm_i = NM_I(sbi); - if (new) { - int err = radix_tree_insert(&nm_i->free_nid_root, i->nid, i); - if (err) - return err; - } + int err = radix_tree_insert(&nm_i->free_nid_root, i->nid, i); + if (err) + return err; f2fs_bug_on(sbi, state != i->state); nm_i->nid_cnt[state]++; @@ -1781,7 +1779,7 @@ static int __insert_free_nid(struct f2fs_sb_info *sbi, } static void __remove_free_nid(struct f2fs_sb_info *sbi, - struct free_nid *i, enum nid_state state, bool reuse) + struct free_nid *i, enum nid_state state) { struct f2fs_nm_info *nm_i = NM_I(sbi); @@ -1789,8 +1787,23 @@ static void __remove_free_nid(struct f2fs_sb_info *sbi, nm_i->nid_cnt[state]--; if (state == FREE_NID) list_del(&i->list); - if (!reuse) - radix_tree_delete(&nm_i->free_nid_root, i->nid); + radix_tree_delete(&nm_i->free_nid_root, i->nid); +} + +static void __move_free_nid(struct f2fs_sb_info *sbi, struct free_nid *i, + enum nid_state org_state, enum nid_state dst_state) +{ + struct f2fs_nm_info *nm_i = NM_I(sbi); + + f2fs_bug_on(sbi, org_state != i->state); + i->state = dst_state; + nm_i->nid_cnt[org_state]--; + nm_i->nid_cnt[dst_state]++; + + if (org_state == FREE_NID) + list_del(&i->list); + else if (dst_state == FREE_NID) + list_add_tail(&i->list, &nm_i->free_nid_list); } /* return if the nid is recognized as free */ @@ -1850,7 +1863,7 @@ static bool add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) } } ret = true; - err = __insert_free_nid(sbi, i, FREE_NID, true); + err = __insert_free_nid(sbi, i, FREE_NID); err_out: spin_unlock(&nm_i->nid_list_lock); radix_tree_preload_end(); @@ -1869,7 +1882,7 @@ static void remove_free_nid(struct f2fs_sb_info *sbi, nid_t nid) spin_lock(&nm_i->nid_list_lock); i = __lookup_free_nid_list(nm_i, nid); if (i && i->state == FREE_NID) { - __remove_free_nid(sbi, i, FREE_NID, false); + __remove_free_nid(sbi, i, FREE_NID); need_free = true; } spin_unlock(&nm_i->nid_list_lock); @@ -2080,9 +2093,7 @@ bool alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid) struct free_nid, list); *nid = i->nid; - __remove_free_nid(sbi, i, FREE_NID, true); - i->state = PREALLOC_NID; - __insert_free_nid(sbi, i, PREALLOC_NID, false); + __move_free_nid(sbi, i, FREE_NID, PREALLOC_NID); nm_i->available_nids--; update_free_nid_bitmap(sbi, *nid, false, false); @@ -2108,7 +2119,7 @@ void alloc_nid_done(struct f2fs_sb_info *sbi, nid_t nid) spin_lock(&nm_i->nid_list_lock); i = __lookup_free_nid_list(nm_i, nid); f2fs_bug_on(sbi, !i); - __remove_free_nid(sbi, i, PREALLOC_NID, false); + __remove_free_nid(sbi, i, PREALLOC_NID); spin_unlock(&nm_i->nid_list_lock); kmem_cache_free(free_nid_slab, i); @@ -2131,12 +2142,10 @@ void alloc_nid_failed(struct f2fs_sb_info *sbi, nid_t nid) f2fs_bug_on(sbi, !i); if (!available_free_memory(sbi, FREE_NIDS)) { - __remove_free_nid(sbi, i, PREALLOC_NID, false); + __remove_free_nid(sbi, i, PREALLOC_NID); need_free = true; } else { - __remove_free_nid(sbi, i, PREALLOC_NID, true); - i->state = FREE_NID; - __insert_free_nid(sbi, i, FREE_NID, false); + __move_free_nid(sbi, i, PREALLOC_NID, FREE_NID); } nm_i->available_nids++; @@ -2167,7 +2176,7 @@ int try_to_free_nids(struct f2fs_sb_info *sbi, int nr_shrink) nm_i->nid_cnt[FREE_NID] <= MAX_FREE_NIDS) break; - __remove_free_nid(sbi, i, FREE_NID, false); + __remove_free_nid(sbi, i, FREE_NID); kmem_cache_free(free_nid_slab, i); nr_shrink--; } @@ -2746,7 +2755,7 @@ void destroy_node_manager(struct f2fs_sb_info *sbi) /* destroy free nid list */ spin_lock(&nm_i->nid_list_lock); list_for_each_entry_safe(i, next_i, &nm_i->free_nid_list, list) { - __remove_free_nid(sbi, i, FREE_NID, false); + __remove_free_nid(sbi, i, FREE_NID); spin_unlock(&nm_i->nid_list_lock); kmem_cache_free(free_nid_slab, i); spin_lock(&nm_i->nid_list_lock); -- 2.7.4