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 <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
b3c2a06b7d
commit
9d4582ffdb
@ -9,6 +9,8 @@
|
||||
#include "super.h"
|
||||
#include "trace.h"
|
||||
|
||||
#include <linux/sched/mm.h>
|
||||
|
||||
/* 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))
|
||||
|
Loading…
Reference in New Issue
Block a user