From patchwork Thu Feb 20 16:47:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 13984282 X-Patchwork-Delegate: cel@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 6A17D213E8A; Thu, 20 Feb 2025 16:47:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740070050; cv=none; b=b5P4fIBf3Ta0h+cESDR2M03dkyURXcLszLOnBIpj2NISjRCZwAjGsF7oqnpuoijS0r05qKqAjB5dqKYiHHXzl+cbjkdaZ7m2X1GOg2VbHXr9nQDhTd3zFTYOB0NrcGTwpYvtUFrsjd5dcLFtVa2pWxnMQmGeEpTJefclgVl3qhc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740070050; c=relaxed/simple; bh=10fJE8iIzBywIv//IGMFScNX8ddz9jj63jeGVuq8/u4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NtXpgg1qhTEEQEEfw255AuBc6JJf1WZEOQUQHAaCVovwqhYTvxnFPTzWGz3Q03e4WqaM+IkiNiFugozSeZKT7CQu6EIQaUeE5njiiR/VRcCEWaQbF40vqZVUz5PtO5UVY67IC6GZ0obFD2ABnCUQZnsTuXoBoS06hvVhJSInxE4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=E1pzxPOu; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="E1pzxPOu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2F117C4CEE6; Thu, 20 Feb 2025 16:47:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740070049; bh=10fJE8iIzBywIv//IGMFScNX8ddz9jj63jeGVuq8/u4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=E1pzxPOuFdSwAa2ZQEHEE5yCTIwJdGRb0qzHdxQ8k5BQnkXsObCNMgutrE0e7JW5F ZwDSn29AY1WQarvkve1ZGCR5Fun7P2GnxVDLIbUY/9V+TdzDYnpaST/5OCikaQDNaG OpJND+sWmvh5+m6zt42W5IIgDSr5LrNQklPOt5Zoun4syRXmMcvqfO/oYV1wJiVhZR gYdjg5nAyG3RiHBpnt9W51u3DMff40I2jqDwJgllsDBGFVPesAykrvs9WV+6tJwIqo uNw8y0NzNTOwGywEYC8UskriuTqEuWQlRcm+b7Ni+2WAE64VJ0QDcUeWyWCTDBJJDz e1hWj2/0CqNGA== From: Jeff Layton Date: Thu, 20 Feb 2025 11:47:14 -0500 Subject: [PATCH v2 2/5] nfsd: eliminate cl_ra_cblist and NFSD4_CLIENT_CB_RECALL_ANY Precedence: bulk X-Mailing-List: linux-nfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250220-nfsd-callback-v2-2-6a57f46e1c3a@kernel.org> References: <20250220-nfsd-callback-v2-0-6a57f46e1c3a@kernel.org> In-Reply-To: <20250220-nfsd-callback-v2-0-6a57f46e1c3a@kernel.org> To: Chuck Lever , Neil Brown , Olga Kornievskaia , Dai Ngo , Tom Talpey Cc: Li Lingfeng , linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3279; i=jlayton@kernel.org; h=from:subject:message-id; bh=10fJE8iIzBywIv//IGMFScNX8ddz9jj63jeGVuq8/u4=; b=owEBbQKS/ZANAwAIAQAOaEEZVoIVAcsmYgBnt1yekrI7C3/QhJ1L5NFsw+HJvZ7tYgcDOk5I+ RHPhLMU/SCJAjMEAAEIAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCZ7dcngAKCRAADmhBGVaC FV8ZEACXg5ohCqw9b0jqRibXpw14FkhFPoUKKhrOnBIB9GfOVYx3F6Ky9+S2LfZoKuHcTrEZlVj 9mZCneEw/BBPnGb071d6nKpY8UgDM2Xp/VDhJyn6TnvG+/6XF1wE5AqUSIlYvmeWx8Aa1cLKWxP /O6eTKEWjg8X+7oVua4kawwcltsReDAIf2bNM4RbYd0Sj+wxntULKsxq30bi12dLITPDwigaBxe o2OwiMpiifjhTD/dlQkcheNXZ5lJhYgOXTYCVeNGsdv/4hCnlaKGD0PFr9oJ/Eu8ILkgw49J+oM ELqex0+8l1pwg4/ttGLygVdq8OohWaATc1QlJ9TAfESXTHEPtsHSyp0gqUjbXbou9/K/4EcD12K FQd4+dYTwP0RkgLksNcMskPhykmDTgctStKH5i5/y4z6GWYiutlLYlkuT0pmX/nPzTS3Daq3I58 xJBQ8qOA+mDOpJgbmcFtW1WFbVkeQTbXiPzXaJ7zcjHylWi44qJa859xLdFEIzW/7oFqQGj7tzP 8z+sRSWQyQVk5L/f51xCb7+gWBMJisx409YJCzNQaFJxFxu5OdTg7nE51c+AyvHUOsEBgnv7nvT hvzmXweG2Efq8OuA+EQJG9PgVjs3UoWrYJS1od3NG1PbQR4e4av3SHZ7fPCXNwwI5fZsR4hQy/t GujlUpmAdEokjYw== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 deleg_reaper() will walk the client_lru list and put any suitable entries onto "cblist" using the cl_ra_cblist pointer. It then walks the objects outside the spinlock and queues callbacks for them. None of the operations that deleg_reaper() does outside the nn->client_lock are blocking operations. Just queue their workqueue jobs under the nn->client_lock instead. Also, the NFSD4_CLIENT_CB_RECALL_ANY and NFSD4_CALLBACK_RUNNING flags serve an identical purpose now. Drop the NFSD4_CLIENT_CB_RECALL_ANY flag and just use the one in the callback. Signed-off-by: Jeff Layton --- fs/nfsd/nfs4state.c | 16 +++------------- fs/nfsd/state.h | 2 -- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index fabcd979c40695ebcc795cfd2d8a035b7d589a37..422439a46ffd03926524b8463cfdabfb866281b3 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -3175,7 +3175,6 @@ nfsd4_cb_recall_any_release(struct nfsd4_callback *cb) { struct nfs4_client *clp = cb->cb_clp; - clear_bit(NFSD4_CLIENT_CB_RECALL_ANY, &clp->cl_flags); drop_client(clp); } @@ -6881,7 +6880,6 @@ deleg_reaper(struct nfsd_net *nn) { struct list_head *pos, *next; struct nfs4_client *clp; - LIST_HEAD(cblist); spin_lock(&nn->client_lock); list_for_each_safe(pos, next, &nn->client_lru) { @@ -6893,31 +6891,23 @@ deleg_reaper(struct nfsd_net *nn) continue; if (atomic_read(&clp->cl_delegs_in_recall)) continue; - if (test_bit(NFSD4_CLIENT_CB_RECALL_ANY, &clp->cl_flags)) + if (test_and_set_bit(NFSD4_CALLBACK_RUNNING, &clp->cl_ra->ra_cb.cb_flags)) continue; if (ktime_get_boottime_seconds() - clp->cl_ra_time < 5) continue; if (clp->cl_cb_state != NFSD4_CB_UP) continue; - list_add(&clp->cl_ra_cblist, &cblist); /* release in nfsd4_cb_recall_any_release */ kref_get(&clp->cl_nfsdfs.cl_ref); - set_bit(NFSD4_CLIENT_CB_RECALL_ANY, &clp->cl_flags); clp->cl_ra_time = ktime_get_boottime_seconds(); - } - spin_unlock(&nn->client_lock); - - while (!list_empty(&cblist)) { - clp = list_first_entry(&cblist, struct nfs4_client, - cl_ra_cblist); - list_del_init(&clp->cl_ra_cblist); clp->cl_ra->ra_keep = 0; clp->cl_ra->ra_bmval[0] = BIT(RCA4_TYPE_MASK_RDATA_DLG) | BIT(RCA4_TYPE_MASK_WDATA_DLG); trace_nfsd_cb_recall_any(clp->cl_ra); - nfsd4_try_run_cb(&clp->cl_ra->ra_cb); + nfsd4_run_cb(&clp->cl_ra->ra_cb); } + spin_unlock(&nn->client_lock); } static void diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index e6af969a03f26b1feb6768af5baa4887bf5fa5e9..6967925f4b438b24c2abd5fcd4f3bd6664a81862 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h @@ -454,7 +454,6 @@ struct nfs4_client { #define NFSD4_CLIENT_UPCALL_LOCK (5) /* upcall serialization */ #define NFSD4_CLIENT_CB_FLAG_MASK (1 << NFSD4_CLIENT_CB_UPDATE | \ 1 << NFSD4_CLIENT_CB_KILL) -#define NFSD4_CLIENT_CB_RECALL_ANY (6) unsigned long cl_flags; struct workqueue_struct *cl_callback_wq; @@ -500,7 +499,6 @@ struct nfs4_client { struct nfsd4_cb_recall_any *cl_ra; time64_t cl_ra_time; - struct list_head cl_ra_cblist; }; /* struct nfs4_client_reset