On Thu, Feb 23, 2023 at 10:26:45AM -0500, Rafael Aquini wrote: > On Thu, Feb 23, 2023 at 09:27:20PM +0800, Qi Zheng wrote: > > The shrinker_rwsem is a global lock in shrinkers subsystem, > > it is easy to cause blocking in the following cases: > > > > a. the write lock of shrinker_rwsem was held for too long. > > For example, there are many memcgs in the system, which > > causes some paths to hold locks and traverse it for too > > long. (e.g. expand_shrinker_info()) > > b. the read lock of shrinker_rwsem was held for too long, > > and a writer came at this time. Then this writer will be > > forced to wait and block all subsequent readers. > > For example: > > - be scheduled when the read lock of shrinker_rwsem is > > held in do_shrink_slab() > > - some shrinker are blocked for too long. Like the case > > mentioned in the patchset[1]. > > > > Therefore, many times in history ([2],[3],[4],[5]), some > > people wanted to replace shrinker_rwsem reader with SRCU, > > but they all gave up because SRCU was not unconditionally > > enabled. > > > > But now, since commit 1cd0bd06093c ("rcu: Remove CONFIG_SRCU"), > > the SRCU is unconditionally enabled. So it's time to use > > SRCU to protect readers who previously held shrinker_rwsem. > > > > [1]. https://lore.kernel.org/lkml/20191129214541.3110-1-ptikhomirov@xxxxxxxxxxxxx/ > > [2]. https://lore.kernel.org/all/1437080113.3596.2.camel@xxxxxxxxxxxx/ > > [3]. https://lore.kernel.org/lkml/1510609063-3327-1-git-send-email-penguin-kernel@xxxxxxxxxxxxxxxxxxx/ > > [4]. https://lore.kernel.org/lkml/153365347929.19074.12509495712735843805.stgit@localhost.localdomain/ > > [5]. https://lore.kernel.org/lkml/20210927074823.5825-1-sultan@xxxxxxxxxxxxxxx/ > > > > Signed-off-by: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx> > > --- > > mm/vmscan.c | 27 +++++++++++---------------- > > 1 file changed, 11 insertions(+), 16 deletions(-) > > > > diff --git a/mm/vmscan.c b/mm/vmscan.c > > index 9f895ca6216c..02987a6f95d1 100644 > > --- a/mm/vmscan.c > > +++ b/mm/vmscan.c > > @@ -202,6 +202,7 @@ static void set_task_reclaim_state(struct task_struct *task, > > > > LIST_HEAD(shrinker_list); > > DECLARE_RWSEM(shrinker_rwsem); > > +DEFINE_SRCU(shrinker_srcu); > > > > #ifdef CONFIG_MEMCG > > static int shrinker_nr_max; > > @@ -706,7 +707,7 @@ void free_prealloced_shrinker(struct shrinker *shrinker) > > void register_shrinker_prepared(struct shrinker *shrinker) > > { > > down_write(&shrinker_rwsem); > > I think you could revert the rwsem back to a simple mutex, now. > NVM, that's exactly what patch 7 does. :)