Skip to content

Commit

Permalink
jbd2: get rid of open coded allocation retry loop
Browse files Browse the repository at this point in the history
insert_revoke_hash does an open coded endless allocation loop if
journal_oom_retry is true. It doesn't implement any allocation fallback
strategy between the retries, though. The memory allocator doesn't know
about the never fail requirement so it cannot potentially help to move
on with the allocation (e.g. use memory reserves).

Get rid of the retry loop and use __GFP_NOFAIL instead. We will lose the
debugging message but I am not sure it is anyhow helpful.

Do the same for journal_alloc_journal_head which is doing a similar
thing.

Signed-off-by: Michal Hocko <[email protected]>
Signed-off-by: Theodore Ts'o <[email protected]>
  • Loading branch information
Michal Hocko authored and tytso committed Jun 15, 2015
1 parent b03a2f7 commit 7b506b1
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 14 deletions.
6 changes: 2 additions & 4 deletions fs/jbd2/journal.c
Original file line number Diff line number Diff line change
Expand Up @@ -2377,10 +2377,8 @@ static struct journal_head *journal_alloc_journal_head(void)
if (!ret) {
jbd_debug(1, "out of memory for journal_head\n");
pr_notice_ratelimited("ENOMEM in %s, retrying.\n", __func__);
while (!ret) {
yield();
ret = kmem_cache_zalloc(jbd2_journal_head_cache, GFP_NOFS);
}
ret = kmem_cache_zalloc(jbd2_journal_head_cache,
GFP_NOFS | __GFP_NOFAIL);
}
return ret;
}
Expand Down
15 changes: 5 additions & 10 deletions fs/jbd2/revoke.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,11 +141,13 @@ static int insert_revoke_hash(journal_t *journal, unsigned long long blocknr,
{
struct list_head *hash_list;
struct jbd2_revoke_record_s *record;
gfp_t gfp_mask = GFP_NOFS;

repeat:
record = kmem_cache_alloc(jbd2_revoke_record_cache, GFP_NOFS);
if (journal_oom_retry)
gfp_mask |= __GFP_NOFAIL;
record = kmem_cache_alloc(jbd2_revoke_record_cache, gfp_mask);
if (!record)
goto oom;
return -ENOMEM;

record->sequence = seq;
record->blocknr = blocknr;
Expand All @@ -154,13 +156,6 @@ static int insert_revoke_hash(journal_t *journal, unsigned long long blocknr,
list_add(&record->hash, hash_list);
spin_unlock(&journal->j_revoke_lock);
return 0;

oom:
if (!journal_oom_retry)
return -ENOMEM;
jbd_debug(1, "ENOMEM in %s, retrying\n", __func__);
yield();
goto repeat;
}

/* Find a revoke record in the journal's hash table. */
Expand Down

0 comments on commit 7b506b1

Please sign in to comment.