bcachefs: Fix bch2_btree_cache_scan()
It was counting nodes on the freed list that it skips - because we want to leave a few so that btree splits don't touch the allocator - as nodes that it touched, meaning that if it was called with <= 3 nodes to reclaim, and those nodes were on the freed list, it would never do any work. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
9620c3ec2f
commit
c043a3303c
@ -281,13 +281,19 @@ static unsigned long bch2_btree_cache_scan(struct shrinker *shrink,
|
||||
|
||||
i = 0;
|
||||
list_for_each_entry_safe(b, t, &bc->freeable, list) {
|
||||
/*
|
||||
* Leave a few nodes on the freeable list, so that a btree split
|
||||
* won't have to hit the system allocator:
|
||||
*/
|
||||
if (++i <= 3)
|
||||
continue;
|
||||
|
||||
touched++;
|
||||
|
||||
if (freed >= nr)
|
||||
break;
|
||||
|
||||
if (++i > 3 &&
|
||||
!btree_node_reclaim(c, b)) {
|
||||
if (!btree_node_reclaim(c, b)) {
|
||||
btree_node_data_free(c, b);
|
||||
six_unlock_write(&b->c.lock);
|
||||
six_unlock_intent(&b->c.lock);
|
||||
|
Loading…
x
Reference in New Issue
Block a user