From 9d4582ffdb286d3513ee9ebf7961b1741d8cbc0d Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Thu, 19 Nov 2020 21:15:39 -0500 Subject: [PATCH] bcachefs: Journal reclaim requires memalloc_noreclaim_save() Memory reclaim requires journal reclaim to make forward progress - it's what cleans our caches - thus, while we're in journal reclaim or holding the journal reclaim lock we can't recurse into memory reclaim. Signed-off-by: Kent Overstreet Signed-off-by: Kent Overstreet --- fs/bcachefs/journal_reclaim.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/fs/bcachefs/journal_reclaim.c b/fs/bcachefs/journal_reclaim.c index 7f8ab13256c86..9c67597d1ec64 100644 --- a/fs/bcachefs/journal_reclaim.c +++ b/fs/bcachefs/journal_reclaim.c @@ -9,6 +9,8 @@ #include "super.h" #include "trace.h" +#include + /* Free space calculations: */ static unsigned journal_space_from(struct journal_device *ja, @@ -537,8 +539,16 @@ void bch2_journal_reclaim(struct journal *j) struct bch_fs *c = container_of(j, struct bch_fs, journal); u64 seq_to_flush, nr_flushed = 0; size_t min_nr; + unsigned flags; + /* + * We can't invoke memory reclaim while holding the reclaim_lock - + * journal reclaim is required to make progress for memory reclaim + * (cleaning the caches), so we can't get stuck in memory reclaim while + * we're holding the reclaim lock: + */ lockdep_assert_held(&j->reclaim_lock); + flags = memalloc_noreclaim_save(); do { bch2_journal_do_discards(j); @@ -575,6 +585,8 @@ void bch2_journal_reclaim(struct journal *j) nr_flushed += journal_flush_pins(j, seq_to_flush, min_nr); } while (min_nr); + memalloc_noreclaim_restore(flags); + trace_journal_reclaim_finish(c, nr_flushed); if (!bch2_journal_error(j)) -- 2.30.2