Commit Graph

14 Commits

Author SHA1 Message Date
Rafael Aquini ade6f86e85 mm: shrinker: add infrastructure for dynamically allocating shrinker
JIRA: https://issues.redhat.com/browse/RHEL-27743

This patch is a backport of the following upstream commit:
commit c42d50aefd17a6bad3ed617769edbbb579137545
Author: Qi Zheng <zhengqi.arch@bytedance.com>
Date:   Mon Sep 11 17:44:00 2023 +0800

    mm: shrinker: add infrastructure for dynamically allocating shrinker

    Patch series "use refcount+RCU method to implement lockless slab shrink",
    v6.

    1. Background
    =============

    We used to implement the lockless slab shrink with SRCU [1], but then kernel
    test robot reported -88.8% regression in stress-ng.ramfs.ops_per_sec test
    case [2], so we reverted it [3].

    This patch series aims to re-implement the lockless slab shrink using the
    refcount+RCU method proposed by Dave Chinner [4].

    [1]. https://lore.kernel.org/lkml/20230313112819.38938-1-zhengqi.arch@bytedance.com/
    [2]. https://lore.kernel.org/lkml/202305230837.db2c233f-yujie.liu@intel.com/
    [3]. https://lore.kernel.org/all/20230609081518.3039120-1-qi.zheng@linux.dev/
    [4]. https://lore.kernel.org/lkml/ZIJhou1d55d4H1s0@dread.disaster.area/

    2. Implementation
    =================

    Currently, the shrinker instances can be divided into the following three types:

    a) global shrinker instance statically defined in the kernel, such as
       workingset_shadow_shrinker.

    b) global shrinker instance statically defined in the kernel modules, such as
       mmu_shrinker in x86.

    c) shrinker instance embedded in other structures.

    For case a, the memory of shrinker instance is never freed. For case b, the
    memory of shrinker instance will be freed after synchronize_rcu() when the
    module is unloaded. For case c, the memory of shrinker instance will be freed
    along with the structure it is embedded in.

    In preparation for implementing lockless slab shrink, we need to dynamically
    allocate those shrinker instances in case c, then the memory can be dynamically
    freed alone by calling kfree_rcu().

    This patchset adds the following new APIs for dynamically allocating shrinker,
    and add a private_data field to struct shrinker to record and get the original
    embedded structure.

    1. shrinker_alloc()
    2. shrinker_register()
    3. shrinker_free()

    In order to simplify shrinker-related APIs and make shrinker more independent of
    other kernel mechanisms, this patchset uses the above APIs to convert all
    shrinkers (including case a and b) to dynamically allocated, and then remove all
    existing APIs. This will also have another advantage mentioned by Dave Chinner:

    ```
    The other advantage of this is that it will break all the existing out of tree
    code and third party modules using the old API and will no longer work with a
    kernel using lockless slab shrinkers. They need to break (both at the source and
    binary levels) to stop bad things from happening due to using uncoverted
    shrinkers in the new setup.
    ```

    Then we free the shrinker by calling call_rcu(), and use rcu_read_{lock,unlock}()
    to ensure that the shrinker instance is valid. And the shrinker::refcount
    mechanism ensures that the shrinker instance will not be run again after
    unregistration. So the structure that records the pointer of shrinker instance
    can be safely freed without waiting for the RCU read-side critical section.

    In this way, while we implement the lockless slab shrink, we don't need to be
    blocked in unregister_shrinker() to wait RCU read-side critical section.

    PATCH 1: introduce new APIs
    PATCH 2~38: convert all shrinnkers to use new APIs
    PATCH 39: remove old APIs
    PATCH 40~41: some cleanups and preparations
    PATCH 42-43: implement the lockless slab shrink
    PATCH 44~45: convert shrinker_rwsem to mutex

    3. Testing
    ==========

    3.1 slab shrink stress test
    ---------------------------

    We can reproduce the down_read_trylock() hotspot through the following script:

    ```

    DIR="/root/shrinker/memcg/mnt"

    do_create()
    {
        mkdir -p /sys/fs/cgroup/memory/test
        echo 4G > /sys/fs/cgroup/memory/test/memory.limit_in_bytes
        for i in `seq 0 $1`;
        do
            mkdir -p /sys/fs/cgroup/memory/test/$i;
            echo $$ > /sys/fs/cgroup/memory/test/$i/cgroup.procs;
            mkdir -p $DIR/$i;
        done
    }

    do_mount()
    {
        for i in `seq $1 $2`;
        do
            mount -t tmpfs $i $DIR/$i;
        done
    }

    do_touch()
    {
        for i in `seq $1 $2`;
        do
            echo $$ > /sys/fs/cgroup/memory/test/$i/cgroup.procs;
            dd if=/dev/zero of=$DIR/$i/file$i bs=1M count=1 &
        done
    }

    case "$1" in
      touch)
        do_touch $2 $3
        ;;
      test)
        do_create 4000
        do_mount 0 4000
        do_touch 0 3000
        ;;
      *)
        exit 1
        ;;
    esac
    ```

    Save the above script, then run test and touch commands. Then we can use the
    following perf command to view hotspots:

    perf top -U -F 999

    1) Before applying this patchset:

      33.15%  [kernel]          [k] down_read_trylock
      25.38%  [kernel]          [k] shrink_slab
      21.75%  [kernel]          [k] up_read
       4.45%  [kernel]          [k] _find_next_bit
       2.27%  [kernel]          [k] do_shrink_slab
       1.80%  [kernel]          [k] intel_idle_irq
       1.79%  [kernel]          [k] shrink_lruvec
       0.67%  [kernel]          [k] xas_descend
       0.41%  [kernel]          [k] mem_cgroup_iter
       0.40%  [kernel]          [k] shrink_node
       0.38%  [kernel]          [k] list_lru_count_one

    2) After applying this patchset:

      64.56%  [kernel]          [k] shrink_slab
      12.18%  [kernel]          [k] do_shrink_slab
       3.30%  [kernel]          [k] __rcu_read_unlock
       2.61%  [kernel]          [k] shrink_lruvec
       2.49%  [kernel]          [k] __rcu_read_lock
       1.93%  [kernel]          [k] intel_idle_irq
       0.89%  [kernel]          [k] shrink_node
       0.81%  [kernel]          [k] mem_cgroup_iter
       0.77%  [kernel]          [k] mem_cgroup_calculate_protection
       0.66%  [kernel]          [k] list_lru_count_one

    We can see that the first perf hotspot becomes shrink_slab, which is what we
    expect.

    3.2 registration and unregistration stress test
    -----------------------------------------------

    Run the command below to test:

    stress-ng --timeout 60 --times --verify --metrics-brief --ramfs 9 &

    1) Before applying this patchset:

    setting to a 60 second run per stressor
    dispatching hogs: 9 ramfs
    stressor       bogo ops real time  usr time  sys time   bogo ops/s     bogo ops/s
                              (secs)    (secs)    (secs)   (real time) (usr+sys time)
    ramfs            473062     60.00      8.00    279.13      7884.12        1647.59
    for a 60.01s run time:
       1440.34s available CPU time
          7.99s user time   (  0.55%)
        279.13s system time ( 19.38%)
        287.12s total time  ( 19.93%)
    load average: 7.12 2.99 1.15
    successful run completed in 60.01s (1 min, 0.01 secs)

    2) After applying this patchset:

    setting to a 60 second run per stressor
    dispatching hogs: 9 ramfs
    stressor       bogo ops real time  usr time  sys time   bogo ops/s     bogo ops/s
                              (secs)    (secs)    (secs)   (real time) (usr+sys time)
    ramfs            477165     60.00      8.13    281.34      7952.55        1648.40
    for a 60.01s run time:
       1440.33s available CPU time
          8.12s user time   (  0.56%)
        281.34s system time ( 19.53%)
        289.46s total time  ( 20.10%)
    load average: 6.98 3.03 1.19
    successful run completed in 60.01s (1 min, 0.01 secs)

    We can see that the ops/s has hardly changed.

    This patch (of 45):

    Currently, the shrinker instances can be divided into the following three
    types:

    a) global shrinker instance statically defined in the kernel, such as
       workingset_shadow_shrinker.

    b) global shrinker instance statically defined in the kernel modules, such
       as mmu_shrinker in x86.

    c) shrinker instance embedded in other structures.

    For case a, the memory of shrinker instance is never freed. For case b,
    the memory of shrinker instance will be freed after synchronize_rcu() when
    the module is unloaded. For case c, the memory of shrinker instance will
    be freed along with the structure it is embedded in.

    In preparation for implementing lockless slab shrink, we need to
    dynamically allocate those shrinker instances in case c, then the memory
    can be dynamically freed alone by calling kfree_rcu().

    So this commit adds the following new APIs for dynamically allocating
    shrinker, and add a private_data field to struct shrinker to record and
    get the original embedded structure.

    1. shrinker_alloc()

    Used to allocate shrinker instance itself and related memory, it will
    return a pointer to the shrinker instance on success and NULL on failure.

    2. shrinker_register()

    Used to register the shrinker instance, which is same as the current
    register_shrinker_prepared().

    3. shrinker_free()

    Used to unregister (if needed) and free the shrinker instance.

    In order to simplify shrinker-related APIs and make shrinker more
    independent of other kernel mechanisms, subsequent submissions will use
    the above API to convert all shrinkers (including case a and b) to
    dynamically allocated, and then remove all existing APIs.

    This will also have another advantage mentioned by Dave Chinner:

    ```
    The other advantage of this is that it will break all the existing
    out of tree code and third party modules using the old API and will
    no longer work with a kernel using lockless slab shrinkers. They
    need to break (both at the source and binary levels) to stop bad
    things from happening due to using unconverted shrinkers in the new
    setup.
    ```

    [zhengqi.arch@bytedance.com: mm: shrinker: some cleanup]
      Link: https://lkml.kernel.org/r/20230919024607.65463-1-zhengqi.arch@bytedance.com
    Link: https://lkml.kernel.org/r/20230911094444.68966-1-zhengqi.arch@bytedance.com
    Link: https://lkml.kernel.org/r/20230911094444.68966-2-zhengqi.arch@bytedance.com
    Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
    Reviewed-by: Muchun Song <songmuchun@bytedance.com>
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Chuck Lever <cel@kernel.org>
    Cc: Darrick J. Wong <djwong@kernel.org>
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Kirill Tkhai <tkhai@ya.ru>
    Cc: Paul E. McKenney <paulmck@kernel.org>
    Cc: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Steven Price <steven.price@arm.com>
    Cc: Theodore Ts'o <tytso@mit.edu>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Abhinav Kumar <quic_abhinavk@quicinc.com>
    Cc: Alasdair Kergon <agk@redhat.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
    Cc: Andreas Dilger <adilger.kernel@dilger.ca>
    Cc: Andreas Gruenbacher <agruenba@redhat.com>
    Cc: Anna Schumaker <anna@kernel.org>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Bob Peterson <rpeterso@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Carlos Llamas <cmllamas@google.com>
    Cc: Chandan Babu R <chandan.babu@oracle.com>
    Cc: Chao Yu <chao@kernel.org>
    Cc: Chris Mason <clm@fb.com>
    Cc: Christian Koenig <christian.koenig@amd.com>
    Cc: Coly Li <colyli@suse.de>
    Cc: Dai Ngo <Dai.Ngo@oracle.com>
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: David Airlie <airlied@gmail.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: David Sterba <dsterba@suse.com>
    Cc: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Cc: Gao Xiang <hsiangkao@linux.alibaba.com>
    Cc: Huang Rui <ray.huang@amd.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jaegeuk Kim <jaegeuk@kernel.org>
    Cc: Jani Nikula <jani.nikula@linux.intel.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jason Wang <jasowang@redhat.com>
    Cc: Jeff Layton <jlayton@kernel.org>
    Cc: Jeffle Xu <jefflexu@linux.alibaba.com>
    Cc: Joel Fernandes (Google) <joel@joelfernandes.org>
    Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Cc: Josef Bacik <josef@toxicpanda.com>
    Cc: Juergen Gross <jgross@suse.com>
    Cc: Kent Overstreet <kent.overstreet@gmail.com>
    Cc: Marijn Suijten <marijn.suijten@somainline.org>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Mike Snitzer <snitzer@kernel.org>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Nadav Amit <namit@vmware.com>
    Cc: Neil Brown <neilb@suse.de>
    Cc: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
    Cc: Olga Kornievskaia <kolga@netapp.com>
    Cc: Richard Weinberger <richard@nod.at>
    Cc: Rob Clark <robdclark@gmail.com>
    Cc: Rob Herring <robh@kernel.org>
    Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Cc: Sean Paul <sean@poorly.run>
    Cc: Song Liu <song@kernel.org>
    Cc: Stefano Stabellini <sstabellini@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
    Cc: Tom Talpey <tom@talpey.com>
    Cc: Trond Myklebust <trond.myklebust@hammerspace.com>
    Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
    Cc: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
    Cc: Yue Hu <huyue2@coolpad.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:22:25 -04:00
