Commit b1bd955b authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet
Browse files

bcachefs: Don't wait for ALLOC_SCAN_BATCH buckets in allocator



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: default avatarKent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 3a14d58e
Loading
Loading
Loading
Loading
+9 −10
Original line number Diff line number Diff line
@@ -1071,7 +1071,7 @@ static int bch2_allocator_thread(void *arg)

		pr_debug("free_inc now empty");

		do {
		while (1) {
			cond_resched();
			/*
			 * Find some buckets that we can invalidate, either
@@ -1095,22 +1095,21 @@ static int bch2_allocator_thread(void *arg)
				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;
			}
		}
		} while (!nr);

		up_read(&c->gc_lock);