lkml.org 
[lkml]   [2023]   [Mar]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH v4 5/8] mm: shrinkers: make count and scan in shrinker debugfs lockless
    From
    On 07.03.2023 09:56, Qi Zheng wrote:
    > 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>

    Acked-by: Kirill Tkhai <tkhai@ya.ru>

    > ---
    > mm/shrinker_debug.c | 24 +++++++-----------------
    > 1 file changed, 7 insertions(+), 17 deletions(-)
    >
    > diff --git a/mm/shrinker_debug.c b/mm/shrinker_debug.c
    > index 39c3491e28a3..6aa7a7ec69da 100644
    > --- a/mm/shrinker_debug.c
    > +++ b/mm/shrinker_debug.c
    > @@ -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;
    > @@ -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 = 0, 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;
    >
    > @@ -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;
    > @@ -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))
    > @@ -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;
    > @@ -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;

    \
     
     \ /
      Last update: 2023-03-27 00:52    [W:3.897 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site