It used to be necessary for the allocator thread to batch up
invalidating buckets when possible - but since we added the btree key
cache that hasn't been a concern, and now it's causing the allocator
thread to livelock when the filesystem is nearly full.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
pr_debug("free_inc now empty");
- do {
+ while (1) {
cond_resched();
/*
* Find some buckets that we can invalidate, either
wake_up_process(c->gc_thread);
}
+ if (nr)
+ break;
+
/*
* If we found any buckets, we have to invalidate them
* before we scan for more - but if we didn't find very
* many we may want to wait on more buckets being
* available so we don't spin:
*/
- if (!nr ||
- (nr < ALLOC_SCAN_BATCH(ca) &&
- !fifo_empty(&ca->free[RESERVE_NONE]))) {
- ret = wait_buckets_available(c, ca);
- if (ret) {
- up_read(&c->gc_lock);
- goto stop;
- }
+ ret = wait_buckets_available(c, ca);
+ if (ret) {
+ up_read(&c->gc_lock);
+ goto stop;
}
- } while (!nr);
+ }
up_read(&c->gc_lock);