From patchwork Mon Sep 11 09:44:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zheng X-Patchwork-Id: 13379121 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 0A561EE57DF for ; Mon, 11 Sep 2023 09:51:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A4D416B0273; Mon, 11 Sep 2023 05:51:56 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9FDB36B0274; Mon, 11 Sep 2023 05:51:56 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8C6086B0275; Mon, 11 Sep 2023 05:51:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 7CEB46B0273 for ; Mon, 11 Sep 2023 05:51:56 -0400 (EDT) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 5A7EE80929 for ; Mon, 11 Sep 2023 09:51:56 +0000 (UTC) X-FDA: 81223850232.21.3150767 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) by imf05.hostedemail.com (Postfix) with ESMTP id 7203B10000F for ; Mon, 11 Sep 2023 09:51:54 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=KlkaQqyv; dmarc=pass (policy=quarantine) header.from=bytedance.com; spf=pass (imf05.hostedemail.com: domain of zhengqi.arch@bytedance.com designates 209.85.214.175 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=1694425914; 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=oLAG3LFr2H9IpWa0Q1CUXr98GG6fWERP+Y/K9cMxF58=; b=PRapz2bPABeFe+RSD/90kEQis6gkt2IXwJ/HmN1T0kEW/MiYRzVS6m1xFVzY92N9tgcDOX Wo7IHOufx/tLtd69E+Nl4khtWEYoG7PH3B6v5TiTttlUzR4CPKkHdLt4oajcI4ZyQGR42c M7ZhDHHUzZZCekNO1sj51D474a5XbnI= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=KlkaQqyv; dmarc=pass (policy=quarantine) header.from=bytedance.com; spf=pass (imf05.hostedemail.com: domain of zhengqi.arch@bytedance.com designates 209.85.214.175 as permitted sender) smtp.mailfrom=zhengqi.arch@bytedance.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1694425914; a=rsa-sha256; cv=none; b=F5frCx/+azTo5sCPhVBQeZfpqdsQ+C7vxSBfLcNU6wZ3J5kWlsJInNb6aSRQdTbREY74uG +LDanx87X4Serls5F/Sej/9XGL72mNdPLW3wHukYHsbYN8Ze3ylL4ECcWRmfQWXITX08FO mRbPcIiSJm0srYUsTjVRXhopziwGRgU= Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-1bf7b5e1f06so7715415ad.0 for ; Mon, 11 Sep 2023 02:51:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1694425913; x=1695030713; darn=kvack.org; 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=oLAG3LFr2H9IpWa0Q1CUXr98GG6fWERP+Y/K9cMxF58=; b=KlkaQqyv+hHTw+h95qG+qfsn26xqezylPlQY2VNOjmS8vhOVMbrPmDcchklZ4NCL5t QvxOoNgAtz6MeT9h71rFy9G5W3JPHDMsPmPKLXe6/Ew1/Hnf/WBqCcOX7hAYMu1wlOfF ZtniRi5CoDKRySorhudUzJ24Rigz8WLhiQxmHcP/q/G3MApICIw6DPYV68FYLSd6wN5W knEhZP7D5mI0FdLPLsWC7byvRcOPDDdZCYPOuM38cBd2RB7qgP258nOQol857lNd/0In rjaOMKYAviBJLFuoweS51pZTrFPgy3yKBt+gtdCuxB1XKE0gvaw+mrrLRiIpJfshCJdD wkvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694425913; x=1695030713; 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=oLAG3LFr2H9IpWa0Q1CUXr98GG6fWERP+Y/K9cMxF58=; b=IC5M07UZ1Vtt9ntY/VnXwc0sXGnIQl34obzhJKYLbUunI1BlEe+Tx3qPmXQi1DgX4a TApc0Imb+ajUq3R3kBqFVhPa8fxsRqTordsRx3zanGkwM8Ie8ElivEKop/eTsKUApCfu jkI4DRhbYH0cmIYxnyF/dbCrVEWIIEG4EbrlPbsh4wKzyI6s0E8RukNxuyqTmON5V82O wuYkj8qTQtqj/+JEfyxD/7ESGaCS/LckXTzM1ziZ30Bo3+oYzc60GRlu4hKHJaDCkxtK wcMRzeHb8Z8MewQ4HC4NNcU6ijoiaEQlFu3B2XG9vBuszE257YYbEuEsrpKKbVz+Ud5u N6Aw== X-Gm-Message-State: AOJu0YxnTyrMSluhrYnIK8B7kXQAYtrH3lbVhCia/EXHu//D8aA2vhr5 CBEerDLwYKEYtACRPt1wAJ2m9w== X-Google-Smtp-Source: AGHT+IGwEyIZI7e/UGLTPntdnRUQTR+mAjNl7rxKGC9aX+dD26VCCxP8WJPLnCYFs0FvhQRvA39K8A== X-Received: by 2002:a17:902:f155:b0:1c3:a4f2:7c99 with SMTP id d21-20020a170902f15500b001c3a4f27c99mr5142339plb.4.1694425913461; Mon, 11 Sep 2023 02:51:53 -0700 (PDT) Received: from C02DW0BEMD6R.bytedance.net ([203.208.167.146]) by smtp.gmail.com with ESMTPSA id az7-20020a170902a58700b001bdc2fdcf7esm5988188plb.129.2023.09.11.02.51.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Sep 2023 02:51:53 -0700 (PDT) From: Qi Zheng To: akpm@linux-foundation.org, david@fromorbit.com, tkhai@ya.ru, vbabka@suse.cz, roman.gushchin@linux.dev, djwong@kernel.org, brauner@kernel.org, paulmck@kernel.org, tytso@mit.edu, steven.price@arm.com, cel@kernel.org, senozhatsky@chromium.org, yujie.liu@intel.com, gregkh@linuxfoundation.org, muchun.song@linux.dev Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, Qi Zheng Subject: [PATCH v6 45/45] mm: shrinker: convert shrinker_rwsem to mutex Date: Mon, 11 Sep 2023 17:44:44 +0800 Message-Id: <20230911094444.68966-46-zhengqi.arch@bytedance.com> X-Mailer: git-send-email 2.24.3 (Apple Git-128) In-Reply-To: <20230911094444.68966-1-zhengqi.arch@bytedance.com> References: <20230911094444.68966-1-zhengqi.arch@bytedance.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 7203B10000F X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: 99y4e5txdzr8uhwop4aforne8e44aqpa X-HE-Tag: 1694425914-90347 X-HE-Meta: U2FsdGVkX1+TlPxcU0TGeUKRr4JwjezdunsgofFr5Sn8ERLnYh5rEF12z5UboUosxBp44HK5JUuFFRd2gWX4yQmLCO7ADMbcniyyfQwAUvHXBeqyK5na4oOatgiRKHItx2jXrBwns4lcOWM3a2IS/QUZjAPeBEhkexxrJCpt6UbXaD3cEtc3nGA8EH6R6q3ezaEvUwmnlgONMpWnvLVtqA9rHwYRsDPRP6A7b/g6WLPlEAvsiaXdxPaY7FZIAWqcZEJbGduFQ4RUbE+SYeEbzyLmrcfUA4W6xC41hN02e+9wkUkuhEsTMWbyhN95sQCdUVGbYjTcMs1SrT9fg6jrGXsBuwN4HOfeAlUlijmBI2vr4Dw9ToA5gHLSBrpW/0O6vu8t0l3dVkUUPlyqs2bD6i7epKpnH/m1X0F5CqvFTcjpQ2M/6/3+nW3YAK0ac7K/3LLxjMGLDs2mZ6UEmEdao/1/XzRkQxQo7hUI2sZpQm9zmwgqWfRi5FLuzqM4Vhyva5gnqR9MW58YnNgioCBgEasfLQ1tSfkGpFNfURGPz9CQWdIbbls1lJVXlCPcdrN3EG84KA7ZaNpcFP7sWPaJC1bEzB2MMInCQmqdwBtmGNCZPuCMKSfnfq+Zf/Dj2MdXe0obiL5UomvwzirkgFOxCwohoxheMEBMrdmn3D3jWui35d7JgTy+PQGQNmFnImXRskdCexdfLq5cQAaaj78nQNER6zaDTBGzRlT3ym1ejDUEjcgSfOYx2zStAorgxvI/kGSWrLvFpfhtiDJr/xousW7/OrJnXtZ4p/vtvJtDz9AikfClk+Z2jnFfFi++1g/MWjzciEy/ozUdvG4jR9PWAUGmLHMWHrAovOsGuickyjslmLQ/e4913rU/lCNyo2+rK1g9UQdzlHysdOGZm2Xai1IwS8NfwRpxPSdcnwzHCIanfCuEur6rmsmOZvmYvZCc8RYMoJhFerpkzv3SdTn TPkk5EIF V19gtmzGTz7E7AjBCAJkT+aRgOjwJ2WEYItNjCxFgiAi8Gr4ZAIjhaYFcLDCYiAuEFsJp5t/rjZHFy8St3mg1z/IX7ma8RQhaQyAfJhBMkDjGFQlrL8R1zDSi5RVbKd0gBk1znL+uAaTaIeF1El9JzB3otlnXUtG5KsPgnC2QguFud8qb3wghR8pySSPclkcxXFY+a6GfJ716nEVwJJw6tEb7lwGSryKmDsAb1cQF8Eh/MS6ItldGB+wxdS3dlgPljwxCUzZs134jVyB9NOcP4vt3x1iSJBangyVXx+Latxu8m8sFXJeFByNGEbBNVGIbRCeEZXnMdgy7AiBp+0KRCLVRz7m+/RTMO8FgY+tmDFaBF3YTHKtulO4zpqNCo3GZWXHPosjNfrwOrhRcr1xMe6DWVLPgrY4f6Qx0/ZYq7vwnIM1RG5ydnEbq1tY67wc4GuPvbepqY8er8iZtG05ZubMHyw== 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 Reviewed-by: Muchun Song --- drivers/md/dm-cache-metadata.c | 2 +- fs/super.c | 2 +- mm/shrinker.c | 28 ++++++++++++++-------------- mm/shrinker_debug.c | 14 +++++++------- 4 files changed, 23 insertions(+), 23 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/fs/super.c b/fs/super.c index adadf6689611..816a22a5cad1 100644 --- a/fs/super.c +++ b/fs/super.c @@ -178,7 +178,7 @@ static void super_wake(struct super_block *sb, unsigned int flag) * 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.c b/mm/shrinker.c index 471c07d75c4a..2c44c3d7afe9 100644 --- a/mm/shrinker.c +++ b/mm/shrinker.c @@ -8,7 +8,7 @@ #include "internal.h" LIST_HEAD(shrinker_list); -DECLARE_RWSEM(shrinker_rwsem); +DEFINE_MUTEX(shrinker_mutex); #ifdef CONFIG_MEMCG static int shrinker_nr_max; @@ -80,7 +80,7 @@ int alloc_shrinker_info(struct mem_cgroup *memcg) int nid, ret = 0; int array_size = 0; - down_write(&shrinker_rwsem); + mutex_lock(&shrinker_mutex); array_size = shrinker_unit_size(shrinker_nr_max); for_each_node(nid) { info = kvzalloc_node(sizeof(*info) + array_size, GFP_KERNEL, nid); @@ -91,7 +91,7 @@ int alloc_shrinker_info(struct mem_cgroup *memcg) goto err; rcu_assign_pointer(memcg->nodeinfo[nid]->shrinker_info, info); } - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); return ret; @@ -104,7 +104,7 @@ static struct shrinker_info *shrinker_info_protected(struct mem_cgroup *memcg, int nid) { return rcu_dereference_protected(memcg->nodeinfo[nid]->shrinker_info, - lockdep_is_held(&shrinker_rwsem)); + lockdep_is_held(&shrinker_mutex)); } static int expand_one_shrinker_info(struct mem_cgroup *memcg, int new_size, @@ -154,7 +154,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); new_size = shrinker_unit_size(new_nr_max); old_size = shrinker_unit_size(shrinker_nr_max); @@ -217,7 +217,7 @@ static int shrinker_memcg_alloc(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; @@ -231,7 +231,7 @@ static int shrinker_memcg_alloc(struct shrinker *shrinker) shrinker->id = id; ret = 0; unlock: - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); return ret; } @@ -241,7 +241,7 @@ static void shrinker_memcg_remove(struct shrinker *shrinker) BUG_ON(id < 0); - lockdep_assert_held(&shrinker_rwsem); + lockdep_assert_held(&shrinker_mutex); idr_remove(&shrinker_idr, id); } @@ -292,7 +292,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); @@ -305,7 +305,7 @@ void reparent_shrinker_deferred(struct mem_cgroup *memcg) } } } - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); } #else static int shrinker_memcg_alloc(struct shrinker *shrinker) @@ -735,11 +735,11 @@ void shrinker_register(struct shrinker *shrinker) return; } - 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); init_completion(&shrinker->done); /* @@ -779,7 +779,7 @@ void shrinker_free(struct shrinker *shrinker) wait_for_completion(&shrinker->done); } - down_write(&shrinker_rwsem); + mutex_lock(&shrinker_mutex); if (shrinker->flags & SHRINKER_REGISTERED) { /* * Now we can safely remove it from the shrinker_list and then @@ -794,7 +794,7 @@ void shrinker_free(struct shrinker *shrinker) if (shrinker->flags & SHRINKER_MEMCG_AWARE) shrinker_memcg_remove(shrinker); - up_write(&shrinker_rwsem); + mutex_unlock(&shrinker_mutex); if (debugfs_entry) shrinker_debugfs_remove(debugfs_entry, debugfs_id); diff --git a/mm/shrinker_debug.c b/mm/shrinker_debug.c index 38452f539f40..c80fd124f605 100644 --- a/mm/shrinker_debug.c +++ b/mm/shrinker_debug.c @@ -9,7 +9,7 @@ #include "internal.h" /* defined in vmscan.c */ -extern struct rw_semaphore shrinker_rwsem; +extern struct mutex shrinker_mutex; extern struct list_head shrinker_list; static DEFINE_IDA(shrinker_debugfs_ida); @@ -165,7 +165,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) @@ -222,7 +222,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; @@ -240,7 +240,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); @@ -253,7 +253,7 @@ struct dentry *shrinker_debugfs_detach(struct shrinker *shrinker, { struct dentry *entry = shrinker->debugfs_entry; - lockdep_assert_held(&shrinker_rwsem); + lockdep_assert_held(&shrinker_mutex); shrinker_debugfs_name_free(shrinker); @@ -281,14 +281,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; }