From patchwork Mon Feb 20 09:16:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zheng X-Patchwork-Id: 13146182 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 C81F7C6379F for ; Mon, 20 Feb 2023 09:17:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6963B6B0078; Mon, 20 Feb 2023 04:17:33 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 646BC6B007B; Mon, 20 Feb 2023 04:17:33 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 50E6E6B007D; Mon, 20 Feb 2023 04:17:33 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 3F9606B0078 for ; Mon, 20 Feb 2023 04:17:33 -0500 (EST) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 18450A0EF0 for ; Mon, 20 Feb 2023 09:17:33 +0000 (UTC) X-FDA: 80487117186.08.56CA113 Received: from mail-pj1-f42.google.com (mail-pj1-f42.google.com [209.85.216.42]) by imf22.hostedemail.com (Postfix) with ESMTP id 49B45C0014 for ; Mon, 20 Feb 2023 09:17:31 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=bytedance-com.20210112.gappssmtp.com header.s=20210112 header.b=4puz4Jgz; spf=pass (imf22.hostedemail.com: domain of zhengqi.arch@bytedance.com designates 209.85.216.42 as permitted sender) smtp.mailfrom=zhengqi.arch@bytedance.com; dmarc=pass (policy=none) header.from=bytedance.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1676884651; 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=3B7sNafZtBlgHmh5fpLAa14mnyUBnuiEHhgxOSu4EUY=; b=th/A/KhYDdIjYxa842mBSOQb3FnFLStgBQ6ST1Al3/GabuSkJyZn9nvguoBKhEM8LAmUki fvYf0J1BBCzWROeW6ud1j8Ctth7RCro9jEaYAOaWkC08vf6Y0Bpg4Nn2sul76pgpKsicS2 d8vu97AtKyelQkTabllCYtL1KodrWTo= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=bytedance-com.20210112.gappssmtp.com header.s=20210112 header.b=4puz4Jgz; spf=pass (imf22.hostedemail.com: domain of zhengqi.arch@bytedance.com designates 209.85.216.42 as permitted sender) smtp.mailfrom=zhengqi.arch@bytedance.com; dmarc=pass (policy=none) header.from=bytedance.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1676884651; a=rsa-sha256; cv=none; b=he7GmOHYzXfRwAlgbWIenT1FvtT294YKL0PVOb3HgyV6SeZnhMwdAEN8f0IHT6rgi98vmi l2l07QM2AU2vEMXC1XgSTS0xDu2YITZ1cx0g3bCuXeTlHz3qhXl0dAJuyH+2LznanUu0uA LHr6Y8gEOQkcQuqPTxmJ+RcSa0cPiSo= Received: by mail-pj1-f42.google.com with SMTP id i1-20020a17090ad34100b00234463de251so454801pjx.3 for ; Mon, 20 Feb 2023 01:17:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; 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=3B7sNafZtBlgHmh5fpLAa14mnyUBnuiEHhgxOSu4EUY=; b=4puz4Jgz93txeceBh3fQ+lEdkKu9A4lOtC1kYgX78UKROjsP3O5+Y11jVMsovlB8oU sXuaRzKA6g9H9MXb3TdaF5sp9f/QMmV6iVKEx444zjffMm5LRNXcvYaal2t+iybJaLjY dOAt6AzfkgtaTHsJmUt79SpRjjglW8OOcC+KtEe+U5VqwR2qSZOga5VUjMCAWJRD00IM JG/qWE7eie2G7sZ4cJOwULL9sO4k8JkKSdEghpO73ZZLKfjRUL1R74gz0k7djhVwirUQ TM5T4chfi9rC4wta62Q+8DdRwAl1M2SQDAocd2oBCkh1qD+vWeFfRIBKkH20GK8x1S4Z r++w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=3B7sNafZtBlgHmh5fpLAa14mnyUBnuiEHhgxOSu4EUY=; b=hcP/vn/jDzLz0dfCV40SdWdV/6ty91yGoZ65+/Kll0sAgItxSgtTozRygPSWL48wMa tzpesY0KfXPFyzLXf1PAgYTvutyf24B2jSzXpDC96URp9TquJZLX6jo3Wz87ySARPMhT K447tVrAS2eCaYOWIfi3eo8tJqE7yzptAUEm64ozpX2RG4PkM4UsU8I2Iz7hqIhtY+kp sghZ4kCl97CDbrQApi9a+PkMtg+NZMbOpGLp4HATfjoaeDbQO20vMnlsDWidlPuI41Vp YfHTB3Y2+XGFH3b/16q0ivC4IW8fGIp4+OUq5PAFW4xMfgsd56gybWkbcQvnFY+ulL9V 46nA== X-Gm-Message-State: AO0yUKUvY2NjNtieAyiRvvfUg705306PWRpbglip26QMeHIFM4AC0Ooq 4PvaMyCIGtYVohgqcBDL/1vNoA== X-Google-Smtp-Source: AK7set/FrMA+DzzJjfgDbDVBnD4DP8OP+6IttlJ5FihjDu+ykoY0DseCdfCDQOT7VAaqhwcLBAHAYg== X-Received: by 2002:a17:90b:948:b0:236:7f67:8338 with SMTP id dw8-20020a17090b094800b002367f678338mr365975pjb.4.1676884650199; Mon, 20 Feb 2023 01:17:30 -0800 (PST) Received: from C02DW0BEMD6R.bytedance.net ([139.177.225.229]) by smtp.gmail.com with ESMTPSA id fs13-20020a17090af28d00b002339195a47bsm432382pjb.53.2023.02.20.01.17.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Feb 2023 01:17:29 -0800 (PST) From: Qi Zheng To: akpm@linux-foundation.org, hannes@cmpxchg.org, shakeelb@google.com, mhocko@kernel.org, roman.gushchin@linux.dev, muchun.song@linux.dev, david@redhat.com, shy828301@gmail.com Cc: tkhai@ya.ru, 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 5/5] mm: shrinkers: convert shrinker_rwsem to mutex Date: Mon, 20 Feb 2023 17:16:37 +0800 Message-Id: <20230220091637.64865-6-zhengqi.arch@bytedance.com> X-Mailer: git-send-email 2.24.3 (Apple Git-128) In-Reply-To: <20230220091637.64865-1-zhengqi.arch@bytedance.com> References: <20230220091637.64865-1-zhengqi.arch@bytedance.com> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam03 X-Stat-Signature: umgon37h7b1mmjm93zzonrx8gerxjz68 X-Rspamd-Queue-Id: 49B45C0014 X-HE-Tag: 1676884651-940082 X-HE-Meta: U2FsdGVkX1+kXmOIFxj9pgNXmdgh8LFcEdanlbv6uFA0kn2bqBBZrjcVG4fk84WA2PEW84ijW7qZTuMnD67mYWbA2YoTuigovs0iGw4bIBVtyFblyDoNG6uiFIngdOfDfrrPrtLeVnH3r3n/2cEvEBe9MUbZmsSrumkcTFNFB0MShWIgku8EFDywpu73aD06aiTQnI0XPZpqHLQWb9byGsv3CuGib5DNmKog1Yn7Swit5wYAqZK7JYZgxxs+Uni3AiPS/QKdnjufQWNu4XlYVAyBWxMTlh7h03JW3vWjUuuDe9BAH1Qe/v19ERdl+wh5H0Qkx4VuaxZlIBgLaGv3u52d+05mJmepe7IJT62Q6tnD/VE6rFKlOBi7RmXt5YEM8Wluw+aPqUU6MvvVyM/zswFdl/GYWa+/GLtqWzr4n2ui+jhQyvmb1fJG7JYvXKOmA2e+xSHjCztey1FMG3bRi/SsKtb7ZpicZPIKfZRJVpkaU3D1WjtZ2uJfevRpk9kR4izpajXTM8TlgFGoRHM9APTlggLFf8DA6La6/epA9ogpJuvkz/7TxR+Diy7HsYBAda9Ej+YPEBRH4SGekEcUTjYngec4qz1lcMQTzaXIgRP3ie9cEU+nRRoy+MyvHrxBpZKoJecKZE9M40aKG41GG4pzKRG/RaEyFKipoZA6Jh2bXLJo65OG9wOsCRBYKsNFH0D86xo3Escxv1X7yXkFAxBebFp5Nf1/wbcfotuU83Gwi1HewWBgVjAdobJ+DZ/zcvEt9wBnvfuznfjAZOFN9CdZrz8XjAq1meDj5AGGO5aYmSMhqNOrrXSIOh8JGCjRudlHj7n7+QLuN4J6PiezSfPrSO7kjfHbNREi47UVNEvEjJp32DAGX+G76NIeePEJMuWR109dAH9aNxj+U4tyKqHkDtkqprj0mWWWoJ459mG14kDwvjPSlMKVoAYa8FOWz1sRqUSgvH28T1cYPfA nIOOhxg5 UrGrC3rvrF/l4xRGLRmELMcQzufuz+tlACHw0MmoanCiUU1zcdlWBvmJjknDteQAa6L+rnGapV3VmqgTwLkbrwo7MYZrZTSFbp/3abCKveOxVG19HNO9j8fj/xtkfXle//ij0OOAnlpO11H1KDzPb7e7DBeyeG5+OtVMP8etxO1Me0lM5xmtZbBfA71sDCP+grzU+x/DA6BWN+i6xOMs4alEQ+lA4gw4U4047vfOp07dOA8UQFsSPHI9pj+QXQlfDFBRuL7veiRJ9UNko0Spg0GpMb8jqTtzfrLlLOtczht1KKQ+XYiSPtaRQfF45AaVQvdasvbJGr0GzbPrQPcw/Pf6tIs9vc1NP2RbRtfREXqER6JpscHAEueAIcIhOmKSnVWakWB3+oxF0g6EkgrWETfFHoHTGERYTitOz06zGd4yoqJGfoTD5KuBDjzYnQvZwm/mHsg9MhGGRy97evX1YgDaZ+LR+JmbRDJ2Sbk5N05LIwWtdUngXknyTXK379iY9+jU6cYaXXrzRIhsapCWT8uYJhRwXtf6zfOzc 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 | 30 +++++++++++++++--------------- 5 files changed, 25 insertions(+), 25 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 6a26e8ac40aa..4c3a5d9afb5c 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 b8da56beba96..f94bfe540675 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, @@ -297,7 +297,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; @@ -312,7 +312,7 @@ int alloc_shrinker_info(struct mem_cgroup *memcg) info->map = (void *)info->nr_deferred + defer_size; rcu_assign_pointer(memcg->nodeinfo[nid]->shrinker_info, info); } - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); return ret; } @@ -337,7 +337,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); @@ -384,7 +384,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; @@ -398,7 +398,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; } @@ -408,7 +408,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); } @@ -701,9 +701,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; } @@ -713,11 +713,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) @@ -767,13 +767,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);