* [PATCH v3 01/24] NFSD: Fix TP_printk() format specifier in nfsd_clid_class
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
@ 2021-05-14 19:55 ` Chuck Lever
2021-05-14 19:55 ` [PATCH v3 02/24] NFSD: Add an RPC authflavor tracepoint display helper Chuck Lever
` (22 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:55 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Since commit 9a6944fee68e ("tracing: Add a verifier to check string
pointers for trace events"), which was merged in v5.13-rc1,
TP_printk() no longer tacitly supports the "%.*s" format specifier.
These are low value tracepoints, so just remove them.
Reported-by: David Wysochanski <dwysocha@redhat.com>
Fixes: dd5e3fbc1f47 ("NFSD: Add tracepoints to the NFSD state management code")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
fs/nfsd/nfs4state.c | 3 ---
fs/nfsd/trace.h | 29 -----------------------------
2 files changed, 32 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index b517a8794400..6abe48dee6ed 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -7229,7 +7229,6 @@ nfs4_client_to_reclaim(struct xdr_netobj name, struct xdr_netobj princhash,
unsigned int strhashval;
struct nfs4_client_reclaim *crp;
- trace_nfsd_clid_reclaim(nn, name.len, name.data);
crp = alloc_reclaim();
if (crp) {
strhashval = clientstr_hashval(name);
@@ -7279,8 +7278,6 @@ nfsd4_find_reclaim_client(struct xdr_netobj name, struct nfsd_net *nn)
unsigned int strhashval;
struct nfs4_client_reclaim *crp = NULL;
- trace_nfsd_clid_find(nn, name.len, name.data);
-
strhashval = clientstr_hashval(name);
list_for_each_entry(crp, &nn->reclaim_str_hashtbl[strhashval], cr_strhash) {
if (compare_blob(&crp->cr_name, &name) == 0) {
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 27a93ebd1d80..42ad2a02f953 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -536,35 +536,6 @@ DEFINE_EVENT(nfsd_net_class, nfsd_##name, \
DEFINE_NET_EVENT(grace_start);
DEFINE_NET_EVENT(grace_complete);
-DECLARE_EVENT_CLASS(nfsd_clid_class,
- TP_PROTO(const struct nfsd_net *nn,
- unsigned int namelen,
- const unsigned char *namedata),
- TP_ARGS(nn, namelen, namedata),
- TP_STRUCT__entry(
- __field(unsigned long long, boot_time)
- __field(unsigned int, namelen)
- __dynamic_array(unsigned char, name, namelen)
- ),
- TP_fast_assign(
- __entry->boot_time = nn->boot_time;
- __entry->namelen = namelen;
- memcpy(__get_dynamic_array(name), namedata, namelen);
- ),
- TP_printk("boot_time=%16llx nfs4_clientid=%.*s",
- __entry->boot_time, __entry->namelen, __get_str(name))
-)
-
-#define DEFINE_CLID_EVENT(name) \
-DEFINE_EVENT(nfsd_clid_class, nfsd_clid_##name, \
- TP_PROTO(const struct nfsd_net *nn, \
- unsigned int namelen, \
- const unsigned char *namedata), \
- TP_ARGS(nn, namelen, namedata))
-
-DEFINE_CLID_EVENT(find);
-DEFINE_CLID_EVENT(reclaim);
-
TRACE_EVENT(nfsd_clid_inuse_err,
TP_PROTO(const struct nfs4_client *clp),
TP_ARGS(clp),
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 02/24] NFSD: Add an RPC authflavor tracepoint display helper
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
2021-05-14 19:55 ` [PATCH v3 01/24] NFSD: Fix TP_printk() format specifier in nfsd_clid_class Chuck Lever
@ 2021-05-14 19:55 ` Chuck Lever
2021-05-14 19:55 ` [PATCH v3 03/24] NFSD: Add nfsd_clid_cred_mismatch tracepoint Chuck Lever
` (21 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:55 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
To be used in subsequent patches.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/trace.h | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 42ad2a02f953..1b50640cdf96 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -841,6 +841,22 @@ DEFINE_NFSD_CB_EVENT(setup);
DEFINE_NFSD_CB_EVENT(state);
DEFINE_NFSD_CB_EVENT(shutdown);
+TRACE_DEFINE_ENUM(RPC_AUTH_NULL);
+TRACE_DEFINE_ENUM(RPC_AUTH_UNIX);
+TRACE_DEFINE_ENUM(RPC_AUTH_GSS);
+TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5);
+TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5I);
+TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5P);
+
+#define show_nfsd_authflavor(val) \
+ __print_symbolic(val, \
+ { RPC_AUTH_NULL, "none" }, \
+ { RPC_AUTH_UNIX, "sys" }, \
+ { RPC_AUTH_GSS, "gss" }, \
+ { RPC_AUTH_GSS_KRB5, "krb5" }, \
+ { RPC_AUTH_GSS_KRB5I, "krb5i" }, \
+ { RPC_AUTH_GSS_KRB5P, "krb5p" })
+
TRACE_EVENT(nfsd_cb_setup_err,
TP_PROTO(
const struct nfs4_client *clp,
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 03/24] NFSD: Add nfsd_clid_cred_mismatch tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
2021-05-14 19:55 ` [PATCH v3 01/24] NFSD: Fix TP_printk() format specifier in nfsd_clid_class Chuck Lever
2021-05-14 19:55 ` [PATCH v3 02/24] NFSD: Add an RPC authflavor tracepoint display helper Chuck Lever
@ 2021-05-14 19:55 ` Chuck Lever
2021-05-14 19:55 ` [PATCH v3 04/24] NFSD: Add nfsd_clid_verf_mismatch tracepoint Chuck Lever
` (20 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:55 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Record when a client tries to establish a lease record but uses an
unexpected credential. This is often a sign of a configuration
problem.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4state.c | 14 ++++++++++----
fs/nfsd/trace.h | 28 ++++++++++++++++++++++++++++
2 files changed, 38 insertions(+), 4 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 6abe48dee6ed..84c4021b3826 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -3181,6 +3181,7 @@ nfsd4_exchange_id(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
if (!creds_match) { /* case 3 */
if (client_has_state(conf)) {
status = nfserr_clid_inuse;
+ trace_nfsd_clid_cred_mismatch(conf, rqstp);
goto out;
}
goto out_new;
@@ -3425,9 +3426,10 @@ nfsd4_create_session(struct svc_rqst *rqstp,
goto out_free_conn;
}
} else if (unconf) {
+ status = nfserr_clid_inuse;
if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) ||
!rpc_cmp_addr(sa, (struct sockaddr *) &unconf->cl_addr)) {
- status = nfserr_clid_inuse;
+ trace_nfsd_clid_cred_mismatch(unconf, rqstp);
goto out_free_conn;
}
status = nfserr_wrong_cred;
@@ -3976,7 +3978,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
if (clp_used_exchangeid(conf))
goto out;
if (!same_creds(&conf->cl_cred, &rqstp->rq_cred)) {
- trace_nfsd_clid_inuse_err(conf);
+ trace_nfsd_clid_cred_mismatch(conf, rqstp);
goto out;
}
}
@@ -4034,10 +4036,14 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
* Nevertheless, RFC 7530 recommends INUSE for this case:
*/
status = nfserr_clid_inuse;
- if (unconf && !same_creds(&unconf->cl_cred, &rqstp->rq_cred))
+ if (unconf && !same_creds(&unconf->cl_cred, &rqstp->rq_cred)) {
+ trace_nfsd_clid_cred_mismatch(unconf, rqstp);
goto out;
- if (conf && !same_creds(&conf->cl_cred, &rqstp->rq_cred))
+ }
+ if (conf && !same_creds(&conf->cl_cred, &rqstp->rq_cred)) {
+ trace_nfsd_clid_cred_mismatch(conf, rqstp);
goto out;
+ }
/* cases below refer to rfc 3530 section 14.2.34: */
if (!unconf || !same_verf(&confirm, &unconf->cl_confirm)) {
if (conf && same_verf(&confirm, &conf->cl_confirm)) {
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 1b50640cdf96..820a542e1013 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -536,6 +536,34 @@ DEFINE_EVENT(nfsd_net_class, nfsd_##name, \
DEFINE_NET_EVENT(grace_start);
DEFINE_NET_EVENT(grace_complete);
+TRACE_EVENT(nfsd_clid_cred_mismatch,
+ TP_PROTO(
+ const struct nfs4_client *clp,
+ const struct svc_rqst *rqstp
+ ),
+ TP_ARGS(clp, rqstp),
+ TP_STRUCT__entry(
+ __field(u32, cl_boot)
+ __field(u32, cl_id)
+ __field(unsigned long, cl_flavor)
+ __field(unsigned long, new_flavor)
+ __array(unsigned char, addr, sizeof(struct sockaddr_in6))
+ ),
+ TP_fast_assign(
+ __entry->cl_boot = clp->cl_clientid.cl_boot;
+ __entry->cl_id = clp->cl_clientid.cl_id;
+ __entry->cl_flavor = clp->cl_cred.cr_flavor;
+ __entry->new_flavor = rqstp->rq_cred.cr_flavor;
+ memcpy(__entry->addr, &rqstp->rq_xprt->xpt_remote,
+ sizeof(struct sockaddr_in6));
+ ),
+ TP_printk("client %08x:%08x flavor=%s, conflict=%s from addr=%pISpc",
+ __entry->cl_boot, __entry->cl_id,
+ show_nfsd_authflavor(__entry->cl_flavor),
+ show_nfsd_authflavor(__entry->new_flavor), __entry->addr
+ )
+)
+
TRACE_EVENT(nfsd_clid_inuse_err,
TP_PROTO(const struct nfs4_client *clp),
TP_ARGS(clp),
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 04/24] NFSD: Add nfsd_clid_verf_mismatch tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (2 preceding siblings ...)
2021-05-14 19:55 ` [PATCH v3 03/24] NFSD: Add nfsd_clid_cred_mismatch tracepoint Chuck Lever
@ 2021-05-14 19:55 ` Chuck Lever
2021-05-14 19:55 ` [PATCH v3 05/24] NFSD: Remove trace_nfsd_clid_inuse_err Chuck Lever
` (19 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:55 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Record when a client presents a different boot verifier than the
one we know about. Typically this is a sign the client has
rebooted, but sometimes it signals a conflicting client ID, which
the client's administrator will need to address.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4state.c | 11 ++++++++---
fs/nfsd/trace.h | 32 ++++++++++++++++++++++++++++++++
2 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 84c4021b3826..69405cc9d823 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -3191,6 +3191,7 @@ nfsd4_exchange_id(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
goto out_copy;
}
/* case 5, client reboot */
+ trace_nfsd_clid_verf_mismatch(conf, rqstp, &verf);
conf = NULL;
goto out_new;
}
@@ -3986,9 +3987,13 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
if (unconf)
unhash_client_locked(unconf);
/* We need to handle only case 1: probable callback update */
- if (conf && same_verf(&conf->cl_verifier, &clverifier)) {
- copy_clid(new, conf);
- gen_confirm(new, nn);
+ if (conf) {
+ if (same_verf(&conf->cl_verifier, &clverifier)) {
+ copy_clid(new, conf);
+ gen_confirm(new, nn);
+ } else
+ trace_nfsd_clid_verf_mismatch(conf, rqstp,
+ &clverifier);
}
new->cl_minorversion = 0;
gen_callback(new, setclid, rqstp);
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 820a542e1013..24f54ab20eed 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -564,6 +564,38 @@ TRACE_EVENT(nfsd_clid_cred_mismatch,
)
)
+TRACE_EVENT(nfsd_clid_verf_mismatch,
+ TP_PROTO(
+ const struct nfs4_client *clp,
+ const struct svc_rqst *rqstp,
+ const nfs4_verifier *verf
+ ),
+ TP_ARGS(clp, rqstp, verf),
+ TP_STRUCT__entry(
+ __field(u32, cl_boot)
+ __field(u32, cl_id)
+ __array(unsigned char, cl_verifier, NFS4_VERIFIER_SIZE)
+ __array(unsigned char, new_verifier, NFS4_VERIFIER_SIZE)
+ __array(unsigned char, addr, sizeof(struct sockaddr_in6))
+ ),
+ TP_fast_assign(
+ __entry->cl_boot = clp->cl_clientid.cl_boot;
+ __entry->cl_id = clp->cl_clientid.cl_id;
+ memcpy(__entry->cl_verifier, (void *)&clp->cl_verifier,
+ NFS4_VERIFIER_SIZE);
+ memcpy(__entry->new_verifier, (void *)verf,
+ NFS4_VERIFIER_SIZE);
+ memcpy(__entry->addr, &rqstp->rq_xprt->xpt_remote,
+ sizeof(struct sockaddr_in6));
+ ),
+ TP_printk("client %08x:%08x verf=0x%s, updated=0x%s from addr=%pISpc",
+ __entry->cl_boot, __entry->cl_id,
+ __print_hex_str(__entry->cl_verifier, NFS4_VERIFIER_SIZE),
+ __print_hex_str(__entry->new_verifier, NFS4_VERIFIER_SIZE),
+ __entry->addr
+ )
+);
+
TRACE_EVENT(nfsd_clid_inuse_err,
TP_PROTO(const struct nfs4_client *clp),
TP_ARGS(clp),
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 05/24] NFSD: Remove trace_nfsd_clid_inuse_err
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (3 preceding siblings ...)
2021-05-14 19:55 ` [PATCH v3 04/24] NFSD: Add nfsd_clid_verf_mismatch tracepoint Chuck Lever
@ 2021-05-14 19:55 ` Chuck Lever
2021-05-14 19:55 ` [PATCH v3 06/24] NFSD: Add nfsd_clid_confirmed tracepoint Chuck Lever
` (18 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:55 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
This tracepoint has been replaced by nfsd_clid_cred_mismatch and
nfsd_clid_verf_mismatch, and can simply be removed.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/trace.h | 24 ------------------------
1 file changed, 24 deletions(-)
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 24f54ab20eed..1265d6f058ee 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -596,30 +596,6 @@ TRACE_EVENT(nfsd_clid_verf_mismatch,
)
);
-TRACE_EVENT(nfsd_clid_inuse_err,
- TP_PROTO(const struct nfs4_client *clp),
- TP_ARGS(clp),
- TP_STRUCT__entry(
- __field(u32, cl_boot)
- __field(u32, cl_id)
- __array(unsigned char, addr, sizeof(struct sockaddr_in6))
- __field(unsigned int, namelen)
- __dynamic_array(unsigned char, name, clp->cl_name.len)
- ),
- TP_fast_assign(
- __entry->cl_boot = clp->cl_clientid.cl_boot;
- __entry->cl_id = clp->cl_clientid.cl_id;
- memcpy(__entry->addr, &clp->cl_addr,
- sizeof(struct sockaddr_in6));
- __entry->namelen = clp->cl_name.len;
- memcpy(__get_dynamic_array(name), clp->cl_name.data,
- clp->cl_name.len);
- ),
- TP_printk("nfs4_clientid %.*s already in use by %pISpc, client %08x:%08x",
- __entry->namelen, __get_str(name), __entry->addr,
- __entry->cl_boot, __entry->cl_id)
-)
-
/*
* from fs/nfsd/filecache.h
*/
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 06/24] NFSD: Add nfsd_clid_confirmed tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (4 preceding siblings ...)
2021-05-14 19:55 ` [PATCH v3 05/24] NFSD: Remove trace_nfsd_clid_inuse_err Chuck Lever
@ 2021-05-14 19:55 ` Chuck Lever
2021-05-14 19:55 ` [PATCH v3 07/24] NFSD: Add nfsd_clid_reclaim_complete tracepoint Chuck Lever
` (17 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:55 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
This replaces a dprintk call site in order to get greater visibility
on when client IDs are confirmed or re-used. Simple example:
nfsd-995 [000] 126.622975: nfsd_compound: xid=0x3a34e2b1 opcnt=1
nfsd-995 [000] 126.623005: nfsd_cb_args: addr=192.168.2.51:45901 client 60958e3b:9213ef0e prog=1073741824 ident=1
nfsd-995 [000] 126.623007: nfsd_compound_status: op=1/1 OP_SETCLIENTID status=0
nfsd-996 [001] 126.623142: nfsd_compound: xid=0x3b34e2b1 opcnt=1
>>>> nfsd-996 [001] 126.623146: nfsd_clid_confirmed: client 60958e3b:9213ef0e
nfsd-996 [001] 126.623148: nfsd_cb_probe: addr=192.168.2.51:45901 client 60958e3b:9213ef0e state=UNKNOWN
nfsd-996 [001] 126.623154: nfsd_compound_status: op=1/1 OP_SETCLIENTID_CONFIRM status=0
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4state.c | 10 +++++-----
fs/nfsd/trace.h | 1 +
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 69405cc9d823..37cef1f498e1 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -2816,14 +2816,14 @@ move_to_confirmed(struct nfs4_client *clp)
lockdep_assert_held(&nn->client_lock);
- dprintk("NFSD: move_to_confirm nfs4_client %p\n", clp);
list_move(&clp->cl_idhash, &nn->conf_id_hashtbl[idhashval]);
rb_erase(&clp->cl_namenode, &nn->unconf_name_tree);
add_clp_to_name_tree(clp, &nn->conf_name_tree);
- if (!test_and_set_bit(NFSD4_CLIENT_CONFIRMED, &clp->cl_flags) &&
- clp->cl_nfsd_dentry &&
- clp->cl_nfsd_info_dentry)
- fsnotify_dentry(clp->cl_nfsd_info_dentry, FS_MODIFY);
+ if (!test_and_set_bit(NFSD4_CLIENT_CONFIRMED, &clp->cl_flags)) {
+ trace_nfsd_clid_confirmed(&clp->cl_clientid);
+ if (clp->cl_nfsd_dentry && clp->cl_nfsd_info_dentry)
+ fsnotify_dentry(clp->cl_nfsd_info_dentry, FS_MODIFY);
+ }
renew_client_locked(clp);
}
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 1265d6f058ee..c3d47fd68ff5 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -511,6 +511,7 @@ DEFINE_EVENT(nfsd_clientid_class, nfsd_clid_##name, \
TP_PROTO(const clientid_t *clid), \
TP_ARGS(clid))
+DEFINE_CLIENTID_EVENT(confirmed);
DEFINE_CLIENTID_EVENT(expired);
DEFINE_CLIENTID_EVENT(purged);
DEFINE_CLIENTID_EVENT(renew);
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 07/24] NFSD: Add nfsd_clid_reclaim_complete tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (5 preceding siblings ...)
2021-05-14 19:55 ` [PATCH v3 06/24] NFSD: Add nfsd_clid_confirmed tracepoint Chuck Lever
@ 2021-05-14 19:55 ` Chuck Lever
2021-05-14 19:56 ` [PATCH v3 08/24] NFSD: Add nfsd_clid_destroyed tracepoint Chuck Lever
` (16 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:55 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4state.c | 1 +
fs/nfsd/trace.h | 1 +
2 files changed, 2 insertions(+)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 37cef1f498e1..03f2770c815f 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -3949,6 +3949,7 @@ nfsd4_reclaim_complete(struct svc_rqst *rqstp,
goto out;
status = nfs_ok;
+ trace_nfsd_clid_reclaim_complete(&clp->cl_clientid);
nfsd4_client_record_create(clp);
inc_reclaim_complete(clp);
out:
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index c3d47fd68ff5..18be3fbb96ea 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -511,6 +511,7 @@ DEFINE_EVENT(nfsd_clientid_class, nfsd_clid_##name, \
TP_PROTO(const clientid_t *clid), \
TP_ARGS(clid))
+DEFINE_CLIENTID_EVENT(reclaim_complete);
DEFINE_CLIENTID_EVENT(confirmed);
DEFINE_CLIENTID_EVENT(expired);
DEFINE_CLIENTID_EVENT(purged);
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 08/24] NFSD: Add nfsd_clid_destroyed tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (6 preceding siblings ...)
2021-05-14 19:55 ` [PATCH v3 07/24] NFSD: Add nfsd_clid_reclaim_complete tracepoint Chuck Lever
@ 2021-05-14 19:56 ` Chuck Lever
2021-05-14 19:56 ` [PATCH v3 09/24] NFSD: Add a couple more nfsd_clid_expired call sites Chuck Lever
` (15 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:56 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Record client-requested termination of client IDs.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4state.c | 1 +
fs/nfsd/trace.h | 1 +
2 files changed, 2 insertions(+)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 03f2770c815f..08ff643e96fb 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -3907,6 +3907,7 @@ nfsd4_destroy_clientid(struct svc_rqst *rqstp,
status = nfserr_wrong_cred;
goto out;
}
+ trace_nfsd_clid_destroyed(&clp->cl_clientid);
unhash_client_locked(clp);
out:
spin_unlock(&nn->client_lock);
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 18be3fbb96ea..d6ba6a1a1e63 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -513,6 +513,7 @@ DEFINE_EVENT(nfsd_clientid_class, nfsd_clid_##name, \
DEFINE_CLIENTID_EVENT(reclaim_complete);
DEFINE_CLIENTID_EVENT(confirmed);
+DEFINE_CLIENTID_EVENT(destroyed);
DEFINE_CLIENTID_EVENT(expired);
DEFINE_CLIENTID_EVENT(purged);
DEFINE_CLIENTID_EVENT(renew);
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 09/24] NFSD: Add a couple more nfsd_clid_expired call sites
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (7 preceding siblings ...)
2021-05-14 19:56 ` [PATCH v3 08/24] NFSD: Add nfsd_clid_destroyed tracepoint Chuck Lever
@ 2021-05-14 19:56 ` Chuck Lever
2021-05-14 19:56 ` [PATCH v3 10/24] NFSD: Add tracepoints for SETCLIENTID edge cases Chuck Lever
` (14 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:56 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Improve observation of NFSv4 lease expiry.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4state.c | 9 ++++++---
fs/nfsd/trace.h | 3 ++-
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 08ff643e96fb..2e7bbaa92684 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -2665,6 +2665,8 @@ static void force_expire_client(struct nfs4_client *clp)
struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
bool already_expired;
+ trace_nfsd_clid_admin_expired(&clp->cl_clientid);
+
spin_lock(&clp->cl_lock);
clp->cl_time = 0;
spin_unlock(&clp->cl_lock);
@@ -3211,6 +3213,7 @@ nfsd4_exchange_id(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
status = mark_client_expired_locked(conf);
if (status)
goto out;
+ trace_nfsd_clid_replaced(&conf->cl_clientid);
}
new->cl_minorversion = cstate->minorversion;
new->cl_spo_must_allow.u.words[0] = exid->spo_must_allow[0];
@@ -3450,6 +3453,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
old = NULL;
goto out_free_conn;
}
+ trace_nfsd_clid_replaced(&old->cl_clientid);
}
move_to_confirmed(unconf);
conf = unconf;
@@ -4078,6 +4082,7 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
old = NULL;
goto out;
}
+ trace_nfsd_clid_replaced(&old->cl_clientid);
}
move_to_confirmed(unconf);
conf = unconf;
@@ -5508,10 +5513,8 @@ nfs4_laundromat(struct nfsd_net *nn)
clp = list_entry(pos, struct nfs4_client, cl_lru);
if (!state_expired(<, clp->cl_time))
break;
- if (mark_client_expired_locked(clp)) {
- trace_nfsd_clid_expired(&clp->cl_clientid);
+ if (mark_client_expired_locked(clp))
continue;
- }
list_add(&clp->cl_lru, &reaplist);
}
spin_unlock(&nn->client_lock);
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index d6ba6a1a1e63..ac96416b4b33 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -514,7 +514,8 @@ DEFINE_EVENT(nfsd_clientid_class, nfsd_clid_##name, \
DEFINE_CLIENTID_EVENT(reclaim_complete);
DEFINE_CLIENTID_EVENT(confirmed);
DEFINE_CLIENTID_EVENT(destroyed);
-DEFINE_CLIENTID_EVENT(expired);
+DEFINE_CLIENTID_EVENT(admin_expired);
+DEFINE_CLIENTID_EVENT(replaced);
DEFINE_CLIENTID_EVENT(purged);
DEFINE_CLIENTID_EVENT(renew);
DEFINE_CLIENTID_EVENT(stale);
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 10/24] NFSD: Add tracepoints for SETCLIENTID edge cases
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (8 preceding siblings ...)
2021-05-14 19:56 ` [PATCH v3 09/24] NFSD: Add a couple more nfsd_clid_expired call sites Chuck Lever
@ 2021-05-14 19:56 ` Chuck Lever
2021-05-14 19:56 ` [PATCH v3 11/24] NFSD: Add tracepoints for EXCHANGEID " Chuck Lever
` (13 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:56 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4state.c | 19 ++++++++-----------
fs/nfsd/trace.h | 37 +++++++++++++++++++++++++++++++++++++
2 files changed, 45 insertions(+), 11 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 2e7bbaa92684..b6da4abd42a0 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -3976,11 +3976,9 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
new = create_client(clname, rqstp, &clverifier);
if (new == NULL)
return nfserr_jukebox;
- /* Cases below refer to rfc 3530 section 14.2.33: */
spin_lock(&nn->client_lock);
conf = find_confirmed_client_by_name(&clname, nn);
if (conf && client_has_state(conf)) {
- /* case 0: */
status = nfserr_clid_inuse;
if (clp_used_exchangeid(conf))
goto out;
@@ -3992,7 +3990,6 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
unconf = find_unconfirmed_client_by_name(&clname, nn);
if (unconf)
unhash_client_locked(unconf);
- /* We need to handle only case 1: probable callback update */
if (conf) {
if (same_verf(&conf->cl_verifier, &clverifier)) {
copy_clid(new, conf);
@@ -4000,7 +3997,8 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
} else
trace_nfsd_clid_verf_mismatch(conf, rqstp,
&clverifier);
- }
+ } else
+ trace_nfsd_clid_fresh(new);
new->cl_minorversion = 0;
gen_callback(new, setclid, rqstp);
add_to_unconfirmed(new);
@@ -4013,12 +4011,13 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
spin_unlock(&nn->client_lock);
if (new)
free_client(new);
- if (unconf)
+ if (unconf) {
+ trace_nfsd_clid_expire_unconf(&unconf->cl_clientid);
expire_client(unconf);
+ }
return status;
}
-
__be32
nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
struct nfsd4_compound_state *cstate,
@@ -4055,21 +4054,19 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
trace_nfsd_clid_cred_mismatch(conf, rqstp);
goto out;
}
- /* cases below refer to rfc 3530 section 14.2.34: */
if (!unconf || !same_verf(&confirm, &unconf->cl_confirm)) {
if (conf && same_verf(&confirm, &conf->cl_confirm)) {
- /* case 2: probable retransmit */
status = nfs_ok;
- } else /* case 4: client hasn't noticed we rebooted yet? */
+ } else
status = nfserr_stale_clientid;
goto out;
}
status = nfs_ok;
- if (conf) { /* case 1: callback update */
+ if (conf) {
old = unconf;
unhash_client_locked(old);
nfsd4_change_callback(conf, &unconf->cl_cb_conn);
- } else { /* case 3: normal case; new or rebooted client */
+ } else {
old = find_confirmed_client_by_name(&unconf->cl_name, nn);
if (old) {
status = nfserr_clid_inuse;
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index ac96416b4b33..33fba6dbdc4a 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -511,6 +511,7 @@ DEFINE_EVENT(nfsd_clientid_class, nfsd_clid_##name, \
TP_PROTO(const clientid_t *clid), \
TP_ARGS(clid))
+DEFINE_CLIENTID_EVENT(expire_unconf);
DEFINE_CLIENTID_EVENT(reclaim_complete);
DEFINE_CLIENTID_EVENT(confirmed);
DEFINE_CLIENTID_EVENT(destroyed);
@@ -600,6 +601,42 @@ TRACE_EVENT(nfsd_clid_verf_mismatch,
)
);
+DECLARE_EVENT_CLASS(nfsd_clid_class,
+ TP_PROTO(const struct nfs4_client *clp),
+ TP_ARGS(clp),
+ TP_STRUCT__entry(
+ __field(u32, cl_boot)
+ __field(u32, cl_id)
+ __array(unsigned char, addr, sizeof(struct sockaddr_in6))
+ __field(unsigned long, flavor)
+ __array(unsigned char, verifier, NFS4_VERIFIER_SIZE)
+ __dynamic_array(char, name, clp->cl_name.len + 1)
+ ),
+ TP_fast_assign(
+ __entry->cl_boot = clp->cl_clientid.cl_boot;
+ __entry->cl_id = clp->cl_clientid.cl_id;
+ memcpy(__entry->addr, &clp->cl_addr,
+ sizeof(struct sockaddr_in6));
+ __entry->flavor = clp->cl_cred.cr_flavor;
+ memcpy(__entry->verifier, (void *)&clp->cl_verifier,
+ NFS4_VERIFIER_SIZE);
+ memcpy(__get_str(name), clp->cl_name.data, clp->cl_name.len);
+ __get_str(name)[clp->cl_name.len] = '\0';
+ ),
+ TP_printk("addr=%pISpc name='%s' verifier=0x%s flavor=%s client=%08x:%08x",
+ __entry->addr, __get_str(name),
+ __print_hex_str(__entry->verifier, NFS4_VERIFIER_SIZE),
+ show_nfsd_authflavor(__entry->flavor),
+ __entry->cl_boot, __entry->cl_id)
+);
+
+#define DEFINE_CLID_EVENT(name) \
+DEFINE_EVENT(nfsd_clid_class, nfsd_clid_##name, \
+ TP_PROTO(const struct nfs4_client *clp), \
+ TP_ARGS(clp))
+
+DEFINE_CLID_EVENT(fresh);
+
/*
* from fs/nfsd/filecache.h
*/
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 11/24] NFSD: Add tracepoints for EXCHANGEID edge cases
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (9 preceding siblings ...)
2021-05-14 19:56 ` [PATCH v3 10/24] NFSD: Add tracepoints for SETCLIENTID edge cases Chuck Lever
@ 2021-05-14 19:56 ` Chuck Lever
2021-05-14 19:56 ` [PATCH v3 12/24] NFSD: Constify @fh argument of knfsd_fh_hash() Chuck Lever
` (12 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:56 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Some of the most common cases are traced. Enough infrastructure is
now in place that more can be added later, as needed.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4state.c | 12 +++++++++---
fs/nfsd/trace.h | 1 +
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index b6da4abd42a0..aa645aeee7b6 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -3178,6 +3178,7 @@ nfsd4_exchange_id(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
}
/* case 6 */
exid->flags |= EXCHGID4_FLAG_CONFIRMED_R;
+ trace_nfsd_clid_confirmed_r(conf);
goto out_copy;
}
if (!creds_match) { /* case 3 */
@@ -3190,6 +3191,7 @@ nfsd4_exchange_id(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
}
if (verfs_match) { /* case 2 */
conf->cl_exchange_flags |= EXCHGID4_FLAG_CONFIRMED_R;
+ trace_nfsd_clid_confirmed_r(conf);
goto out_copy;
}
/* case 5, client reboot */
@@ -3203,11 +3205,13 @@ nfsd4_exchange_id(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
goto out;
}
- unconf = find_unconfirmed_client_by_name(&exid->clname, nn);
+ unconf = find_unconfirmed_client_by_name(&exid->clname, nn);
if (unconf) /* case 4, possible retry or client restart */
unhash_client_locked(unconf);
- /* case 1 (normal case) */
+ /* case 1, new owner ID */
+ trace_nfsd_clid_fresh(new);
+
out_new:
if (conf) {
status = mark_client_expired_locked(conf);
@@ -3237,8 +3241,10 @@ nfsd4_exchange_id(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
out_nolock:
if (new)
expire_client(new);
- if (unconf)
+ if (unconf) {
+ trace_nfsd_clid_expire_unconf(&unconf->cl_clientid);
expire_client(unconf);
+ }
return status;
}
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 33fba6dbdc4a..39b7caea4664 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -636,6 +636,7 @@ DEFINE_EVENT(nfsd_clid_class, nfsd_clid_##name, \
TP_ARGS(clp))
DEFINE_CLID_EVENT(fresh);
+DEFINE_CLID_EVENT(confirmed_r);
/*
* from fs/nfsd/filecache.h
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 12/24] NFSD: Constify @fh argument of knfsd_fh_hash()
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (10 preceding siblings ...)
2021-05-14 19:56 ` [PATCH v3 11/24] NFSD: Add tracepoints for EXCHANGEID " Chuck Lever
@ 2021-05-14 19:56 ` Chuck Lever
2021-05-14 19:56 ` [PATCH v3 13/24] NFSD: Capture every CB state transition Chuck Lever
` (11 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:56 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Enable knfsd_fh_hash() to be invoked in functions where the
filehandle pointer is a const.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfsfh.h | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/fs/nfsd/nfsfh.h b/fs/nfsd/nfsfh.h
index aff2cda5c6c3..6106697adc04 100644
--- a/fs/nfsd/nfsfh.h
+++ b/fs/nfsd/nfsfh.h
@@ -225,15 +225,12 @@ static inline bool fh_fsid_match(struct knfsd_fh *fh1, struct knfsd_fh *fh2)
* returns a crc32 hash for the filehandle that is compatible with
* the one displayed by "wireshark".
*/
-
-static inline u32
-knfsd_fh_hash(struct knfsd_fh *fh)
+static inline u32 knfsd_fh_hash(const struct knfsd_fh *fh)
{
return ~crc32_le(0xFFFFFFFF, (unsigned char *)&fh->fh_base, fh->fh_size);
}
#else
-static inline u32
-knfsd_fh_hash(struct knfsd_fh *fh)
+static inline u32 knfsd_fh_hash(const struct knfsd_fh *fh)
{
return 0;
}
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 13/24] NFSD: Capture every CB state transition
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (11 preceding siblings ...)
2021-05-14 19:56 ` [PATCH v3 12/24] NFSD: Constify @fh argument of knfsd_fh_hash() Chuck Lever
@ 2021-05-14 19:56 ` Chuck Lever
2021-05-14 19:56 ` [PATCH v3 14/24] NFSD: Drop TRACE_DEFINE_ENUM for NFSD4_CB_<state> macros Chuck Lever
` (10 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:56 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
We were missing one.
As a clean-up, add a helper that sets the new CB state and fires
a tracepoint. The tracepoint fires only when the state changes, to
help reduce trace log noise.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4callback.c | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index 7325592b456e..b6cc51a9f37c 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -945,20 +945,26 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c
return 0;
}
+static void nfsd4_mark_cb_state(struct nfs4_client *clp, int newstate)
+{
+ if (clp->cl_cb_state != newstate) {
+ clp->cl_cb_state = newstate;
+ trace_nfsd_cb_state(clp);
+ }
+}
+
static void nfsd4_mark_cb_down(struct nfs4_client *clp, int reason)
{
if (test_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags))
return;
- clp->cl_cb_state = NFSD4_CB_DOWN;
- trace_nfsd_cb_state(clp);
+ nfsd4_mark_cb_state(clp, NFSD4_CB_DOWN);
}
static void nfsd4_mark_cb_fault(struct nfs4_client *clp, int reason)
{
if (test_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags))
return;
- clp->cl_cb_state = NFSD4_CB_FAULT;
- trace_nfsd_cb_state(clp);
+ nfsd4_mark_cb_state(clp, NFSD4_CB_FAULT);
}
static void nfsd4_cb_probe_done(struct rpc_task *task, void *calldata)
@@ -968,10 +974,8 @@ static void nfsd4_cb_probe_done(struct rpc_task *task, void *calldata)
trace_nfsd_cb_done(clp, task->tk_status);
if (task->tk_status)
nfsd4_mark_cb_down(clp, task->tk_status);
- else {
- clp->cl_cb_state = NFSD4_CB_UP;
- trace_nfsd_cb_state(clp);
- }
+ else
+ nfsd4_mark_cb_state(clp, NFSD4_CB_UP);
}
static void nfsd4_cb_probe_release(void *calldata)
@@ -995,8 +999,7 @@ static const struct rpc_call_ops nfsd4_cb_probe_ops = {
*/
void nfsd4_probe_callback(struct nfs4_client *clp)
{
- clp->cl_cb_state = NFSD4_CB_UNKNOWN;
- trace_nfsd_cb_state(clp);
+ nfsd4_mark_cb_state(clp, NFSD4_CB_UNKNOWN);
set_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags);
nfsd4_run_cb(&clp->cl_cb_null);
}
@@ -1009,11 +1012,10 @@ void nfsd4_probe_callback_sync(struct nfs4_client *clp)
void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *conn)
{
- clp->cl_cb_state = NFSD4_CB_UNKNOWN;
+ nfsd4_mark_cb_state(clp, NFSD4_CB_UNKNOWN);
spin_lock(&clp->cl_lock);
memcpy(&clp->cl_cb_conn, conn, sizeof(struct nfs4_cb_conn));
spin_unlock(&clp->cl_lock);
- trace_nfsd_cb_state(clp);
}
/*
@@ -1345,7 +1347,7 @@ nfsd4_run_cb_work(struct work_struct *work)
* Don't send probe messages for 4.1 or later.
*/
if (!cb->cb_ops && clp->cl_minorversion) {
- clp->cl_cb_state = NFSD4_CB_UP;
+ nfsd4_mark_cb_state(clp, NFSD4_CB_UP);
nfsd41_destroy_cb(cb);
return;
}
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 14/24] NFSD: Drop TRACE_DEFINE_ENUM for NFSD4_CB_<state> macros
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (12 preceding siblings ...)
2021-05-14 19:56 ` [PATCH v3 13/24] NFSD: Capture every CB state transition Chuck Lever
@ 2021-05-14 19:56 ` Chuck Lever
2021-05-14 19:56 ` [PATCH v3 15/24] NFSD: Add cb_lost tracepoint Chuck Lever
` (9 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:56 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
TRACE_DEFINE_ENUM() is necessary for enum {} but not for C macros.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/trace.h | 5 -----
1 file changed, 5 deletions(-)
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 39b7caea4664..1c43e6647d1e 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -877,11 +877,6 @@ TRACE_EVENT(nfsd_cb_nodelegs,
TP_printk("client %08x:%08x", __entry->cl_boot, __entry->cl_id)
)
-TRACE_DEFINE_ENUM(NFSD4_CB_UP);
-TRACE_DEFINE_ENUM(NFSD4_CB_UNKNOWN);
-TRACE_DEFINE_ENUM(NFSD4_CB_DOWN);
-TRACE_DEFINE_ENUM(NFSD4_CB_FAULT);
-
#define show_cb_state(val) \
__print_symbolic(val, \
{ NFSD4_CB_UP, "UP" }, \
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 15/24] NFSD: Add cb_lost tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (13 preceding siblings ...)
2021-05-14 19:56 ` [PATCH v3 14/24] NFSD: Drop TRACE_DEFINE_ENUM for NFSD4_CB_<state> macros Chuck Lever
@ 2021-05-14 19:56 ` Chuck Lever
2021-05-14 19:56 ` [PATCH v3 16/24] NFSD: Adjust cb_shutdown tracepoint Chuck Lever
` (8 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:56 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Provide more clarity about when the callback channel is in trouble.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4state.c | 2 ++
fs/nfsd/trace.h | 1 +
2 files changed, 3 insertions(+)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index aa645aeee7b6..377ec4a6a771 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1745,6 +1745,8 @@ static void nfsd4_conn_lost(struct svc_xpt_user *u)
struct nfsd4_conn *c = container_of(u, struct nfsd4_conn, cn_xpt_user);
struct nfs4_client *clp = c->cn_session->se_client;
+ trace_nfsd_cb_lost(clp);
+
spin_lock(&clp->cl_lock);
if (!list_empty(&c->cn_persession)) {
list_del(&c->cn_persession);
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 1c43e6647d1e..336dc4c45416 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -912,6 +912,7 @@ DEFINE_EVENT(nfsd_cb_class, nfsd_cb_##name, \
DEFINE_NFSD_CB_EVENT(setup);
DEFINE_NFSD_CB_EVENT(state);
+DEFINE_NFSD_CB_EVENT(lost);
DEFINE_NFSD_CB_EVENT(shutdown);
TRACE_DEFINE_ENUM(RPC_AUTH_NULL);
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 16/24] NFSD: Adjust cb_shutdown tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (14 preceding siblings ...)
2021-05-14 19:56 ` [PATCH v3 15/24] NFSD: Add cb_lost tracepoint Chuck Lever
@ 2021-05-14 19:56 ` Chuck Lever
2021-05-14 19:56 ` [PATCH v3 17/24] NFSD: Remove spurious cb_setup_err tracepoint Chuck Lever
` (7 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:56 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Show when the upper layer requested a shutdown. RPC tracepoints can
already show when rpc_shutdown_client() is called.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4callback.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index b6cc51a9f37c..ab1836381e22 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -1233,6 +1233,9 @@ void nfsd4_destroy_callback_queue(void)
/* must be called under the state lock */
void nfsd4_shutdown_callback(struct nfs4_client *clp)
{
+ if (clp->cl_cb_state != NFSD4_CB_UNKNOWN)
+ trace_nfsd_cb_shutdown(clp);
+
set_bit(NFSD4_CLIENT_CB_KILL, &clp->cl_flags);
/*
* Note this won't actually result in a null callback;
@@ -1278,7 +1281,6 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb)
* kill the old client:
*/
if (clp->cl_cb_client) {
- trace_nfsd_cb_shutdown(clp);
rpc_shutdown_client(clp->cl_cb_client);
clp->cl_cb_client = NULL;
put_cred(clp->cl_cb_cred);
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 17/24] NFSD: Remove spurious cb_setup_err tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (15 preceding siblings ...)
2021-05-14 19:56 ` [PATCH v3 16/24] NFSD: Adjust cb_shutdown tracepoint Chuck Lever
@ 2021-05-14 19:56 ` Chuck Lever
2021-05-14 19:57 ` [PATCH v3 18/24] NFSD: Enhance the nfsd_cb_setup tracepoint Chuck Lever
` (6 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:56 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
This path is not really an error path, so the tracepoint I added
there is just noise.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4callback.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index ab1836381e22..15ba16c54793 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -915,10 +915,8 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c
args.authflavor = clp->cl_cred.cr_flavor;
clp->cl_cb_ident = conn->cb_ident;
} else {
- if (!conn->cb_xprt) {
- trace_nfsd_cb_setup_err(clp, -EINVAL);
+ if (!conn->cb_xprt)
return -EINVAL;
- }
clp->cl_cb_conn.cb_xprt = conn->cb_xprt;
clp->cl_cb_session = ses;
args.bc_xprt = conn->cb_xprt;
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 18/24] NFSD: Enhance the nfsd_cb_setup tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (16 preceding siblings ...)
2021-05-14 19:56 ` [PATCH v3 17/24] NFSD: Remove spurious cb_setup_err tracepoint Chuck Lever
@ 2021-05-14 19:57 ` Chuck Lever
2021-05-14 19:57 ` [PATCH v3 19/24] NFSD: Add an nfsd_cb_lm_notify tracepoint Chuck Lever
` (5 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:57 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Display the transport protocol and authentication flavor so admins
can see what they might be getting wrong.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4callback.c | 3 ++-
fs/nfsd/trace.h | 27 ++++++++++++++++++++++++++-
2 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index 15ba16c54793..c2a2a58b3581 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -939,7 +939,8 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c
}
clp->cl_cb_client = client;
clp->cl_cb_cred = cred;
- trace_nfsd_cb_setup(clp);
+ trace_nfsd_cb_setup(clp, rpc_peeraddr2str(client, RPC_DISPLAY_NETID),
+ args.authflavor);
return 0;
}
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 336dc4c45416..fc80879d6077 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -910,7 +910,6 @@ DEFINE_EVENT(nfsd_cb_class, nfsd_cb_##name, \
TP_PROTO(const struct nfs4_client *clp), \
TP_ARGS(clp))
-DEFINE_NFSD_CB_EVENT(setup);
DEFINE_NFSD_CB_EVENT(state);
DEFINE_NFSD_CB_EVENT(lost);
DEFINE_NFSD_CB_EVENT(shutdown);
@@ -931,6 +930,32 @@ TRACE_DEFINE_ENUM(RPC_AUTH_GSS_KRB5P);
{ RPC_AUTH_GSS_KRB5I, "krb5i" }, \
{ RPC_AUTH_GSS_KRB5P, "krb5p" })
+TRACE_EVENT(nfsd_cb_setup,
+ TP_PROTO(const struct nfs4_client *clp,
+ const char *netid,
+ rpc_authflavor_t authflavor
+ ),
+ TP_ARGS(clp, netid, authflavor),
+ TP_STRUCT__entry(
+ __field(u32, cl_boot)
+ __field(u32, cl_id)
+ __field(unsigned long, authflavor)
+ __array(unsigned char, addr, sizeof(struct sockaddr_in6))
+ __array(unsigned char, netid, 8)
+ ),
+ TP_fast_assign(
+ __entry->cl_boot = clp->cl_clientid.cl_boot;
+ __entry->cl_id = clp->cl_clientid.cl_id;
+ strlcpy(__entry->netid, netid, sizeof(__entry->netid));
+ __entry->authflavor = authflavor;
+ memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
+ sizeof(struct sockaddr_in6));
+ ),
+ TP_printk("addr=%pISpc client %08x:%08x proto=%s flavor=%s",
+ __entry->addr, __entry->cl_boot, __entry->cl_id,
+ __entry->netid, show_nfsd_authflavor(__entry->authflavor))
+);
+
TRACE_EVENT(nfsd_cb_setup_err,
TP_PROTO(
const struct nfs4_client *clp,
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 19/24] NFSD: Add an nfsd_cb_lm_notify tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (17 preceding siblings ...)
2021-05-14 19:57 ` [PATCH v3 18/24] NFSD: Enhance the nfsd_cb_setup tracepoint Chuck Lever
@ 2021-05-14 19:57 ` Chuck Lever
2021-05-14 19:57 ` [PATCH v3 20/24] NFSD: Add an nfsd_cb_offload tracepoint Chuck Lever
` (4 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:57 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
When the server kicks off a CB_LM_NOTIFY callback, record its
arguments so we can better observe asynchronous locking behavior.
For example:
nfsd-998 [002] 1471.705873: nfsd_cb_notify_lock: addr=192.168.2.51:0 client 6092a47c:35a43fc1 fh_hash=0x8950b23a
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Cc: Jeff Layton <jlayton@redhat.com>
---
fs/nfsd/nfs4state.c | 4 +++-
fs/nfsd/trace.h | 26 ++++++++++++++++++++++++++
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 377ec4a6a771..d4eee8a47ff3 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -6451,8 +6451,10 @@ nfsd4_lm_notify(struct file_lock *fl)
}
spin_unlock(&nn->blocked_locks_lock);
- if (queue)
+ if (queue) {
+ trace_nfsd_cb_notify_lock(lo, nbl);
nfsd4_run_cb(&nbl->nbl_cb);
+ }
}
static const struct lock_manager_operations nfsd_posix_mng_ops = {
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index fc80879d6077..921323f88322 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -1027,6 +1027,32 @@ TRACE_EVENT(nfsd_cb_done,
__entry->status)
);
+TRACE_EVENT(nfsd_cb_notify_lock,
+ TP_PROTO(
+ const struct nfs4_lockowner *lo,
+ const struct nfsd4_blocked_lock *nbl
+ ),
+ TP_ARGS(lo, nbl),
+ TP_STRUCT__entry(
+ __field(u32, cl_boot)
+ __field(u32, cl_id)
+ __field(u32, fh_hash)
+ __array(unsigned char, addr, sizeof(struct sockaddr_in6))
+ ),
+ TP_fast_assign(
+ const struct nfs4_client *clp = lo->lo_owner.so_client;
+
+ __entry->cl_boot = clp->cl_clientid.cl_boot;
+ __entry->cl_id = clp->cl_clientid.cl_id;
+ __entry->fh_hash = knfsd_fh_hash(&nbl->nbl_fh);
+ memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
+ sizeof(struct sockaddr_in6));
+ ),
+ TP_printk("addr=%pISpc client %08x:%08x fh_hash=0x%08x",
+ __entry->addr, __entry->cl_boot, __entry->cl_id,
+ __entry->fh_hash)
+);
+
#endif /* _NFSD_TRACE_H */
#undef TRACE_INCLUDE_PATH
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 20/24] NFSD: Add an nfsd_cb_offload tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (18 preceding siblings ...)
2021-05-14 19:57 ` [PATCH v3 19/24] NFSD: Add an nfsd_cb_lm_notify tracepoint Chuck Lever
@ 2021-05-14 19:57 ` Chuck Lever
2021-05-14 19:57 ` [PATCH v3 21/24] NFSD: Replace the nfsd_deleg_break tracepoint Chuck Lever
` (3 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:57 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Record the arguments of CB_OFFLOAD callbacks so we can better
observe asynchronous copy-offload behavior. For example:
nfsd-995 [008] 7721.934222: nfsd_cb_offload:
addr=192.168.2.51:0 client 6092a47c:35a43fc1 fh_hash=0x8739113a
count=116528 status=0
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Cc: Olga Kornievskaia <kolga@netapp.com>
Cc: Dai Ngo <Dai.Ngo@oracle.com>
---
fs/nfsd/nfs4proc.c | 2 ++
fs/nfsd/trace.h | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+)
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index f4ce93d7f26e..426b232ca9fd 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -1497,6 +1497,8 @@ static int nfsd4_do_async_copy(void *data)
memcpy(&cb_copy->fh, ©->fh, sizeof(copy->fh));
nfsd4_init_cb(&cb_copy->cp_cb, cb_copy->cp_clp,
&nfsd4_cb_offload_ops, NFSPROC4_CLNT_CB_OFFLOAD);
+ trace_nfsd_cb_offload(copy->cp_clp, ©->cp_res.cb_stateid,
+ ©->fh, copy->cp_count, copy->nfserr);
nfsd4_run_cb(&cb_copy->cp_cb);
out:
if (!copy->cp_intra)
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 921323f88322..1fb56433043d 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -1053,6 +1053,42 @@ TRACE_EVENT(nfsd_cb_notify_lock,
__entry->fh_hash)
);
+TRACE_EVENT(nfsd_cb_offload,
+ TP_PROTO(
+ const struct nfs4_client *clp,
+ const stateid_t *stp,
+ const struct knfsd_fh *fh,
+ u64 count,
+ __be32 status
+ ),
+ TP_ARGS(clp, stp, fh, count, status),
+ TP_STRUCT__entry(
+ __field(u32, cl_boot)
+ __field(u32, cl_id)
+ __field(u32, si_id)
+ __field(u32, si_generation)
+ __field(u32, fh_hash)
+ __field(int, status)
+ __field(u64, count)
+ __array(unsigned char, addr, sizeof(struct sockaddr_in6))
+ ),
+ TP_fast_assign(
+ __entry->cl_boot = stp->si_opaque.so_clid.cl_boot;
+ __entry->cl_id = stp->si_opaque.so_clid.cl_id;
+ __entry->si_id = stp->si_opaque.so_id;
+ __entry->si_generation = stp->si_generation;
+ __entry->fh_hash = knfsd_fh_hash(fh);
+ __entry->status = be32_to_cpu(status);
+ __entry->count = count;
+ memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
+ sizeof(struct sockaddr_in6));
+ ),
+ TP_printk("addr=%pISpc client %08x:%08x stateid %08x:%08x fh_hash=0x%08x count=%llu status=%d",
+ __entry->addr, __entry->cl_boot, __entry->cl_id,
+ __entry->si_id, __entry->si_generation,
+ __entry->fh_hash, __entry->count, __entry->status)
+);
+
#endif /* _NFSD_TRACE_H */
#undef TRACE_INCLUDE_PATH
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 21/24] NFSD: Replace the nfsd_deleg_break tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (19 preceding siblings ...)
2021-05-14 19:57 ` [PATCH v3 20/24] NFSD: Add an nfsd_cb_offload tracepoint Chuck Lever
@ 2021-05-14 19:57 ` Chuck Lever
2021-05-14 19:57 ` [PATCH v3 22/24] NFSD: Add an nfsd_cb_probe tracepoint Chuck Lever
` (2 subsequent siblings)
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:57 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Renamed so it can be enabled as a set with the other nfsd_cb_
tracepoints. And, consistent with those tracepoints, report the
address of the client, the client ID the server has given it, and
the state ID being recalled.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4state.c | 2 +-
fs/nfsd/trace.h | 32 +++++++++++++++++++++++++++++++-
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index d4eee8a47ff3..b2573d3ecd3c 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -4641,7 +4641,7 @@ nfsd_break_deleg_cb(struct file_lock *fl)
struct nfs4_delegation *dp = (struct nfs4_delegation *)fl->fl_owner;
struct nfs4_file *fp = dp->dl_stid.sc_file;
- trace_nfsd_deleg_break(&dp->dl_stid.sc_stateid);
+ trace_nfsd_cb_recall(&dp->dl_stid);
/*
* We don't want the locks code to timeout the lease for us;
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 1fb56433043d..b7ede12f0ab1 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -459,7 +459,6 @@ DEFINE_STATEID_EVENT(layout_recall_release);
DEFINE_STATEID_EVENT(open);
DEFINE_STATEID_EVENT(deleg_read);
-DEFINE_STATEID_EVENT(deleg_break);
DEFINE_STATEID_EVENT(deleg_recall);
DECLARE_EVENT_CLASS(nfsd_stateseqid_class,
@@ -1027,6 +1026,37 @@ TRACE_EVENT(nfsd_cb_done,
__entry->status)
);
+TRACE_EVENT(nfsd_cb_recall,
+ TP_PROTO(
+ const struct nfs4_stid *stid
+ ),
+ TP_ARGS(stid),
+ TP_STRUCT__entry(
+ __field(u32, cl_boot)
+ __field(u32, cl_id)
+ __field(u32, si_id)
+ __field(u32, si_generation)
+ __array(unsigned char, addr, sizeof(struct sockaddr_in6))
+ ),
+ TP_fast_assign(
+ const stateid_t *stp = &stid->sc_stateid;
+ const struct nfs4_client *clp = stid->sc_client;
+
+ __entry->cl_boot = stp->si_opaque.so_clid.cl_boot;
+ __entry->cl_id = stp->si_opaque.so_clid.cl_id;
+ __entry->si_id = stp->si_opaque.so_id;
+ __entry->si_generation = stp->si_generation;
+ if (clp)
+ memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
+ sizeof(struct sockaddr_in6));
+ else
+ memset(__entry->addr, 0, sizeof(struct sockaddr_in6));
+ ),
+ TP_printk("addr=%pISpc client %08x:%08x stateid %08x:%08x",
+ __entry->addr, __entry->cl_boot, __entry->cl_id,
+ __entry->si_id, __entry->si_generation)
+);
+
TRACE_EVENT(nfsd_cb_notify_lock,
TP_PROTO(
const struct nfs4_lockowner *lo,
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 22/24] NFSD: Add an nfsd_cb_probe tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (20 preceding siblings ...)
2021-05-14 19:57 ` [PATCH v3 21/24] NFSD: Replace the nfsd_deleg_break tracepoint Chuck Lever
@ 2021-05-14 19:57 ` Chuck Lever
2021-05-14 19:57 ` [PATCH v3 23/24] NFSD: Remove the nfsd_cb_work and nfsd_cb_done tracepoints Chuck Lever
2021-05-14 19:57 ` [PATCH v3 24/24] NFSD: Update nfsd_cb_args tracepoint Chuck Lever
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:57 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Record a tracepoint event when the server performs a callback
probe. This event can be enabled as a group with other nfsd_cb
tracepoints.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4callback.c | 1 +
fs/nfsd/trace.h | 1 +
2 files changed, 2 insertions(+)
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index c2a2a58b3581..ddab969d7865 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -998,6 +998,7 @@ static const struct rpc_call_ops nfsd4_cb_probe_ops = {
*/
void nfsd4_probe_callback(struct nfs4_client *clp)
{
+ trace_nfsd_cb_probe(clp);
nfsd4_mark_cb_state(clp, NFSD4_CB_UNKNOWN);
set_bit(NFSD4_CLIENT_CB_UPDATE, &clp->cl_flags);
nfsd4_run_cb(&clp->cl_cb_null);
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index b7ede12f0ab1..2cdcf53a2c41 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -910,6 +910,7 @@ DEFINE_EVENT(nfsd_cb_class, nfsd_cb_##name, \
TP_ARGS(clp))
DEFINE_NFSD_CB_EVENT(state);
+DEFINE_NFSD_CB_EVENT(probe);
DEFINE_NFSD_CB_EVENT(lost);
DEFINE_NFSD_CB_EVENT(shutdown);
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 23/24] NFSD: Remove the nfsd_cb_work and nfsd_cb_done tracepoints
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (21 preceding siblings ...)
2021-05-14 19:57 ` [PATCH v3 22/24] NFSD: Add an nfsd_cb_probe tracepoint Chuck Lever
@ 2021-05-14 19:57 ` Chuck Lever
2021-05-14 19:57 ` [PATCH v3 24/24] NFSD: Update nfsd_cb_args tracepoint Chuck Lever
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:57 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Clean up: These are noise in properly working systems. If you really
need to observe the operation of the callback mechanism, use the
sunrpc:rpc\* tracepoints along with the workqueue tracepoints.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfs4callback.c | 5 -----
fs/nfsd/trace.h | 48 ------------------------------------------------
2 files changed, 53 deletions(-)
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index ddab969d7865..84401ca04705 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -970,7 +970,6 @@ static void nfsd4_cb_probe_done(struct rpc_task *task, void *calldata)
{
struct nfs4_client *clp = container_of(calldata, struct nfs4_client, cl_cb_null);
- trace_nfsd_cb_done(clp, task->tk_status);
if (task->tk_status)
nfsd4_mark_cb_down(clp, task->tk_status);
else
@@ -1172,8 +1171,6 @@ static void nfsd4_cb_done(struct rpc_task *task, void *calldata)
struct nfsd4_callback *cb = calldata;
struct nfs4_client *clp = cb->cb_clp;
- trace_nfsd_cb_done(clp, task->tk_status);
-
if (!nfsd4_cb_sequence_done(task, cb))
return;
@@ -1326,8 +1323,6 @@ nfsd4_run_cb_work(struct work_struct *work)
struct rpc_clnt *clnt;
int flags;
- trace_nfsd_cb_work(clp, cb->cb_msg.rpc_proc->p_name);
-
if (cb->cb_need_restart) {
cb->cb_need_restart = false;
} else {
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 2cdcf53a2c41..daadcb54886d 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -979,54 +979,6 @@ TRACE_EVENT(nfsd_cb_setup_err,
__entry->addr, __entry->cl_boot, __entry->cl_id, __entry->error)
);
-TRACE_EVENT(nfsd_cb_work,
- TP_PROTO(
- const struct nfs4_client *clp,
- const char *procedure
- ),
- TP_ARGS(clp, procedure),
- TP_STRUCT__entry(
- __field(u32, cl_boot)
- __field(u32, cl_id)
- __string(procedure, procedure)
- __array(unsigned char, addr, sizeof(struct sockaddr_in6))
- ),
- TP_fast_assign(
- __entry->cl_boot = clp->cl_clientid.cl_boot;
- __entry->cl_id = clp->cl_clientid.cl_id;
- __assign_str(procedure, procedure)
- memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
- sizeof(struct sockaddr_in6));
- ),
- TP_printk("addr=%pISpc client %08x:%08x procedure=%s",
- __entry->addr, __entry->cl_boot, __entry->cl_id,
- __get_str(procedure))
-);
-
-TRACE_EVENT(nfsd_cb_done,
- TP_PROTO(
- const struct nfs4_client *clp,
- int status
- ),
- TP_ARGS(clp, status),
- TP_STRUCT__entry(
- __field(u32, cl_boot)
- __field(u32, cl_id)
- __field(int, status)
- __array(unsigned char, addr, sizeof(struct sockaddr_in6))
- ),
- TP_fast_assign(
- __entry->cl_boot = clp->cl_clientid.cl_boot;
- __entry->cl_id = clp->cl_clientid.cl_id;
- __entry->status = status;
- memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
- sizeof(struct sockaddr_in6));
- ),
- TP_printk("addr=%pISpc client %08x:%08x status=%d",
- __entry->addr, __entry->cl_boot, __entry->cl_id,
- __entry->status)
-);
-
TRACE_EVENT(nfsd_cb_recall,
TP_PROTO(
const struct nfs4_stid *stid
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v3 24/24] NFSD: Update nfsd_cb_args tracepoint
2021-05-14 19:55 [PATCH v3 00/24] NFSD callback and lease management observability Chuck Lever
` (22 preceding siblings ...)
2021-05-14 19:57 ` [PATCH v3 23/24] NFSD: Remove the nfsd_cb_work and nfsd_cb_done tracepoints Chuck Lever
@ 2021-05-14 19:57 ` Chuck Lever
23 siblings, 0 replies; 25+ messages in thread
From: Chuck Lever @ 2021-05-14 19:57 UTC (permalink / raw)
To: linux-nfs; +Cc: dwysocha, bfields
Clean-up: Re-order the display of IP address and client ID to be
consistent with other _cb_ tracepoints.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/trace.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index daadcb54886d..10cc3aaf1089 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -857,9 +857,9 @@ TRACE_EVENT(nfsd_cb_args,
memcpy(__entry->addr, &conn->cb_addr,
sizeof(struct sockaddr_in6));
),
- TP_printk("client %08x:%08x callback addr=%pISpc prog=%u ident=%u",
- __entry->cl_boot, __entry->cl_id,
- __entry->addr, __entry->prog, __entry->ident)
+ TP_printk("addr=%pISpc client %08x:%08x prog=%u ident=%u",
+ __entry->addr, __entry->cl_boot, __entry->cl_id,
+ __entry->prog, __entry->ident)
);
TRACE_EVENT(nfsd_cb_nodelegs,
^ permalink raw reply related [flat|nested] 25+ messages in thread