Skip to content

Commit c85ef30

Browse files
chaseyupundiramit
authored andcommitted
f2fs: don't cache nat entry if out of memory
commit 5c9e418436f3445d7cc4f3ba2964f231a4b33f17 upstream. If we run out of memory, in cache_nat_entry, it's better to avoid loop for allocating memory to cache nat entry, so in low memory scenario, for read path of node block, I expect this can avoid unneeded latency. Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
1 parent cb1f89c commit c85ef30

1 file changed

Lines changed: 20 additions & 7 deletions

File tree

fs/f2fs/node.c

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -245,12 +245,24 @@ bool need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino)
245245
return need_update;
246246
}
247247

248-
static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid)
248+
static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid,
249+
bool no_fail)
249250
{
250251
struct nat_entry *new;
251252

252-
new = f2fs_kmem_cache_alloc(nat_entry_slab, GFP_NOFS);
253-
f2fs_radix_tree_insert(&nm_i->nat_root, nid, new);
253+
if (no_fail) {
254+
new = f2fs_kmem_cache_alloc(nat_entry_slab, GFP_NOFS);
255+
f2fs_radix_tree_insert(&nm_i->nat_root, nid, new);
256+
} else {
257+
new = kmem_cache_alloc(nat_entry_slab, GFP_NOFS);
258+
if (!new)
259+
return NULL;
260+
if (radix_tree_insert(&nm_i->nat_root, nid, new)) {
261+
kmem_cache_free(nat_entry_slab, new);
262+
return NULL;
263+
}
264+
}
265+
254266
memset(new, 0, sizeof(struct nat_entry));
255267
nat_set_nid(new, nid);
256268
nat_reset_flag(new);
@@ -267,8 +279,9 @@ static void cache_nat_entry(struct f2fs_sb_info *sbi, nid_t nid,
267279

268280
e = __lookup_nat_cache(nm_i, nid);
269281
if (!e) {
270-
e = grab_nat_entry(nm_i, nid);
271-
node_info_from_raw_nat(&e->ni, ne);
282+
e = grab_nat_entry(nm_i, nid, false);
283+
if (e)
284+
node_info_from_raw_nat(&e->ni, ne);
272285
} else {
273286
f2fs_bug_on(sbi, nat_get_ino(e) != le32_to_cpu(ne->ino) ||
274287
nat_get_blkaddr(e) !=
@@ -286,7 +299,7 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
286299
down_write(&nm_i->nat_tree_lock);
287300
e = __lookup_nat_cache(nm_i, ni->nid);
288301
if (!e) {
289-
e = grab_nat_entry(nm_i, ni->nid);
302+
e = grab_nat_entry(nm_i, ni->nid, true);
290303
copy_node_info(&e->ni, ni);
291304
f2fs_bug_on(sbi, ni->blk_addr == NEW_ADDR);
292305
} else if (new_blkaddr == NEW_ADDR) {
@@ -2155,7 +2168,7 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
21552168

21562169
ne = __lookup_nat_cache(nm_i, nid);
21572170
if (!ne) {
2158-
ne = grab_nat_entry(nm_i, nid);
2171+
ne = grab_nat_entry(nm_i, nid, true);
21592172
node_info_from_raw_nat(&ne->ni, &raw_ne);
21602173
}
21612174

0 commit comments

Comments
 (0)