On Tue, Mar 26, 2024 at 12:04:56PM +0800, Hongbo Li wrote:
> When allocating bkey_cached from bc->freed_pcpu list, it missed
> decreasing the count of nr_freed_pcpu which would cause the mismatch
> between the value of nr_freed_pcpu and the list items. This problem
> also exists in moving new bkey_cached to bc->freed_pcpu list.
> If these happened, the bug info may appear in
> bch2_fs_btree_key_cache_exit by the follow code:
> 
>    BUG_ON(list_count_nodes(&bc->freed_pcpu) != bc->nr_freed_pcpu);
>    BUG_ON(list_count_nodes(&bc->freed_nonpcpu) != bc->nr_freed_nonpcpu);

Please include the assertions too :)

> Fixes: c65c13f0eac6 ("bcachefs: Run btree key cache shrinker less 
> aggressively")
> Signed-off-by: Hongbo Li <[email protected]>
> ---
>  fs/bcachefs/btree_key_cache.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/fs/bcachefs/btree_key_cache.c b/fs/bcachefs/btree_key_cache.c
> index 581edcb0911b..e1031b9ba3f4 100644
> --- a/fs/bcachefs/btree_key_cache.c
> +++ b/fs/bcachefs/btree_key_cache.c
> @@ -169,6 +169,7 @@ static void bkey_cached_move_to_freelist(struct 
> btree_key_cache *bc,
>       } else {
>               mutex_lock(&bc->lock);
>               list_move_tail(&ck->list, &bc->freed_pcpu);
> +             bc->nr_freed_pcpu++;
>               mutex_unlock(&bc->lock);
>       }
>  }
> @@ -245,6 +246,7 @@ bkey_cached_alloc(struct btree_trans *trans, struct 
> btree_path *path,
>               if (!list_empty(&bc->freed_pcpu)) {
>                       ck = list_last_entry(&bc->freed_pcpu, struct 
> bkey_cached, list);
>                       list_del_init(&ck->list);
> +                     bc->nr_freed_pcpu--;
>               }
>               mutex_unlock(&bc->lock);
>       }
> -- 
> 2.34.1
> 

Reply via email to