Rafael Aquini 565fd80c5a mm: shrinker: remove redundant shrinker_rwsem in debugfs operations
JIRA: https://issues.redhat.com/browse/RHEL-27743

This patch is a backport of the following upstream commit:
commit 1dd49e58f966b1eecd935dc28458a8369ae94ad1
Author: Qi Zheng <zhengqi.arch@bytedance.com>
Date:   Mon Sep 11 17:25:16 2023 +0800

    mm: shrinker: remove redundant shrinker_rwsem in debugfs operations

    debugfs_remove_recursive() will wait for debugfs_file_put() to return, so
    the shrinker will not be freed when doing debugfs operations (such as
    shrinker_debugfs_count_show() and shrinker_debugfs_scan_write()), so there
    is no need to hold shrinker_rwsem during debugfs operations.

    Link: https://lkml.kernel.org/r/20230911092517.64141-4-zhengqi.arch@bytedance.com
    Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
    Reviewed-by: Muchun Song <songmuchun@bytedance.com>
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Christian König <christian.koenig@amd.com>
    Cc: Chuck Lever <cel@kernel.org>
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Darrick J. Wong <djwong@kernel.org>
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Joel Fernandes <joel@joelfernandes.org>
    Cc: Kirill Tkhai <tkhai@ya.ru>
    Cc: Paul E. McKenney <paulmck@kernel.org>
    Cc: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Steven Price <steven.price@arm.com>
    Cc: Theodore Ts'o <tytso@mit.edu>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Abhinav Kumar <quic_abhinavk@quicinc.com>
    Cc: Alasdair Kergon <agk@redhat.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
    Cc: Andreas Dilger <adilger.kernel@dilger.ca>
    Cc: Andreas Gruenbacher <agruenba@redhat.com>
    Cc: Anna Schumaker <anna@kernel.org>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Bob Peterson <rpeterso@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Carlos Llamas <cmllamas@google.com>
    Cc: Chandan Babu R <chandan.babu@oracle.com>
    Cc: Chao Yu <chao@kernel.org>
    Cc: Chris Mason <clm@fb.com>
    Cc: Coly Li <colyli@suse.de>
    Cc: Dai Ngo <Dai.Ngo@oracle.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: David Airlie <airlied@gmail.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: David Sterba <dsterba@suse.com>
    Cc: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Cc: Gao Xiang <hsiangkao@linux.alibaba.com>
    Cc: Huang Rui <ray.huang@amd.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jaegeuk Kim <jaegeuk@kernel.org>
    Cc: Jani Nikula <jani.nikula@linux.intel.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jason Wang <jasowang@redhat.com>
    Cc: Jeff Layton <jlayton@kernel.org>
    Cc: Jeffle Xu <jefflexu@linux.alibaba.com>
    Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Cc: Josef Bacik <josef@toxicpanda.com>
    Cc: Juergen Gross <jgross@suse.com>
    Cc: Kent Overstreet <kent.overstreet@gmail.com>
    Cc: Marijn Suijten <marijn.suijten@somainline.org>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Mike Snitzer <snitzer@kernel.org>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Muchun Song <muchun.song@linux.dev>
    Cc: Nadav Amit <namit@vmware.com>
    Cc: Neil Brown <neilb@suse.de>
    Cc: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
    Cc: Olga Kornievskaia <kolga@netapp.com>
    Cc: Richard Weinberger <richard@nod.at>
    Cc: Rob Clark <robdclark@gmail.com>
    Cc: Rob Herring <robh@kernel.org>
    Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Cc: Sean Paul <sean@poorly.run>
    Cc: Song Liu <song@kernel.org>
    Cc: Stefano Stabellini <sstabellini@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
    Cc: Tom Talpey <tom@talpey.com>
    Cc: Trond Myklebust <trond.myklebust@hammerspace.com>
    Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
    Cc: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
    Cc: Yue Hu <huyue2@coolpad.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:22:24 -04:00
