mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
bcachefs: Use mm_account_reclaimed_pages() when freeing btree nodes
When freeing in a shrinker callback, we need to notify memory reclaim, so it knows forward progress has been made. Normally this is done in e.g. slab code, but we're not freeing through slab - or rather we are, but these allocations are big, and use the kmalloc_large() path. This is really a bug in the slub code, but we're working around it here for now. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
895fbf1cf0
commit
ff7f756f2b
@ -15,6 +15,7 @@
|
||||
|
||||
#include <linux/prefetch.h>
|
||||
#include <linux/sched/mm.h>
|
||||
#include <linux/swap.h>
|
||||
|
||||
#define BTREE_CACHE_NOT_FREED_INCREMENT(counter) \
|
||||
do { \
|
||||
@ -63,6 +64,16 @@ static void btree_node_data_free(struct bch_fs *c, struct btree *b)
|
||||
{
|
||||
struct btree_cache *bc = &c->btree_cache;
|
||||
|
||||
/*
|
||||
* This should really be done in slub/vmalloc, but we're using the
|
||||
* kmalloc_large() path, so we're working around a slub bug by doing
|
||||
* this here:
|
||||
*/
|
||||
if (b->data)
|
||||
mm_account_reclaimed_pages(btree_buf_bytes(b) / PAGE_SIZE);
|
||||
if (b->aux_data)
|
||||
mm_account_reclaimed_pages(btree_aux_data_bytes(b) / PAGE_SIZE);
|
||||
|
||||
EBUG_ON(btree_node_write_in_flight(b));
|
||||
|
||||
clear_btree_node_just_written(b);
|
||||
|
Loading…
Reference in New Issue
Block a user