Received: by 2002:a05:7412:419a:b0:f3:1519:9f41 with SMTP id i26csp4169803rdh; Tue, 28 Nov 2023 13:59:41 -0800 (PST) X-Google-Smtp-Source: AGHT+IGDChYnxBXZfpiBCSdPU8HyDp0DjPgYIRnEhLDoWuewSgSQOUeWYV4xEkO458ThuPbMRCrd X-Received: by 2002:a05:6808:e8e:b0:3ae:5442:ed1b with SMTP id k14-20020a0568080e8e00b003ae5442ed1bmr19996970oil.43.1701208781322; Tue, 28 Nov 2023 13:59:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701208781; cv=none; d=google.com; s=arc-20160816; b=g+z5FzVCr4HTteo9BcIFBMHjjCvoPkFj/ShgfOvDBfTq7s8EBpYs4OKcEjFtMiVo0B FJ7NjDdfeMh7ONYkDwsaij4m6wZNG/PtJ5+i/7gA0SS4a7vUZZkw+chZf3xcWriGXlVi gJoCiCjLqI9x4M/GREmybsh5t4Khd5GAW+wZlTjM0Q2PE5OujjDMulxnWmcSsDfgnDOE uUqdXPaHUHcuwWvtZhfFga1ud21giw3a9RuIn7WdV9yYtN1FsCt+IRcDkIzNppYwbMjy 1YP0+3/G0042e/snrxgJ5mAjT8dpJHbQig8A5V9pVvqPni/melycojWJXQ9c3Lc1eZsK DqOQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:user-agent:references:in-reply-to :message-id:date:cc:to:from:subject:dkim-signature; bh=VvjmbHUp5eNeGiFuLMOjnJPLEpUp4iDFrMLfJrX00oA=; fh=xkJJ9G/tfqFUcIeP82drScMuFzbH6I4bp3/iFRpdd9E=; b=dz5ncHy/MWCPyXR4ojq5ftncpDUDtiyhJV+0lW1uIoGYVIf0bau/k1Mjb4tq/pGNmH zC15Oz0MTiQthWnbh/rr0E+Lfl+RpkV9fKW3KkfmmOqW2AcwoT7130XXeeEZ/2dMZs91 DE5pSaqKm68RnBUonr0PIgKt6zY0DGlpGLyJyG3IU89AXhsFdsLwr7KOyP/t6+nXrExv 55c7Vb1TBskyJvSMLHNppP2dpT7mRjezyAUFtNO25/QuvPu2mtvSMvh7VnH6cFZ/y+fW TkALvc6gkuaKg1XnBZPadAi2n+EbvMbHU9b+Jm8lq+7XO7+vKnxrfPDyBrHgkgE+ogn1 pv2Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ZiovoDjl; spf=pass (google.com: domain of linux-nfs+bounces-140-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-nfs+bounces-140-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id x7-20020a654147000000b005bd0728aeccsi12400371pgp.407.2023.11.28.13.59.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Nov 2023 13:59:41 -0800 (PST) Received-SPF: pass (google.com: domain of linux-nfs+bounces-140-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ZiovoDjl; spf=pass (google.com: domain of linux-nfs+bounces-140-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-nfs+bounces-140-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id C3B0B28259D for ; Tue, 28 Nov 2023 21:59:40 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 69DBF42A8B; Tue, 28 Nov 2023 21:59:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZiovoDjl" X-Original-To: linux-nfs@vger.kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49E4744390; Tue, 28 Nov 2023 21:59:40 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E7A3AC433C8; Tue, 28 Nov 2023 21:59:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1701208780; bh=ss0SKz7Bkae4qXo5u1t+PWAxmh410AcZHe3AiuE4/DY=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=ZiovoDjlUgoUuZd4dFvzBtCVmpyHL5p2uHR1Dr7111JNBlwyDsnjqdLOxsQ1bPtCv RSOuxTlGGF8oQhykhFx4hQLfjtDbQ5080ewUQoD2RFAP2NopZwyXa2/iqChx2h9C5f oydkrbcBzVY+mukAeZo1FOsW2yyRlFwuA2Sav3qUYJQ7tOTl5u+p+6drh9NYxPTOev xKNhXkt8te7+Jvz8QLRkUSoU3kA/34Kcu/WDnyadRqvNclmvrf+FFuQByo2foGHDzm Ruo1cACMyViGgMJ6XBTXqrRNorOQNhOhdwQcvZ4fNgsPMWhemvoYogsYVJ2sl2s6K5 Wp+Ia6bj/zglg== Subject: [PATCH 1/8] NFSD: Refactor nfsd_reply_cache_free_locked() From: Chuck Lever To: stable@vger.kernel.org Cc: linux-nfs@vger.kernel.org Date: Tue, 28 Nov 2023 16:59:38 -0500 Message-ID: <170120877882.1515.3190174495040446432.stgit@klimt.1015granger.net> In-Reply-To: <170120874713.1515.13712791731008720729.stgit@klimt.1015granger.net> References: <170120874713.1515.13712791731008720729.stgit@klimt.1015granger.net> User-Agent: StGit/1.5 Precedence: bulk X-Mailing-List: linux-nfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit From: Chuck Lever [ Upstream commit 35308e7f0fc3942edc87d9c6dc78c4a096428957 ] To reduce contention on the bucket locks, we must avoid calling kfree() while each bucket lock is held. Start by refactoring nfsd_reply_cache_free_locked() into a helper that removes an entry from the bucket (and must therefore run under the lock) and a second helper that frees the entry (which does not need to hold the lock). For readability, rename the helpers nfsd_cacherep_. Reviewed-by: Jeff Layton Signed-off-by: Chuck Lever --- fs/nfsd/nfscache.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c index 1ad4f30d5f85..e197756b5454 100644 --- a/fs/nfsd/nfscache.c +++ b/fs/nfsd/nfscache.c @@ -110,21 +110,33 @@ nfsd_reply_cache_alloc(struct svc_rqst *rqstp, __wsum csum, return rp; } +static void nfsd_cacherep_free(struct svc_cacherep *rp) +{ + if (rp->c_type == RC_REPLBUFF) + kfree(rp->c_replvec.iov_base); + kmem_cache_free(drc_slab, rp); +} + static void -nfsd_reply_cache_free_locked(struct nfsd_drc_bucket *b, struct svc_cacherep *rp, - struct nfsd_net *nn) +nfsd_cacherep_unlink_locked(struct nfsd_net *nn, struct nfsd_drc_bucket *b, + struct svc_cacherep *rp) { - if (rp->c_type == RC_REPLBUFF && rp->c_replvec.iov_base) { + if (rp->c_type == RC_REPLBUFF && rp->c_replvec.iov_base) nfsd_stats_drc_mem_usage_sub(nn, rp->c_replvec.iov_len); - kfree(rp->c_replvec.iov_base); - } if (rp->c_state != RC_UNUSED) { rb_erase(&rp->c_node, &b->rb_head); list_del(&rp->c_lru); atomic_dec(&nn->num_drc_entries); nfsd_stats_drc_mem_usage_sub(nn, sizeof(*rp)); } - kmem_cache_free(drc_slab, rp); +} + +static void +nfsd_reply_cache_free_locked(struct nfsd_drc_bucket *b, struct svc_cacherep *rp, + struct nfsd_net *nn) +{ + nfsd_cacherep_unlink_locked(nn, b, rp); + nfsd_cacherep_free(rp); } static void @@ -132,8 +144,9 @@ nfsd_reply_cache_free(struct nfsd_drc_bucket *b, struct svc_cacherep *rp, struct nfsd_net *nn) { spin_lock(&b->cache_lock); - nfsd_reply_cache_free_locked(b, rp, nn); + nfsd_cacherep_unlink_locked(nn, b, rp); spin_unlock(&b->cache_lock); + nfsd_cacherep_free(rp); } int nfsd_drc_slab_create(void)