Rafael Aquini ba6e4cf4c8 mm: move some shrinker-related function declarations to mm/internal.h
JIRA: https://issues.redhat.com/browse/RHEL-27743

This patch is a backport of the following upstream commit:
commit 3ee0aa9f06756e959633ffda37856c6741d948ed
Author: Qi Zheng <zhengqi.arch@bytedance.com>
Date:   Mon Sep 11 17:25:14 2023 +0800

    mm: move some shrinker-related function declarations to mm/internal.h

    Patch series "cleanups for lockless slab shrink", v4.

    This series is some cleanups for lockless slab shrink.

    This patch (of 4):

    The following functions are only used inside the mm subsystem, so it's
    better to move their declarations to the mm/internal.h file.

    1. shrinker_debugfs_add()
    2. shrinker_debugfs_detach()
    3. shrinker_debugfs_remove()

    Link: https://lkml.kernel.org/r/20230911092517.64141-1-zhengqi.arch@bytedance.com
    Link: https://lkml.kernel.org/r/20230911092517.64141-2-zhengqi.arch@bytedance.com
    Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
    Reviewed-by: Muchun Song <songmuchun@bytedance.com>
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Christian König <christian.koenig@amd.com>
    Cc: Chuck Lever <cel@kernel.org>
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Cc: Darrick J. Wong <djwong@kernel.org>
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Joel Fernandes <joel@joelfernandes.org>
    Cc: Kirill Tkhai <tkhai@ya.ru>
    Cc: Paul E. McKenney <paulmck@kernel.org>
    Cc: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Steven Price <steven.price@arm.com>
    Cc: Theodore Ts'o <tytso@mit.edu>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Abhinav Kumar <quic_abhinavk@quicinc.com>
    Cc: Alasdair Kergon <agk@redhat.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
    Cc: Andreas Dilger <adilger.kernel@dilger.ca>
    Cc: Andreas Gruenbacher <agruenba@redhat.com>
    Cc: Anna Schumaker <anna@kernel.org>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Bob Peterson <rpeterso@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Carlos Llamas <cmllamas@google.com>
    Cc: Chandan Babu R <chandan.babu@oracle.com>
    Cc: Chao Yu <chao@kernel.org>
    Cc: Chris Mason <clm@fb.com>
    Cc: Coly Li <colyli@suse.de>
    Cc: Dai Ngo <Dai.Ngo@oracle.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: David Airlie <airlied@gmail.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: David Sterba <dsterba@suse.com>
    Cc: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Cc: Gao Xiang <hsiangkao@linux.alibaba.com>
    Cc: Huang Rui <ray.huang@amd.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jaegeuk Kim <jaegeuk@kernel.org>
    Cc: Jani Nikula <jani.nikula@linux.intel.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jason Wang <jasowang@redhat.com>
    Cc: Jeff Layton <jlayton@kernel.org>
    Cc: Jeffle Xu <jefflexu@linux.alibaba.com>
    Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Cc: Josef Bacik <josef@toxicpanda.com>
    Cc: Juergen Gross <jgross@suse.com>
    Cc: Kent Overstreet <kent.overstreet@gmail.com>
    Cc: Marijn Suijten <marijn.suijten@somainline.org>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Mike Snitzer <snitzer@kernel.org>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Muchun Song <muchun.song@linux.dev>
    Cc: Nadav Amit <namit@vmware.com>
    Cc: Neil Brown <neilb@suse.de>
    Cc: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
    Cc: Olga Kornievskaia <kolga@netapp.com>
    Cc: Richard Weinberger <richard@nod.at>
    Cc: Rob Clark <robdclark@gmail.com>
    Cc: Rob Herring <robh@kernel.org>
    Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Cc: Sean Paul <sean@poorly.run>
    Cc: Song Liu <song@kernel.org>
    Cc: Stefano Stabellini <sstabellini@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
    Cc: Tom Talpey <tom@talpey.com>
    Cc: Trond Myklebust <trond.myklebust@hammerspace.com>
    Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
    Cc: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
    Cc: Yue Hu <huyue2@coolpad.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:22:23 -04:00
