Skip to content

Commit

Permalink
mm: shrinkers: make count and scan in shrinker debugfs lockless
Browse files Browse the repository at this point in the history
Like global and memcg slab shrink, also use SRCU to
make count and scan operations in memory shrinker
debugfs lockless.

Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
  • Loading branch information
Qi Zheng authored and intel-lab-lkp committed Feb 20, 2023
1 parent c7ba83e commit b5b7259
Showing 1 changed file with 7 additions and 17 deletions.
24 changes: 7 additions & 17 deletions mm/shrinker_debug.c
Expand Up @@ -9,6 +9,7 @@
/* defined in vmscan.c */
extern struct rw_semaphore shrinker_rwsem;
extern struct list_head shrinker_list;
extern struct srcu_struct shrinker_srcu;

static DEFINE_IDA(shrinker_debugfs_ida);
static struct dentry *shrinker_debugfs_root;
Expand Down Expand Up @@ -49,18 +50,13 @@ static int shrinker_debugfs_count_show(struct seq_file *m, void *v)
struct mem_cgroup *memcg;
unsigned long total;
bool memcg_aware;
int ret, nid;
int ret, nid, srcu_idx;

count_per_node = kcalloc(nr_node_ids, sizeof(unsigned long), GFP_KERNEL);
if (!count_per_node)
return -ENOMEM;

ret = down_read_killable(&shrinker_rwsem);
if (ret) {
kfree(count_per_node);
return ret;
}
rcu_read_lock();
srcu_idx = srcu_read_lock(&shrinker_srcu);

memcg_aware = shrinker->flags & SHRINKER_MEMCG_AWARE;

Expand Down Expand Up @@ -91,8 +87,7 @@ static int shrinker_debugfs_count_show(struct seq_file *m, void *v)
}
} while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)) != NULL);

rcu_read_unlock();
up_read(&shrinker_rwsem);
srcu_read_unlock(&shrinker_srcu, srcu_idx);

kfree(count_per_node);
return ret;
Expand All @@ -115,9 +110,8 @@ static ssize_t shrinker_debugfs_scan_write(struct file *file,
.gfp_mask = GFP_KERNEL,
};
struct mem_cgroup *memcg = NULL;
int nid;
int nid, srcu_idx;
char kbuf[72];
ssize_t ret;

read_len = size < (sizeof(kbuf) - 1) ? size : (sizeof(kbuf) - 1);
if (copy_from_user(kbuf, buf, read_len))
Expand Down Expand Up @@ -146,11 +140,7 @@ static ssize_t shrinker_debugfs_scan_write(struct file *file,
return -EINVAL;
}

ret = down_read_killable(&shrinker_rwsem);
if (ret) {
mem_cgroup_put(memcg);
return ret;
}
srcu_idx = srcu_read_lock(&shrinker_srcu);

sc.nid = nid;
sc.memcg = memcg;
Expand All @@ -159,7 +149,7 @@ static ssize_t shrinker_debugfs_scan_write(struct file *file,

shrinker->scan_objects(shrinker, &sc);

up_read(&shrinker_rwsem);
srcu_read_unlock(&shrinker_srcu, srcu_idx);
mem_cgroup_put(memcg);

return size;
Expand Down

0 comments on commit b5b7259

Please sign in to comment.