From: Mike Snitzer <snitzer@kernel.org>
To: linux-nfs@vger.kernel.org
Cc: Anna Schumaker <anna@kernel.org>,
Trond Myklebust <trondmy@hammerspace.com>,
Chuck Lever <chuck.lever@oracle.com>,
Jeff Layton <jlayton@kernel.org>, NeilBrown <neilb@suse.de>
Subject: [for-6.13 PATCH v3 04/14] nfs_common: move localio_lock to new lock member of nfs_uuid_t
Date: Fri, 15 Nov 2024 20:40:56 -0500 [thread overview]
Message-ID: <20241116014106.25456-5-snitzer@kernel.org> (raw)
In-Reply-To: <20241116014106.25456-1-snitzer@kernel.org>
Remove cl_localio_lock from 'struct nfs_client' in favor of adding a
lock to the nfs_uuid_t struct (which is embedded in each nfs_client).
Push nfs_local_{enable,disable} implementation down to nfs_common.
Those methods now call nfs_localio_{enable,disable}_client.
This allows implementing nfs_localio_invalidate_clients in terms of
nfs_localio_disable_client.
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
---
fs/nfs/client.c | 1 -
fs/nfs/localio.c | 14 +++-------
fs/nfs_common/nfslocalio.c | 57 ++++++++++++++++++++++++++------------
include/linux/nfs_fs_sb.h | 1 -
include/linux/nfslocalio.h | 8 +++++-
5 files changed, 51 insertions(+), 30 deletions(-)
diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 550ca934c9cfc..e83e1ce046130 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -186,7 +186,6 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
seqlock_init(&clp->cl_boot_lock);
ktime_get_real_ts64(&clp->cl_nfssvc_boot);
nfs_uuid_init(&clp->cl_uuid);
- spin_lock_init(&clp->cl_localio_lock);
#endif /* CONFIG_NFS_LOCALIO */
clp->cl_principal = "*";
diff --git a/fs/nfs/localio.c b/fs/nfs/localio.c
index 94af5d89bb996..7191135b47a42 100644
--- a/fs/nfs/localio.c
+++ b/fs/nfs/localio.c
@@ -126,10 +126,8 @@ const struct rpc_program nfslocalio_program = {
*/
static void nfs_local_enable(struct nfs_client *clp)
{
- spin_lock(&clp->cl_localio_lock);
- set_bit(NFS_CS_LOCAL_IO, &clp->cl_flags);
trace_nfs_local_enable(clp);
- spin_unlock(&clp->cl_localio_lock);
+ nfs_localio_enable_client(clp);
}
/*
@@ -137,12 +135,8 @@ static void nfs_local_enable(struct nfs_client *clp)
*/
void nfs_local_disable(struct nfs_client *clp)
{
- spin_lock(&clp->cl_localio_lock);
- if (test_and_clear_bit(NFS_CS_LOCAL_IO, &clp->cl_flags)) {
- trace_nfs_local_disable(clp);
- nfs_localio_disable_client(&clp->cl_uuid);
- }
- spin_unlock(&clp->cl_localio_lock);
+ trace_nfs_local_disable(clp);
+ nfs_localio_disable_client(clp);
}
/*
@@ -184,7 +178,7 @@ static bool nfs_server_uuid_is_local(struct nfs_client *clp)
rpc_shutdown_client(rpcclient_localio);
/* Server is only local if it initialized required struct members */
- if (status || !clp->cl_uuid.net || !clp->cl_uuid.dom)
+ if (status || !rcu_access_pointer(clp->cl_uuid.net) || !clp->cl_uuid.dom)
return false;
return true;
diff --git a/fs/nfs_common/nfslocalio.c b/fs/nfs_common/nfslocalio.c
index 904439e4bb859..abc132166742e 100644
--- a/fs/nfs_common/nfslocalio.c
+++ b/fs/nfs_common/nfslocalio.c
@@ -7,6 +7,9 @@
#include <linux/module.h>
#include <linux/list.h>
#include <linux/nfslocalio.h>
+#include <linux/nfs3.h>
+#include <linux/nfs4.h>
+#include <linux/nfs_fs_sb.h>
#include <net/netns/generic.h>
MODULE_LICENSE("GPL");
@@ -25,6 +28,7 @@ void nfs_uuid_init(nfs_uuid_t *nfs_uuid)
nfs_uuid->net = NULL;
nfs_uuid->dom = NULL;
INIT_LIST_HEAD(&nfs_uuid->list);
+ spin_lock_init(&nfs_uuid->lock);
}
EXPORT_SYMBOL_GPL(nfs_uuid_init);
@@ -94,12 +98,23 @@ void nfs_uuid_is_local(const uuid_t *uuid, struct list_head *list,
}
EXPORT_SYMBOL_GPL(nfs_uuid_is_local);
+void nfs_localio_enable_client(struct nfs_client *clp)
+{
+ nfs_uuid_t *nfs_uuid = &clp->cl_uuid;
+
+ spin_lock(&nfs_uuid->lock);
+ set_bit(NFS_CS_LOCAL_IO, &clp->cl_flags);
+ spin_unlock(&nfs_uuid->lock);
+}
+EXPORT_SYMBOL_GPL(nfs_localio_enable_client);
+
static void nfs_uuid_put_locked(nfs_uuid_t *nfs_uuid)
{
- if (nfs_uuid->net) {
- module_put(nfsd_mod);
- nfs_uuid->net = NULL;
- }
+ if (!nfs_uuid->net)
+ return;
+ module_put(nfsd_mod);
+ RCU_INIT_POINTER(nfs_uuid->net, NULL);
+
if (nfs_uuid->dom) {
auth_domain_put(nfs_uuid->dom);
nfs_uuid->dom = NULL;
@@ -107,27 +122,35 @@ static void nfs_uuid_put_locked(nfs_uuid_t *nfs_uuid)
list_del_init(&nfs_uuid->list);
}
-void nfs_localio_invalidate_clients(struct list_head *list)
+void nfs_localio_disable_client(struct nfs_client *clp)
+{
+ nfs_uuid_t *nfs_uuid = &clp->cl_uuid;
+
+ spin_lock(&nfs_uuid->lock);
+ if (test_and_clear_bit(NFS_CS_LOCAL_IO, &clp->cl_flags)) {
+ spin_lock(&nfs_uuid_lock);
+ nfs_uuid_put_locked(nfs_uuid);
+ spin_unlock(&nfs_uuid_lock);
+ }
+ spin_unlock(&nfs_uuid->lock);
+}
+EXPORT_SYMBOL_GPL(nfs_localio_disable_client);
+
+void nfs_localio_invalidate_clients(struct list_head *cl_uuid_list)
{
nfs_uuid_t *nfs_uuid, *tmp;
spin_lock(&nfs_uuid_lock);
- list_for_each_entry_safe(nfs_uuid, tmp, list, list)
- nfs_uuid_put_locked(nfs_uuid);
+ list_for_each_entry_safe(nfs_uuid, tmp, cl_uuid_list, list) {
+ struct nfs_client *clp =
+ container_of(nfs_uuid, struct nfs_client, cl_uuid);
+
+ nfs_localio_disable_client(clp);
+ }
spin_unlock(&nfs_uuid_lock);
}
EXPORT_SYMBOL_GPL(nfs_localio_invalidate_clients);
-void nfs_localio_disable_client(nfs_uuid_t *nfs_uuid)
-{
- if (nfs_uuid->net) {
- spin_lock(&nfs_uuid_lock);
- nfs_uuid_put_locked(nfs_uuid);
- spin_unlock(&nfs_uuid_lock);
- }
-}
-EXPORT_SYMBOL_GPL(nfs_localio_disable_client);
-
struct nfsd_file *nfs_open_local_fh(nfs_uuid_t *uuid,
struct rpc_clnt *rpc_clnt, const struct cred *cred,
const struct nfs_fh *nfs_fh, const fmode_t fmode)
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
index b804346a97419..239d86ef166c0 100644
--- a/include/linux/nfs_fs_sb.h
+++ b/include/linux/nfs_fs_sb.h
@@ -132,7 +132,6 @@ struct nfs_client {
struct timespec64 cl_nfssvc_boot;
seqlock_t cl_boot_lock;
nfs_uuid_t cl_uuid;
- spinlock_t cl_localio_lock;
#endif /* CONFIG_NFS_LOCALIO */
};
diff --git a/include/linux/nfslocalio.h b/include/linux/nfslocalio.h
index a05d1043f2b07..4d5583873f418 100644
--- a/include/linux/nfslocalio.h
+++ b/include/linux/nfslocalio.h
@@ -6,6 +6,7 @@
#ifndef __LINUX_NFSLOCALIO_H
#define __LINUX_NFSLOCALIO_H
+
/* nfsd_file structure is purposely kept opaque to NFS client */
struct nfsd_file;
@@ -19,6 +20,8 @@ struct nfsd_file;
#include <linux/nfs.h>
#include <net/net_namespace.h>
+struct nfs_client;
+
/*
* Useful to allow a client to negotiate if localio
* possible with its server.
@@ -27,6 +30,8 @@ struct nfsd_file;
*/
typedef struct {
uuid_t uuid;
+ /* sadly this struct is just over a cacheline, avoid bouncing */
+ spinlock_t ____cacheline_aligned lock;
struct list_head list;
struct net __rcu *net; /* nfsd's network namespace */
struct auth_domain *dom; /* auth_domain for localio */
@@ -38,7 +43,8 @@ void nfs_uuid_end(nfs_uuid_t *);
void nfs_uuid_is_local(const uuid_t *, struct list_head *,
struct net *, struct auth_domain *, struct module *);
-void nfs_localio_disable_client(nfs_uuid_t *nfs_uuid);
+void nfs_localio_enable_client(struct nfs_client *clp);
+void nfs_localio_disable_client(struct nfs_client *clp);
void nfs_localio_invalidate_clients(struct list_head *list);
/* localio needs to map filehandle -> struct nfsd_file */
--
2.44.0
next prev parent reply other threads:[~2024-11-16 1:41 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-16 1:40 [for-6.13 PATCH v3 00/14] nfs/nfsd: improvements for LOCALIO Mike Snitzer
2024-11-16 1:40 ` [for-6.13 PATCH v3 01/14] nfs/localio: add direct IO enablement with sync and async IO support Mike Snitzer
2024-11-16 1:40 ` [for-6.13 PATCH v3 02/14] nfsd: add nfsd_file_{get,put} to 'nfs_to' nfsd_localio_operations Mike Snitzer
2024-11-16 1:40 ` [for-6.13 PATCH v3 03/14] nfs_common: rename functions that invalidate LOCALIO nfs_clients Mike Snitzer
2024-11-16 1:40 ` Mike Snitzer [this message]
2024-11-16 1:40 ` [for-6.13 PATCH v3 05/14] nfs: cache all open LOCALIO nfsd_file(s) in client Mike Snitzer
2024-11-16 1:40 ` [for-6.13 PATCH v3 06/14] nfsd: update percpu_ref to manage references on nfsd_net Mike Snitzer
2024-11-16 1:40 ` [for-6.13 PATCH v3 07/14] nfsd: rename nfsd_serv_ prefixed methods and variables with nfsd_net_ Mike Snitzer
2024-11-16 1:41 ` [for-6.13 PATCH v3 08/14] nfsd: nfsd_file_acquire_local no longer returns GC'd nfsd_file Mike Snitzer
2024-11-16 1:41 ` [for-6.13 PATCH v3 09/14] nfs_common: rename nfslocalio nfs_uuid_lock to nfs_uuids_lock Mike Snitzer
2024-11-16 1:41 ` [for-6.13 PATCH v3 10/14] nfs_common: track all open nfsd_files per LOCALIO nfs_client Mike Snitzer
2024-11-16 1:41 ` [for-6.13 PATCH v3 11/14] nfs_common: add nfs_localio trace events Mike Snitzer
2024-11-16 1:41 ` [for-6.13 PATCH v3 12/14] nfs/localio: remove redundant code and simplify LOCALIO enablement Mike Snitzer
2024-11-16 1:41 ` [for-6.13 PATCH v3 13/14] nfs: probe for LOCALIO when v4 client reconnects to server Mike Snitzer
2024-11-16 1:41 ` [for-6.13 PATCH v3 14/14] nfs: probe for LOCALIO when v3 " Mike Snitzer
2024-11-22 17:26 ` [for-6.13 PATCH v3 00/14] nfs/nfsd: improvements for LOCALIO Jeff Layton
2024-11-23 2:31 ` Mike Snitzer
2024-12-18 17:31 ` Mike Snitzer
2024-12-18 20:55 ` Anna Schumaker
2024-12-18 21:05 ` Chuck Lever
2024-12-18 21:19 ` Mike Snitzer
2025-01-08 16:05 ` Mike Snitzer
2025-01-08 20:56 ` Anna Schumaker
2025-01-13 22:29 ` [PATCH v2] nfs: fix incorrect error handling in LOCALIO (was: Re: [for-6.13 PATCH v3 00/14] nfs/nfsd: improvements for LOCALIO) Mike Snitzer
2024-12-18 21:07 ` [for-6.13 PATCH v3 00/14] nfs/nfsd: improvements for LOCALIO Mike Snitzer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241116014106.25456-5-snitzer@kernel.org \
--to=snitzer@kernel.org \
--cc=anna@kernel.org \
--cc=chuck.lever@oracle.com \
--cc=jlayton@kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.de \
--cc=trondmy@hammerspace.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.