mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-03 18:12:25 -04:00
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: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
committed by
Kent Overstreet
parent
3a14d58e7b
commit
b1bd955ba5
@@ -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;
|
||||
}
|
||||
ret = wait_buckets_available(c, ca);
|
||||
if (ret) {
|
||||
up_read(&c->gc_lock);
|
||||
goto stop;
|
||||
}
|
||||
} while (!nr);
|
||||
}
|
||||
|
||||
up_read(&c->gc_lock);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user