>-----Original Message-----
>From: Jaegeuk Kim [mailto:[email protected]]
>Sent: Friday, November 10, 2017 2:05 AM
>To: heyunlei
>Cc: Yuchao (T); [email protected]; Wangbintian; Jianing
>(Euler)
>Subject: Re: [f2fs-dev][PATCH v5] f2fs: Separate nat entry mem alloc from
>nat_tree_locks
>
>On 11/07, Yunlei He wrote:
>> This path separate nat_entry mem alloc from nat_tree_lock,
>> which will benefit in some low mem case.
>>
>> Signed-off-by: Yunlei He <[email protected]>
>> ---
>> fs/f2fs/node.c | 56 +++++++++++++++++++++++++++++++++++++++-----------------
>> 1 file changed, 39 insertions(+), 17 deletions(-)
>>
>> diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
>> index fef5c68..c6aea33 100644
>> --- a/fs/f2fs/node.c
>> +++ b/fs/f2fs/node.c
>> @@ -257,22 +257,15 @@ static struct nat_entry *grab_nat_entry(struct
>> f2fs_nm_info *nm_i, nid_t nid,
>>
>> if (no_fail) {
>> new = f2fs_kmem_cache_alloc(nat_entry_slab, GFP_NOFS);
>> - f2fs_radix_tree_insert(&nm_i->nat_root, nid, new);
>> } else {
>> new = kmem_cache_alloc(nat_entry_slab, GFP_NOFS);
>> if (!new)
>> return NULL;
>> - if (radix_tree_insert(&nm_i->nat_root, nid, new)) {
>> - kmem_cache_free(nat_entry_slab, new);
>> - return NULL;
>> - }
>> }
>>
>> memset(new, 0, sizeof(struct nat_entry));
>> nat_set_nid(new, nid);
>> nat_reset_flag(new);
>> - list_add_tail(&new->list, &nm_i->nat_entries);
>> - nm_i->nat_cnt++;
>> return new;
>> }
>>
>> @@ -282,17 +275,32 @@ static void cache_nat_entry(struct f2fs_sb_info *sbi,
>> nid_t nid,
>> struct f2fs_nm_info *nm_i = NM_I(sbi);
>> struct nat_entry *e;
>>
>> +#ifdef CONFIG_F2FS_CHECK_FS
>> + down_read(&nm_i->nat_tree_lock);
>> e = __lookup_nat_cache(nm_i, nid);
>> - if (!e) {
>> - e = grab_nat_entry(nm_i, nid, false);
>> - if (e)
>> - node_info_from_raw_nat(&e->ni, ne);
>> - } else {
>> + if (unlikely(e)) {
>> f2fs_bug_on(sbi, nat_get_ino(e) != le32_to_cpu(ne->ino) ||
>> - nat_get_blkaddr(e) !=
>> - le32_to_cpu(ne->block_addr) ||
>> + nat_get_blkaddr(e) != le32_to_cpu(ne->block_addr) ||
>> nat_get_version(e) != ne->version);
>> + up_read(&nm_i->nat_tree_lock);
>> + return;
>> + }
>> + up_read(&nm_i->nat_tree_lock);
>> +#endif
>
>Please avoid #ifdef as much as possible, which is totally undesirable.
>BTW, it'd be better to give the mallocated e to grab_nat_entry() to consolidate
>initialization stuffs?
Do you mean that delete the found nat entry and use the new alloced one?
Thanks.
>
>> + e = grab_nat_entry(nm_i, nid, false);
>> + down_write(&nm_i->nat_tree_lock);
>> + if (!e)
>> + goto out;
>> +
>> + if (!radix_tree_insert(&nm_i->nat_root, nid, e)) {
>> + list_add_tail(&e->list, &nm_i->nat_entries);
>> + nm_i->nat_cnt++;
>> + node_info_from_raw_nat(&e->ni, ne);
>> + } else {
>> + kmem_cache_free(nat_entry_slab, e);
>> }
>> +out:
>> + up_write(&nm_i->nat_tree_lock);
>> }
>>
>> static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
>> @@ -300,11 +308,21 @@ static void set_node_addr(struct f2fs_sb_info *sbi,
>> struct node_info *ni,
>> {
>> struct f2fs_nm_info *nm_i = NM_I(sbi);
>> struct nat_entry *e;
>> + struct nat_entry *new = grab_nat_entry(nm_i, ni->nid, true);
>>
>> +retry:
>> down_write(&nm_i->nat_tree_lock);
>> e = __lookup_nat_cache(nm_i, ni->nid);
>> if (!e) {
>> - e = grab_nat_entry(nm_i, ni->nid, true);
>> + e = new;
>> + if (radix_tree_insert(&nm_i->nat_root, ni->nid, e)) {
>> + up_write(&nm_i->nat_tree_lock);
>> + cond_resched();
>> + goto retry;
>> + }
>> +
>> + list_add_tail(&e->list, &nm_i->nat_entries);
>> + nm_i->nat_cnt++;
>> copy_node_info(&e->ni, ni);
>> f2fs_bug_on(sbi, ni->blk_addr == NEW_ADDR);
>> } else if (new_blkaddr == NEW_ADDR) {
>> @@ -315,6 +333,9 @@ static void set_node_addr(struct f2fs_sb_info *sbi,
>> struct node_info *ni,
>> */
>> copy_node_info(&e->ni, ni);
>> f2fs_bug_on(sbi, ni->blk_addr != NULL_ADDR);
>> + kmem_cache_free(nat_entry_slab, new);
>> + } else {
>> + kmem_cache_free(nat_entry_slab, new);
>> }
>>
>> /* sanity check */
>> @@ -424,9 +445,7 @@ void get_node_info(struct f2fs_sb_info *sbi, nid_t nid,
>> struct node_info *ni)
>> f2fs_put_page(page, 1);
>> cache:
>> /* cache nat entry */
>> - down_write(&nm_i->nat_tree_lock);
>> cache_nat_entry(sbi, nid, &ne);
>> - up_write(&nm_i->nat_tree_lock);
>> }
>>
>> /*
>> @@ -2375,6 +2394,9 @@ static void remove_nats_in_journal(struct f2fs_sb_info
>> *sbi)
>> ne = __lookup_nat_cache(nm_i, nid);
>> if (!ne) {
>> ne = grab_nat_entry(nm_i, nid, true);
>> + f2fs_radix_tree_insert(&nm_i->nat_root, nid, ne);
>> + list_add_tail(&ne->list, &nm_i->nat_entries);
>> + nm_i->nat_cnt++;
>> node_info_from_raw_nat(&ne->ni, &raw_ne);
>> }
>>
>> --
>> 1.9.1
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel