From patchwork Thu Feb 23 13:27:25 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zheng X-Patchwork-Id: 13150331 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6478BC636D6 for ; Thu, 23 Feb 2023 13:28:36 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 082D46B0073; Thu, 23 Feb 2023 08:28:36 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 032DC6B0082; Thu, 23 Feb 2023 08:28:35 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E15FC6B0083; Thu, 23 Feb 2023 08:28:35 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id D41DD6B0073 for ; Thu, 23 Feb 2023 08:28:35 -0500 (EST) Received: from smtpin04.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id A0328804B1 for ; Thu, 23 Feb 2023 13:28:35 +0000 (UTC) X-FDA: 80498636190.04.CC3A086 Received: from mail-pg1-f171.google.com (mail-pg1-f171.google.com [209.85.215.171]) by imf21.hostedemail.com (Postfix) with ESMTP id C436D1C0002 for ; Thu, 23 Feb 2023 13:28:33 +0000 (UTC) Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=F520qmCv; dmarc=pass (policy=none) header.from=bytedance.com; spf=pass (imf21.hostedemail.com: domain of zhengqi.arch@bytedance.com designates 209.85.215.171 as permitted sender) smtp.mailfrom=zhengqi.arch@bytedance.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1677158913; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=RPT0nfWhMLdXxcydHyGYHy0yeE/SVJFKwHgDhpkqgDM=; b=A394GCJ/3YTpDeAtXUhhelMEusA6U85Zk3GjbOYY1ZIrEL+PbbIYssvldDbYbtS/GZW91x 5wCNkDsx3trhXcCN36gzWB2YeGeSQt+hw0J8YRRrZjiUVKv+bc+DBfVX4VMSbkTKv0OPYF Ks1UDkqKeWjLQNIoPj2/2eB/Ur2CQO0= ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=F520qmCv; dmarc=pass (policy=none) header.from=bytedance.com; spf=pass (imf21.hostedemail.com: domain of zhengqi.arch@bytedance.com designates 209.85.215.171 as permitted sender) smtp.mailfrom=zhengqi.arch@bytedance.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1677158913; a=rsa-sha256; cv=none; b=AMWsSDagiMt8dlesipoUQu687WVqrlVKamaHdOL191PmpXvEG4rW4u+j/d6cwgZbJ3QY4d /H7RlpBWt5CKqeK/c698mE6EH5P0KFc5k0vyryv2MMsPZKq22GUqu8KEX8NsQszxiUV1t5 tggrwSLqcztAqPYxY9v5QSKMzDfnGzg= Received: by mail-pg1-f171.google.com with SMTP id d6so2394815pgu.2 for ; Thu, 23 Feb 2023 05:28:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1677158912; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RPT0nfWhMLdXxcydHyGYHy0yeE/SVJFKwHgDhpkqgDM=; b=F520qmCvl0UEhHNkuOAEZmp1N3sJcaWVf0fYb3nWYbFg7xaH1VreJ8NIxoJDOHmFWr fELDUoigMokRIqsdrxc8qGRde4TK1nfn/8m7o3tkhJa2mENEjDgadGrxnY5rqaQzkamU /RQ3vIZgVEe9OraPz+1/MMz1EuxiVvI+ZzojzqD2odCLdWNcrBtEzqVENWF6dvVswnZp a5ziG4nnVMEgF32yQD6np3wXBRQz+Q5XT41L4iM1wqrQtqSrf4Zc9extvwH12AOU6F09 0I920tJGW3EBzguj8MSWNnfH8JyQvo7rAULuvJmoQCsifU2+4i+3CRIKl8d3zaj+Lf9T fE0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677158912; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RPT0nfWhMLdXxcydHyGYHy0yeE/SVJFKwHgDhpkqgDM=; b=WieeDClsvAJUQROir8oUtEaa9w1XGDQXyZeLFXdmeoNtypj8RfWaSNwMRTM7DHPex0 FWoPfostDcpC9Z5dkHmrIlrC8i6exklcnnZbxzB11Z976FHC0vEdgHnRL4vqVw7pxdpM +4LH542ZjgCtbbEbWlCWIPDwSyGwpthgmK+yCvc+Ni4S7GP8JtwGZrUnDlYVANLduLuB yJ6bZrZlKfkSglioeNCVqZDEzqXH5gvUnT83wI8PAHspInTqMd+Ey9Xo+7K8t6CoicMq ISqkuhk0RdnNlw+L/ooYQWkMJ9YbRCRzl7NzIqhnuCF31zNseYhwPOylsePoElyiR/pN fOZQ== X-Gm-Message-State: AO0yUKVXqYzzrxKyOEwA3Muwyp6ZniSdfQl9Ly1+tMdalAOQ1o2S0Ntx KA2wmTT4Ih2NIO+0M98co3EUyQ== X-Google-Smtp-Source: AK7set/SbEDbsO6C9L1y9CGpBIcDIvy9sr0sucapoT0kr6uR9zXluUZnIOxXK5HS7OjmFknadGlwnA== X-Received: by 2002:a05:6a00:4006:b0:5d9:f3a6:ef8e with SMTP id by6-20020a056a00400600b005d9f3a6ef8emr3764664pfb.2.1677158912664; Thu, 23 Feb 2023 05:28:32 -0800 (PST) Received: from C02DW0BEMD6R.bytedance.net ([139.177.225.245]) by smtp.gmail.com with ESMTPSA id g18-20020aa78752000000b005a9bf65b591sm3848591pfo.135.2023.02.23.05.28.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Feb 2023 05:28:32 -0800 (PST) From: Qi Zheng To: akpm@linux-foundation.org, tkhai@ya.ru, hannes@cmpxchg.org, shakeelb@google.com, mhocko@kernel.org, roman.gushchin@linux.dev, muchun.song@linux.dev, david@redhat.com, shy828301@gmail.com Cc: sultan@kerneltoast.com, dave@stgolabs.net, penguin-kernel@I-love.SAKURA.ne.jp, paulmck@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Qi Zheng Subject: [PATCH v2 7/7] mm: shrinkers: convert shrinker_rwsem to mutex Date: Thu, 23 Feb 2023 21:27:25 +0800 Message-Id: <20230223132725.11685-8-zhengqi.arch@bytedance.com> X-Mailer: git-send-email 2.24.3 (Apple Git-128) In-Reply-To: <20230223132725.11685-1-zhengqi.arch@bytedance.com> References: <20230223132725.11685-1-zhengqi.arch@bytedance.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: C436D1C0002 X-Rspamd-Server: rspam09 X-Rspam-User: X-Stat-Signature: g1gr8t9o6tohimsa85fq9bobh87zes8q X-HE-Tag: 1677158913-890708 X-HE-Meta: U2FsdGVkX1/mzQxBzAsqmYeNecTXxVkyiQsDBSYezqTzVh8ejf3mJWjYnf1lXonVRtDozH4EpXrHP3SRChz3/nzQsz/VOMD0GaVgCkgnVfSlcMurOaSWtmeKXSOJ14zapQBza4asofCwjD2npDcKzwrCasdQPrQaJIcCTHdrFQSxzXhVs9dLsrH4Iwpjqa/VPfi4F/W5D7zeR5vWFDwf84uko+L7Y9v7vUhR4ibmFutre+MKjUaB4opHFGe8YyOoUhaFwDf8wki0LtpFBj8pyZ3L99XLWED7cTZyJ8bKk1KX4q/GZ23xMUMZvr4VbYe+wZa2ygmP9znqglOfEAlOA/I0145VhNH3t/ZFH3a4EOf+iTMvhd8vR497ncU087/izYcHcBu1uTs0MKlDNSYv3SdFJDgfNnAfoRvBjGluElAm75HNkbLVglAjJXrTXgcEDc5BsFEyYutc8+p0LC0QsRkke+sOpQnQ9wRt2wxgzDJWJ0Vuab9Hcr9FyvdkZtm3HHzV0Q5VPDvHd7nMg/O4YlBDBGNTpYsvEVbwUWKoaUDhMKRpMNlYVWETr7UOfP0G6CBIO8unNqiMhETCM3w2xjTtO0qQ1apyjC7sOjO65t1wBWTgAQeCWmOhcTPGxEwwuZUVkdbYld0OCCLYJSSvuYLRLKkrj8vxDJpiERovQJx6oNuSc3V7GoEC5KK6IaFExkH0ZiQaGqz+4k611KobjJ5ALXKjaqO4ycYPQsw7fCxOscFaBG4a9J3sXFo/DHkF/lsksYdZPBFNwRDyI+OpwwM4wdJmD+n207jAlWRVDSKHVfLUb+ZX2EO9boTvou5L8Dtysfza/1bWU1Sio0oO6yzTgWI7DKEOZk2P3TeEZQ+ZVGEH6akUhx2oTN3EbO87uO7BRe/tko1oy4fPCw4NFrUhLbIY+agZc7GaJMX6FkM2Ap2Rgmbnj92Ebdab5q7HOn7ByW0cQF17zsHxx+i cF6ugK9J TljgHbdreHqhYrKf39YgIc+5TcU7yrs31KCpZZrj0t8+6U9XI9PnZjerFEN4npBKLH3tivJ8DIaxBjPs64P24Ao21mQE7ErS2JZbQ/w5xxcnBvojBE/1tdTjs8xwb5M2O6d1T+LQSsxDdLx7jCUW+zfrQrkRbYgh99HDCTAYSmzBdKwYfu6ZAMsqEyWJueUsv9d5bvFjGb2/Xpbd5WlA+YRS8F/qsq2wbANrKjLHaUf/x3JWpDRBZzMrtz3qFCe6veP0ZhvkV+WIyD80OCpIpKxAed+bfxiXMoRXYbFx/TGkIEGJheWd+SicklSsP2hfIDVoHjcIni79vInSsaoNcFK0+r3XrUWZLJQeIBeVlNu5xTUaXN39TihGva0jFaQqcl8GPBiGQcOOk5sndgQlxV/c3nym6CRjT2Nh3F8XDusFB/Vj8ta6AqLNqkVplCdbPBYjaK8b/HoH7yHWhXBaAdfInD4jSdPzVJFUu X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Now there are no readers of shrinker_rwsem, so we can simply replace it with mutex lock. Signed-off-by: Qi Zheng --- drivers/md/dm-cache-metadata.c | 2 +- drivers/md/dm-thin-metadata.c | 2 +- fs/super.c | 2 +- mm/shrinker_debug.c | 14 +++++++------- mm/vmscan.c | 34 +++++++++++++++++----------------- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c index acffed750e3e..9e0c69958587 100644 --- a/drivers/md/dm-cache-metadata.c +++ b/drivers/md/dm-cache-metadata.c @@ -1828,7 +1828,7 @@ int dm_cache_metadata_abort(struct dm_cache_metadata *cmd) * Replacement block manager (new_bm) is created and old_bm destroyed outside of * cmd root_lock to avoid ABBA deadlock that would result (due to life-cycle of * shrinker associated with the block manager's bufio client vs cmd root_lock). - * - must take shrinker_rwsem without holding cmd->root_lock + * - must take shrinker_mutex without holding cmd->root_lock */ new_bm = dm_block_manager_create(cmd->bdev, DM_CACHE_METADATA_BLOCK_SIZE << SECTOR_SHIFT, CACHE_MAX_CONCURRENT_LOCKS); diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index fd464fb024c3..9f5cb52c5763 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/drivers/md/dm-thin-metadata.c @@ -1887,7 +1887,7 @@ int dm_pool_abort_metadata(struct dm_pool_metadata *pmd) * Replacement block manager (new_bm) is created and old_bm destroyed outside of * pmd root_lock to avoid ABBA deadlock that would result (due to life-cycle of * shrinker associated with the block manager's bufio client vs pmd root_lock). - * - must take shrinker_rwsem without holding pmd->root_lock + * - must take shrinker_mutex without holding pmd->root_lock */ new_bm = dm_block_manager_create(pmd->bdev, THIN_METADATA_BLOCK_SIZE << SECTOR_SHIFT, THIN_MAX_CONCURRENT_LOCKS); diff --git a/fs/super.c b/fs/super.c index 84332d5cb817..91a4037b1d95 100644 --- a/fs/super.c +++ b/fs/super.c @@ -54,7 +54,7 @@ static char *sb_writers_name[SB_FREEZE_LEVELS] = { * One thing we have to be careful of with a per-sb shrinker is that we don't * drop the last active reference to the superblock from within the shrinker. * If that happens we could trigger unregistering the shrinker from within the - * shrinker path and that leads to deadlock on the shrinker_rwsem. Hence we + * shrinker path and that leads to deadlock on the shrinker_mutex. Hence we * take a passive reference to the superblock to avoid this from occurring. */ static unsigned long super_cache_scan(struct shrinker *shrink, diff --git a/mm/shrinker_debug.c b/mm/shrinker_debug.c index 6aa7a7ec69da..b0f6aff372df 100644 --- a/mm/shrinker_debug.c +++ b/mm/shrinker_debug.c @@ -7,7 +7,7 @@ #include /* defined in vmscan.c */ -extern struct rw_semaphore shrinker_rwsem; +extern struct mutex shrinker_mutex; extern struct list_head shrinker_list; extern struct srcu_struct shrinker_srcu; @@ -167,7 +167,7 @@ int shrinker_debugfs_add(struct shrinker *shrinker) char buf[128]; int id; - lockdep_assert_held(&shrinker_rwsem); + lockdep_assert_held(&shrinker_mutex); /* debugfs isn't initialized yet, add debugfs entries later. */ if (!shrinker_debugfs_root) @@ -210,7 +210,7 @@ int shrinker_debugfs_rename(struct shrinker *shrinker, const char *fmt, ...) if (!new) return -ENOMEM; - down_write(&shrinker_rwsem); + mutex_lock(&shrinker_mutex); old = shrinker->name; shrinker->name = new; @@ -228,7 +228,7 @@ int shrinker_debugfs_rename(struct shrinker *shrinker, const char *fmt, ...) shrinker->debugfs_entry = entry; } - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); kfree_const(old); @@ -240,7 +240,7 @@ struct dentry *shrinker_debugfs_remove(struct shrinker *shrinker) { struct dentry *entry = shrinker->debugfs_entry; - lockdep_assert_held(&shrinker_rwsem); + lockdep_assert_held(&shrinker_mutex); kfree_const(shrinker->name); shrinker->name = NULL; @@ -265,14 +265,14 @@ static int __init shrinker_debugfs_init(void) shrinker_debugfs_root = dentry; /* Create debugfs entries for shrinkers registered at boot */ - down_write(&shrinker_rwsem); + mutex_lock(&shrinker_mutex); list_for_each_entry(shrinker, &shrinker_list, list) if (!shrinker->debugfs_entry) { ret = shrinker_debugfs_add(shrinker); if (ret) break; } - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); return ret; } diff --git a/mm/vmscan.c b/mm/vmscan.c index d1a95d60d127..27ef9946ae8a 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include @@ -202,7 +202,7 @@ static void set_task_reclaim_state(struct task_struct *task, } LIST_HEAD(shrinker_list); -DECLARE_RWSEM(shrinker_rwsem); +DEFINE_MUTEX(shrinker_mutex); DEFINE_SRCU(shrinker_srcu); #ifdef CONFIG_MEMCG @@ -224,7 +224,7 @@ static struct shrinker_info *shrinker_info_protected(struct mem_cgroup *memcg, { return srcu_dereference_check(memcg->nodeinfo[nid]->shrinker_info, &shrinker_srcu, - lockdep_is_held(&shrinker_rwsem)); + lockdep_is_held(&shrinker_mutex)); } static struct shrinker_info *shrinker_info_srcu(struct mem_cgroup *memcg, @@ -308,7 +308,7 @@ int alloc_shrinker_info(struct mem_cgroup *memcg) int nid, size, ret = 0; int map_size, defer_size = 0; - down_write(&shrinker_rwsem); + mutex_lock(&shrinker_mutex); map_size = shrinker_map_size(shrinker_nr_max); defer_size = shrinker_defer_size(shrinker_nr_max); size = map_size + defer_size; @@ -324,7 +324,7 @@ int alloc_shrinker_info(struct mem_cgroup *memcg) info->map_nr_max = shrinker_nr_max; rcu_assign_pointer(memcg->nodeinfo[nid]->shrinker_info, info); } - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); return ret; } @@ -343,7 +343,7 @@ static int expand_shrinker_info(int new_id) if (!root_mem_cgroup) goto out; - lockdep_assert_held(&shrinker_rwsem); + lockdep_assert_held(&shrinker_mutex); map_size = shrinker_map_size(new_nr_max); defer_size = shrinker_defer_size(new_nr_max); @@ -391,7 +391,7 @@ static int prealloc_memcg_shrinker(struct shrinker *shrinker) if (mem_cgroup_disabled()) return -ENOSYS; - down_write(&shrinker_rwsem); + mutex_lock(&shrinker_mutex); id = idr_alloc(&shrinker_idr, shrinker, 0, 0, GFP_KERNEL); if (id < 0) goto unlock; @@ -405,7 +405,7 @@ static int prealloc_memcg_shrinker(struct shrinker *shrinker) shrinker->id = id; ret = 0; unlock: - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); return ret; } @@ -415,7 +415,7 @@ static void unregister_memcg_shrinker(struct shrinker *shrinker) BUG_ON(id < 0); - lockdep_assert_held(&shrinker_rwsem); + lockdep_assert_held(&shrinker_mutex); idr_remove(&shrinker_idr, id); } @@ -450,7 +450,7 @@ void reparent_shrinker_deferred(struct mem_cgroup *memcg) parent = root_mem_cgroup; /* Prevent from concurrent shrinker_info expand */ - down_write(&shrinker_rwsem); + mutex_lock(&shrinker_mutex); for_each_node(nid) { child_info = shrinker_info_protected(memcg, nid); parent_info = shrinker_info_protected(parent, nid); @@ -459,7 +459,7 @@ void reparent_shrinker_deferred(struct mem_cgroup *memcg) atomic_long_add(nr, &parent_info->nr_deferred[i]); } } - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); } static bool cgroup_reclaim(struct scan_control *sc) @@ -708,9 +708,9 @@ void free_prealloced_shrinker(struct shrinker *shrinker) shrinker->name = NULL; #endif if (shrinker->flags & SHRINKER_MEMCG_AWARE) { - down_write(&shrinker_rwsem); + mutex_lock(&shrinker_mutex); unregister_memcg_shrinker(shrinker); - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); return; } @@ -720,11 +720,11 @@ void free_prealloced_shrinker(struct shrinker *shrinker) void register_shrinker_prepared(struct shrinker *shrinker) { - down_write(&shrinker_rwsem); + mutex_lock(&shrinker_mutex); list_add_tail_rcu(&shrinker->list, &shrinker_list); shrinker->flags |= SHRINKER_REGISTERED; shrinker_debugfs_add(shrinker); - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); } static int __register_shrinker(struct shrinker *shrinker) @@ -774,13 +774,13 @@ void unregister_shrinker(struct shrinker *shrinker) if (!(shrinker->flags & SHRINKER_REGISTERED)) return; - down_write(&shrinker_rwsem); + mutex_lock(&shrinker_mutex); list_del_rcu(&shrinker->list); shrinker->flags &= ~SHRINKER_REGISTERED; if (shrinker->flags & SHRINKER_MEMCG_AWARE) unregister_memcg_shrinker(shrinker); debugfs_entry = shrinker_debugfs_remove(shrinker); - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); synchronize_srcu(&shrinker_srcu);