Rafael Aquini 9fd9128eaa mm: shrinkers: fix debugfs file permissions
JIRA: https://issues.redhat.com/browse/RHEL-48221

This patch is a backport of the following upstream commit:
commit 2124f79de6a909630d1a62b01ecc32db9f967181
Author: John Keeping <john@metanate.com>
Date:   Tue Apr 18 11:19:05 2023 +0100

    mm: shrinkers: fix debugfs file permissions

    The permissions for the files here are swapped as "count" is read-only and
    "scan" is write-only.  While this doesn't really matter as these
    permissions don't stop the files being opened for reading/writing as
    appropriate, they are shown by "ls -l" and are confusing.

    Link: https://lkml.kernel.org/r/20230418101906.3131303-1-john@metanate.com
    Signed-off-by: John Keeping <john@metanate.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <aquini@redhat.com>
2024-07-16 09:30:13 -04:00
Chris von Recklinghausen b353d5459f Revert "mm: shrinkers: make count and scan in shrinker debugfs lockless"
JIRA: https://issues.redhat.com/browse/RHEL-27741

commit 1a554ecc971406e291cea867112f7f2e377e810e
Author: Qi Zheng <zhengqi.arch@bytedance.com>
Date:   Fri Jun 9 08:15:15 2023 +0000

    Revert "mm: shrinkers: make count and scan in shrinker debugfs lockless"

    This reverts commit 20cd1892fcc3efc10a7ac327cc3790494bec46b5.

    Kernel test robot reports -88.8% regression in stress-ng.ramfs.ops_per_sec
    test case [1], which is caused by commit f95bdb700bc6 ("mm: vmscan: make
    global slab shrink lockless").  The root cause is that SRCU has to be
    careful to not frequently check for SRCU read-side critical section exits.
    Therefore, even if no one is currently in the SRCU read-side critical
    section, synchronize_srcu() cannot return quickly.  That's why
    unregister_shrinker() has become slower.

    We will try to use the refcount+RCU method [2] proposed by Dave Chinner to
    continue to re-implement the lockless slab shrink.  So revert the
    shrinker_srcu related changes first.

    [1]. https://lore.kernel.org/lkml/202305230837.db2c233f-yujie.liu@intel.com/
    [2]. https://lore.kernel.org/lkml/ZIJhou1d55d4H1s0@dread.disaster.area/

    Link: https://lkml.kernel.org/r/20230609081518.3039120-5-qi.zheng@linux.dev
    Reported-by: kernel test robot <yujie.liu@intel.com>
    Closes: https://lore.kernel.org/oe-lkp/202305230837.db2c233f-yujie.liu@intel.com
    Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: Kirill Tkhai <tkhai@ya.ru>
    Cc: Muchun Song <muchun.song@linux.dev>
    Cc: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2024-04-30 07:01:19 -04:00
Chris von Recklinghausen d91048d120 Revert "mm: shrinkers: convert shrinker_rwsem to mutex"
Conflicts: drivers/md/dm-thin-metadata.c - We already have
	d48300120627 ("dm thin metadata: Fix ABBA deadlock by resetting
dm_bufio_client")
	so conflicted code is gone

JIRA: https://issues.redhat.com/browse/RHEL-27741

commit 47a7c01c3efc6581f5dcca40928baeb38e1e40c2
Author: Qi Zheng <zhengqi.arch@bytedance.com>
Date:   Fri Jun 9 08:15:12 2023 +0000

    Revert "mm: shrinkers: convert shrinker_rwsem to mutex"

    Patch series "revert shrinker_srcu related changes".

    This patch (of 7):

    This reverts commit cf2e309ebca7bb0916771839f9b580b06c778530.

    Kernel test robot reports -88.8% regression in stress-ng.ramfs.ops_per_sec
    test case [1], which is caused by commit f95bdb700bc6 ("mm: vmscan: make
    global slab shrink lockless").  The root cause is that SRCU has to be
    careful to not frequently check for SRCU read-side critical section exits.
    Therefore, even if no one is currently in the SRCU read-side critical
    section, synchronize_srcu() cannot return quickly.  That's why
    unregister_shrinker() has become slower.

    After discussion, we will try to use the refcount+RCU method [2] proposed
    by Dave Chinner to continue to re-implement the lockless slab shrink.  So
    revert the shrinker_mutex back to shrinker_rwsem first.

    [1]. https://lore.kernel.org/lkml/202305230837.db2c233f-yujie.liu@intel.com/
    [2]. https://lore.kernel.org/lkml/ZIJhou1d55d4H1s0@dread.disaster.area/

    Link: https://lkml.kernel.org/r/20230609081518.3039120-1-qi.zheng@linux.dev
    Link: https://lkml.kernel.org/r/20230609081518.3039120-2-qi.zheng@linux.dev
    Reported-by: kernel test robot <yujie.liu@intel.com>
    Closes: https://lore.kernel.org/oe-lkp/202305230837.db2c233f-yujie.liu@intel
.com
    Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: Kirill Tkhai <tkhai@ya.ru>
    Cc: Muchun Song <muchun.song@linux.dev>
    Cc: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Yujie Liu <yujie.liu@intel.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2024-04-30 07:01:18 -04:00
Chris von Recklinghausen a3e9dcb8ec mm: shrinkers: fix race condition on debugfs cleanup
JIRA: https://issues.redhat.com/browse/RHEL-27741

commit 26e239b37ebdfd189a2e6f94d3407e70313348bc
Author: Joan Bruguera Micó <joanbrugueram@gmail.com>
Date:   Wed May 3 01:32:32 2023 +0000

    mm: shrinkers: fix race condition on debugfs cleanup

    When something registers and unregisters many shrinkers, such as:
        for x in $(seq 10000); do unshare -Ui true; done

    Sometimes the following error is printed to the kernel log:
        debugfs: Directory '...' with parent 'shrinker' already present!

    This occurs since commit badc28d4924b ("mm: shrinkers: fix deadlock in
    shrinker debugfs") / v6.2: Since the call to `debugfs_remove_recursive`
    was moved outside the `shrinker_rwsem`/`shrinker_mutex` lock, but the call
    to `ida_free` stayed inside, a newly registered shrinker can be
    re-assigned that ID and attempt to create the debugfs directory before the
    directory from the previous shrinker has been removed.

    The locking changes in commit f95bdb700bc6 ("mm: vmscan: make global slab
    shrink lockless") made the race condition more likely, though it existed
    before then.

    Commit badc28d4924b ("mm: shrinkers: fix deadlock in shrinker debugfs")
    could be reverted since the issue is addressed should no longer occur
    since the count and scan operations are lockless since commit 20cd1892fcc3
    ("mm: shrinkers: make count and scan in shrinker debugfs lockless").
    However, since this is a contended lock, prefer instead moving `ida_free`
    outside the lock to avoid the race.

    Link: https://lkml.kernel.org/r/20230503013232.299211-1-joanbrugueram@gmail.com
    Fixes: badc28d4924b ("mm: shrinkers: fix deadlock in shrinker debugfs")
    Signed-off-by: Joan Bruguera Micó <joanbrugueram@gmail.com>
    Cc: Qi Zheng <zhengqi.arch@bytedance.com>
    Cc: Roman Gushchin <roman.gushchin@linux.dev>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2024-04-30 07:01:14 -04:00
Chris von Recklinghausen ca5d53dc2a mm: shrinkers: convert shrinker_rwsem to mutex
Conflicts: drivers/md/dm-thin-metadata.c - We already have
	d48300120627 ("dm thin metadata: Fix ABBA deadlock by resetting
dm_bufio_client")
	so conflicted code is gone.

JIRA: https://issues.redhat.com/browse/RHEL-27741

commit cf2e309ebca7bb0916771839f9b580b06c778530
Author: Qi Zheng <zhengqi.arch@bytedance.com>
Date:   Mon Mar 13 19:28:19 2023 +0800

    mm: shrinkers: convert shrinker_rwsem to mutex

    Now there are no readers of shrinker_rwsem, so we can simply replace it
    with mutex lock.

    Link: https://lkml.kernel.org/r/20230313112819.38938-9-zhengqi.arch@bytedanc
e.com
    Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
    Acked-by: Vlastimil Babka <vbabka@suse.cz>
    Acked-by: Kirill Tkhai <tkhai@ya.ru>
    Acked-by: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Christian König <christian.koenig@amd.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Muchun Song <muchun.song@linux.dev>
    Cc: Paul E. McKenney <paulmck@kernel.org>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Sultan Alsawaf <sultan@kerneltoast.com>
    Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Cc: Yang Shi <shy828301@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2024-04-30 07:00:16 -04:00
Chris von Recklinghausen b91ce5e26d mm: shrinkers: make count and scan in shrinker debugfs lockless
JIRA: https://issues.redhat.com/browse/RHEL-27741

commit 20cd1892fcc3efc10a7ac327cc3790494bec46b5
Author: Qi Zheng <zhengqi.arch@bytedance.com>
Date:   Mon Mar 13 19:28:16 2023 +0800

    mm: shrinkers: make count and scan in shrinker debugfs lockless

    Like global and memcg slab shrink, also use SRCU to make count and scan
    operations in memory shrinker debugfs lockless.

    Link: https://lkml.kernel.org/r/20230313112819.38938-6-zhengqi.arch@bytedance.com
    Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
    Acked-by: Vlastimil Babka <vbabka@suse.cz>
    Acked-by: Kirill Tkhai <tkhai@ya.ru>
    Acked-by: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Christian König <christian.koenig@amd.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Muchun Song <muchun.song@linux.dev>
    Cc: Paul E. McKenney <paulmck@kernel.org>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Sultan Alsawaf <sultan@kerneltoast.com>
    Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Cc: Yang Shi <shy828301@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2024-04-30 07:00:15 -04:00
Chris von Recklinghausen a7fb36ec82 mm: shrinkers: fix deadlock in shrinker debugfs
Conflicts: mm/vmscan.c - We don't have
	d6c3af7d8a2b ("mm: multi-gen LRU: debugfs interface")
	so add an #include of linux/debugfs.h

Bugzilla: https://bugzilla.redhat.com/2160210

commit badc28d4924bfed73efc93f716a0c3aa3afbdf6f
Author: Qi Zheng <zhengqi.arch@bytedance.com>
Date:   Thu Feb 2 18:56:12 2023 +0800

    mm: shrinkers: fix deadlock in shrinker debugfs

    The debugfs_remove_recursive() is invoked by unregister_shrinker(), which
    is holding the write lock of shrinker_rwsem.  It will waits for the
    handler of debugfs file complete.  The handler also needs to hold the read
    lock of shrinker_rwsem to do something.  So it may cause the following
    deadlock:

            CPU0                            CPU1

    debugfs_file_get()
    shrinker_debugfs_count_show()/shrinker_debugfs_scan_write()

                                    unregister_shrinker()
                                    --> down_write(&shrinker_rwsem);
                                        debugfs_remove_recursive()
                                            // wait for (A)
                                        --> wait_for_completion();

        // wait for (B)
    --> down_read_killable(&shrinker_rwsem)
    debugfs_file_put() -- (A)

                                        up_write() -- (B)

    The down_read_killable() can be killed, so that the above deadlock can be
    recovered.  But it still requires an extra kill action, otherwise it will
    block all subsequent shrinker-related operations, so it's better to fix
    it.

    [akpm@linux-foundation.org: fix CONFIG_SHRINKER_DEBUG=n stub]
    Link: https://lkml.kernel.org/r/20230202105612.64641-1-zhengqi.arch@bytedance.com
    Fixes: 5035ebc644ae ("mm: shrinkers: introduce debugfs interface for memory shrinkers")
    Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
    Reviewed-by: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Kent Overstreet <kent.overstreet@gmail.com>
    Cc: Muchun Song <songmuchun@bytedance.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2023-03-24 11:19:35 -04:00
Chris von Recklinghausen f78820ee59 mm: shrinkers: fix double kfree on shrinker name
Bugzilla: https://bugzilla.redhat.com/2160210

commit 14773bfa70e67f4d4ebd60e60cb6e25e8c84d4c0
Author: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Date:   Wed Jul 20 23:47:55 2022 +0900

    mm: shrinkers: fix double kfree on shrinker name

    syzbot is reporting double kfree() at free_prealloced_shrinker() [1], for
    destroy_unused_super() calls free_prealloced_shrinker() even if
    prealloc_shrinker() returned an error.  Explicitly clear shrinker name
    when prealloc_shrinker() called kfree().

    [roman.gushchin@linux.dev: zero shrinker->name in all cases where shrinker->name is freed]
      Link: https://lkml.kernel.org/r/YtgteTnQTgyuKUSY@castle
    Link: https://syzkaller.appspot.com/bug?extid=8b481578352d4637f510 [1]
    Link: https://lkml.kernel.org/r/ffa62ece-6a42-2644-16cf-0d33ef32c676@I-love.SAKURA.ne.jp
    Fixes: e33c267ab70de424 ("mm: shrinkers: provide shrinkers with names")
    Reported-by: syzbot <syzbot+8b481578352d4637f510@syzkaller.appspotmail.com>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Acked-by: Roman Gushchin <roman.gushchin@linux.dev>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2023-03-24 11:19:28 -04:00
Chris von Recklinghausen 8defee5e79 mm: shrinkers: add scan interface for shrinker debugfs
Bugzilla: https://bugzilla.redhat.com/2160210

commit bbf535fd6f06b94b9d07ed6f09397a936d4a58d8
Author: Roman Gushchin <roman.gushchin@linux.dev>
Date:   Tue May 31 20:22:27 2022 -0700

    mm: shrinkers: add scan interface for shrinker debugfs

    Add a scan interface which allows to trigger scanning of a particular
    shrinker and specify memcg and numa node.  It's useful for testing,
    debugging and profiling of a specific scan_objects() callback.  Unlike
    alternatives (creating a real memory pressure and dropping caches via
    /proc/sys/vm/drop_caches) this interface allows to interact with only one
    shrinker at once.  Also, if a shrinker is misreporting the number of
    objects (as some do), it doesn't affect scanning.

    [roman.gushchin@linux.dev: improve typing, fix arg count checking]
      Link: https://lkml.kernel.org/r/YpgKttTowT22mKPQ@carbon
    [akpm@linux-foundation.org: fix arg count checking]
    Link: https://lkml.kernel.org/r/20220601032227.4076670-7-roman.gushchin@linux.dev
    Signed-off-by: Roman Gushchin <roman.gushchin@linux.dev>
    Acked-by: Muchun Song <songmuchun@bytedance.com>
    Cc: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Cc: Dave Chinner <dchinner@redhat.com>
    Cc: Hillf Danton <hdanton@sina.com>
    Cc: Kent Overstreet <kent.overstreet@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2023-03-24 11:19:17 -04:00
Chris von Recklinghausen 8dced2b153 mm: shrinkers: provide shrinkers with names
Bugzilla: https://bugzilla.redhat.com/2160210

commit e33c267ab70de4249d22d7eab1cc7d68a889bac2
Author: Roman Gushchin <roman.gushchin@linux.dev>
Date:   Tue May 31 20:22:24 2022 -0700

    mm: shrinkers: provide shrinkers with names

    Currently shrinkers are anonymous objects.  For debugging purposes they
    can be identified by count/scan function names, but it's not always
    useful: e.g.  for superblock's shrinkers it's nice to have at least an
    idea of to which superblock the shrinker belongs.

    This commit adds names to shrinkers.  register_shrinker() and
    prealloc_shrinker() functions are extended to take a format and arguments
    to master a name.

    In some cases it's not possible to determine a good name at the time when
    a shrinker is allocated.  For such cases shrinker_debugfs_rename() is
    provided.

    The expected format is:
        <subsystem>-<shrinker_type>[:<instance>]-<id>
    For some shrinkers an instance can be encoded as (MAJOR:MINOR) pair.

    After this change the shrinker debugfs directory looks like:
      $ cd /sys/kernel/debug/shrinker/
      $ ls
        dquota-cache-16     sb-devpts-28     sb-proc-47       sb-tmpfs-42
        mm-shadow-18        sb-devtmpfs-5    sb-proc-48       sb-tmpfs-43
        mm-zspool:zram0-34  sb-hugetlbfs-17  sb-pstore-31     sb-tmpfs-44
        rcu-kfree-0         sb-hugetlbfs-33  sb-rootfs-2      sb-tmpfs-49
        sb-aio-20           sb-iomem-12      sb-securityfs-6  sb-tracefs-13
        sb-anon_inodefs-15  sb-mqueue-21     sb-selinuxfs-22  sb-xfs:vda1-36
        sb-bdev-3           sb-nsfs-4        sb-sockfs-8      sb-zsmalloc-19
        sb-bpf-32           sb-pipefs-14     sb-sysfs-26      thp-deferred_split-10
        sb-btrfs:vda2-24    sb-proc-25       sb-tmpfs-1       thp-zero-9
        sb-cgroup2-30       sb-proc-39       sb-tmpfs-27      xfs-buf:vda1-37
        sb-configfs-23      sb-proc-41       sb-tmpfs-29      xfs-inodegc:vda1-38
        sb-dax-11           sb-proc-45       sb-tmpfs-35
        sb-debugfs-7        sb-proc-46       sb-tmpfs-40

    [roman.gushchin@linux.dev: fix build warnings]
      Link: https://lkml.kernel.org/r/Yr+ZTnLb9lJk6fJO@castle
      Reported-by: kernel test robot <lkp@intel.com>
    Link: https://lkml.kernel.org/r/20220601032227.4076670-4-roman.gushchin@linux.dev
    Signed-off-by: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Cc: Dave Chinner <dchinner@redhat.com>
    Cc: Hillf Danton <hdanton@sina.com>
    Cc: Kent Overstreet <kent.overstreet@gmail.com>
    Cc: Muchun Song <songmuchun@bytedance.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2023-03-24 11:19:17 -04:00
Chris von Recklinghausen 22b1bd509b mm: shrinkers: introduce debugfs interface for memory shrinkers
Bugzilla: https://bugzilla.redhat.com/2160210

commit 5035ebc644aec92d55d1bbfe042f35341e4bffb5
Author: Roman Gushchin <roman.gushchin@linux.dev>
Date:   Tue May 31 20:22:23 2022 -0700

    mm: shrinkers: introduce debugfs interface for memory shrinkers

    This commit introduces the /sys/kernel/debug/shrinker debugfs interface
    which provides an ability to observe the state of individual kernel memory
    shrinkers.

    Because the feature adds some memory overhead (which shouldn't be large
    unless there is a huge amount of registered shrinkers), it's guarded by a
    config option (enabled by default).

    This commit introduces the "count" interface for each shrinker registered
    in the system.

    The output is in the following format:
    <cgroup inode id> <nr of objects on node 0> <nr of objects on node 1>...
    <cgroup inode id> <nr of objects on node 0> <nr of objects on node 1>...
    ...

    To reduce the size of output on machines with many thousands cgroups, if
    the total number of objects on all nodes is 0, the line is omitted.

    If the shrinker is not memcg-aware or CONFIG_MEMCG is off, 0 is printed as
    cgroup inode id.  If the shrinker is not numa-aware, 0's are printed for
    all nodes except the first one.

    This commit gives debugfs entries simple numeric names, which are not very
    convenient.  The following commit in the series will provide shrinkers
    with more meaningful names.

    [akpm@linux-foundation.org: remove WARN_ON_ONCE(), per Roman]
      Reported-by: syzbot+300d27c79fe6d4cbcc39@syzkaller.appspotmail.com
    Link: https://lkml.kernel.org/r/20220601032227.4076670-3-roman.gushchin@linux.dev
    Signed-off-by: Roman Gushchin <roman.gushchin@linux.dev>
    Reviewed-by: Kent Overstreet <kent.overstreet@gmail.com>
    Acked-by: Muchun Song <songmuchun@bytedance.com>
    Cc: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Cc: Dave Chinner <dchinner@redhat.com>
    Cc: Hillf Danton <hdanton@sina.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2023-03-24 11:19:17 -04:00