From patchwork Thu Jun 22 08:39:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zheng X-Patchwork-Id: 13288500 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 64670EB64D8 for ; Thu, 22 Jun 2023 08:41:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 0202F8D0003; Thu, 22 Jun 2023 04:41:07 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id EEC058D0001; Thu, 22 Jun 2023 04:41:06 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DB37B8D0003; Thu, 22 Jun 2023 04:41:06 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id CDA208D0001 for ; Thu, 22 Jun 2023 04:41:06 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id A3EB8B0425 for ; Thu, 22 Jun 2023 08:41:06 +0000 (UTC) X-FDA: 80929738932.22.A26A5DF Received: from out-27.mta1.migadu.com (out-27.mta1.migadu.com [95.215.58.27]) by imf05.hostedemail.com (Postfix) with ESMTP id 005C810001B for ; Thu, 22 Jun 2023 08:41:04 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=j+7c8QSW; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf05.hostedemail.com: domain of qi.zheng@linux.dev designates 95.215.58.27 as permitted sender) smtp.mailfrom=qi.zheng@linux.dev ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1687423265; 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=Wvf6K8f0ibCbbBPSLzPuI3EieQihggBPVC6NaGqGSAA=; b=J5aqqpivxuIUazqE2+zmaoy8H5ftQAhNDCffIkDlFeSB0ZuAO3QXyw0ZKP5ELQJL1gsHjR Kj/rNTBMrlW+/rsKm5ma/IoR1cp66dNKvwYxiOs75M2WDA0FYatPJhZ8odmZt5picq0hNN UV5K5sWWIdqYoAKLb6VD8kpoGJkg0MU= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=j+7c8QSW; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf05.hostedemail.com: domain of qi.zheng@linux.dev designates 95.215.58.27 as permitted sender) smtp.mailfrom=qi.zheng@linux.dev ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1687423265; a=rsa-sha256; cv=none; b=dHQvuooKWcIwlTHDieOhheY+mNpBejJVenptDTtWPB+8MzBOU3sQ6kSUuP4Syt2NnIdXGg DwNceSwlo6cX+buINuYCAzKxDTa2pqI1JyVDqe/bzNQoSisc475FetbyA89dfvMQB5Fwhu 7be6IFdpp9JBJHudd+pY13Hf01d71Rk= X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1687423263; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Wvf6K8f0ibCbbBPSLzPuI3EieQihggBPVC6NaGqGSAA=; b=j+7c8QSWFcXyxaKKuBM4GeMmLTA2HAlnyi3uYH8tMDK+AyZd0VP/hv4q2gOUq3N/kRiA4T KkrjKn2/u+BKa5kHjWbSpVP512yylAb6LOOIyPKo6DOnVE0TNZkaj8fFOuY4ak/S6tGJxD J7gjjwvWCDcPoW60P1I/vRMb7nYCHBw= 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 Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, dm-devel@redhat.com, linux-raid@vger.kernel.org, linux-bcache@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-nfs@vger.kernel.org, linux-xfs@vger.kernel.org, linux-btrfs@vger.kernel.org, Qi Zheng Subject: [PATCH 09/29] bcache: dynamically allocate the md-bcache shrinker Date: Thu, 22 Jun 2023 08:39:12 +0000 Message-Id: <20230622083932.4090339-10-qi.zheng@linux.dev> In-Reply-To: <20230622083932.4090339-1-qi.zheng@linux.dev> References: <20230622083932.4090339-1-qi.zheng@linux.dev> MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 005C810001B X-Stat-Signature: y6qphqzawrhpr5equ3mqx737taubn1w1 X-HE-Tag: 1687423264-599633 X-HE-Meta: U2FsdGVkX1/LkUvOd0INDJ6ZrEUqkzlk39FCPbAWty3JGaNZ/kPGBfOAV/gGehNDolWf+s+m3QPHu5zPunGQswV6LrcXhy6066JlZuLXBmy3ZJLTRTlFYGl//ngxmJB5TcdGGV9CCDRf0M+ZkaR8bYfd1VxQ2u4RFIYnNduZ7/BR0Qnx91JbT6Q8yXtgsQsMwKXCylxdFdK1gKzbJolSIkwZg7JWgreWDeGCruB4sunbaqj8UGIjtdyvC+rjXb2qOdcMtqg57eXihjUho3+x/3Rz6dPz2GKKXEjbE46iNgKz9YZpOpn7k/VEiK8QZvMh0S/cKBNLdaBtRaIZfTSTMs1bNLgqsTto7CSZgfkDNjPcJ6y9vOdzCAne9chRTswzNgvyEADJ/IK/e76sOHr91ltn9S9HavoWnZfbTuZ9yvABRE/ylALgIor9aFUqKAJ3OKWeeevv8yQxoUDHMz3agAY1UJQMC4Pv9wCqtE9Q3rymrTLGTkL5SjBYD0W7nrkxBX9NG142OueKGU0mZc//w23azmO6ZCktKNuMuah5SZCs5b+L9UY9R/86Beia5MDbAvV0aB/Bvb9/WISnISmN5BFSGToMKW2cUTMA2uSmx5zuhwLUVqALMT5nGVRvXJDgSwjnDzDTOw+2BbAoFa9hfr9+ebzvVJCNq70Vq6ofuLPSeC8Nx1LDvDyTehjBuCm4fvihzhdpJJ3nsFlEmquFj18AnA5267209PldxEjOqC7jBJJb/LQqsEd+2nafWiN3ml5mSdHFvwz7QGYgXUitYqbrl1E02paFXTA38J8XsodmlqomsJRjvK6DqZf33LyL7DzkjDi/w+NTXPVSk1fd9mpraeb19RKGSfthGLVShb77XYJwCsQdvNTNacZK+/GIyUVfv0A6OxgZYuVwpXVlOfmZvXGFzGOXNtVhX5VC1WO2fC2lh8xjrEeFhEaCIy4r3m9uLcT54na9cl+Zf4k zM/zkuEF H0CXuTdo9zb6Zu3kABbOt/Xq7yQrUOy2QoYS73Qdi84qVKEQ0chls++J+aJQ7+kFPP4+Vj8EEgFNcoXqqmxjKR0PIOlo2knF8bs2Cpg8HCvAExZi/QYc37ntjUyAoz6JywDTNbXGsAs/uBF4= 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: From: Qi Zheng In preparation for implementing lockless slab shrink, we need to dynamically allocate the md-bcache shrinker, so that it can be freed asynchronously using kfree_rcu(). Then it doesn't need to wait for RCU read-side critical section when releasing the struct cache_set. Signed-off-by: Qi Zheng --- drivers/md/bcache/bcache.h | 2 +- drivers/md/bcache/btree.c | 23 ++++++++++++++--------- drivers/md/bcache/sysfs.c | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index 700dc5588d5f..53c73b372e7a 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h @@ -541,7 +541,7 @@ struct cache_set { struct bio_set bio_split; /* For the btree cache */ - struct shrinker shrink; + struct shrinker *shrink; /* For the btree cache and anything allocation related */ struct mutex bucket_lock; diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c index 569f48958bde..1131ae91f62a 100644 --- a/drivers/md/bcache/btree.c +++ b/drivers/md/bcache/btree.c @@ -667,7 +667,7 @@ static int mca_reap(struct btree *b, unsigned int min_order, bool flush) static unsigned long bch_mca_scan(struct shrinker *shrink, struct shrink_control *sc) { - struct cache_set *c = container_of(shrink, struct cache_set, shrink); + struct cache_set *c = shrink->private_data; struct btree *b, *t; unsigned long i, nr = sc->nr_to_scan; unsigned long freed = 0; @@ -734,7 +734,7 @@ static unsigned long bch_mca_scan(struct shrinker *shrink, static unsigned long bch_mca_count(struct shrinker *shrink, struct shrink_control *sc) { - struct cache_set *c = container_of(shrink, struct cache_set, shrink); + struct cache_set *c = shrink->private_data; if (c->shrinker_disabled) return 0; @@ -752,8 +752,8 @@ void bch_btree_cache_free(struct cache_set *c) closure_init_stack(&cl); - if (c->shrink.list.next) - unregister_shrinker(&c->shrink); + if (c->shrink->list.next) + unregister_and_free_shrinker(c->shrink); mutex_lock(&c->bucket_lock); @@ -828,14 +828,19 @@ int bch_btree_cache_alloc(struct cache_set *c) c->verify_data = NULL; #endif - c->shrink.count_objects = bch_mca_count; - c->shrink.scan_objects = bch_mca_scan; - c->shrink.seeks = 4; - c->shrink.batch = c->btree_pages * 2; + c->shrink = shrinker_alloc_and_init(bch_mca_count, bch_mca_scan, + c->btree_pages * 2, 4, 0, c); + if (!c->shrink) { + pr_warn("bcache: %s: could not allocate shrinker\n", + __func__); + return -ENOMEM; + } - if (register_shrinker(&c->shrink, "md-bcache:%pU", c->set_uuid)) + if (register_shrinker(c->shrink, "md-bcache:%pU", c->set_uuid)) { pr_warn("bcache: %s: could not register shrinker\n", __func__); + shrinker_free(c->shrink); + } return 0; } diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c index c6f677059214..771577581f52 100644 --- a/drivers/md/bcache/sysfs.c +++ b/drivers/md/bcache/sysfs.c @@ -866,7 +866,7 @@ STORE(__bch_cache_set) sc.gfp_mask = GFP_KERNEL; sc.nr_to_scan = strtoul_or_return(buf); - c->shrink.scan_objects(&c->shrink, &sc); + c->shrink->scan_objects(c->shrink, &sc); } sysfs_strtoul_clamp(congested_read_threshold_us,