]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
NFS4: Trace state recovery operation
authorChuck Lever <chuck.lever@oracle.com>
Tue, 5 Nov 2019 16:04:07 +0000 (11:04 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 18 Nov 2019 09:58:39 +0000 (10:58 +0100)
Add a trace point in the main state manager loop to observe state
recovery operation. Help track down state recovery bugs.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/nfs4state.c
fs/nfs/nfs4trace.h

index ba97b9cf632cd8868b3b179ed0963ebf4c696107..4c4d05d2848bfb27e857b7e464ba7eabdbc8cba5 100644 (file)
@@ -60,6 +60,7 @@
 #include "nfs4session.h"
 #include "pnfs.h"
 #include "netns.h"
+#include "nfs4trace.h"
 
 #define NFSDBG_FACILITY                NFSDBG_STATE
 
@@ -2539,6 +2540,7 @@ static void nfs4_state_manager(struct nfs_client *clp)
 
        /* Ensure exclusive access to NFSv4 state */
        do {
+               trace_nfs4_state_mgr(clp);
                clear_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
                if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) {
                        section = "purge state";
@@ -2652,6 +2654,7 @@ static void nfs4_state_manager(struct nfs_client *clp)
 out_error:
        if (strlen(section))
                section_sep = ": ";
+       trace_nfs4_state_mgr_failed(clp, section, status);
        pr_warn_ratelimited("NFS: state manager%s%s failed on NFSv4 server %s"
                        " with error %d\n", section_sep, section,
                        clp->cl_hostname, -status);
index b2f395fa7350be36a71a44be9f15d93cd52a3d8a..0c298dc5e4b27705034d369f8c9cf89c51826a9e 100644 (file)
@@ -562,6 +562,99 @@ TRACE_EVENT(nfs4_setup_sequence,
                )
 );
 
+TRACE_DEFINE_ENUM(NFS4CLNT_MANAGER_RUNNING);
+TRACE_DEFINE_ENUM(NFS4CLNT_CHECK_LEASE);
+TRACE_DEFINE_ENUM(NFS4CLNT_LEASE_EXPIRED);
+TRACE_DEFINE_ENUM(NFS4CLNT_RECLAIM_REBOOT);
+TRACE_DEFINE_ENUM(NFS4CLNT_RECLAIM_NOGRACE);
+TRACE_DEFINE_ENUM(NFS4CLNT_DELEGRETURN);
+TRACE_DEFINE_ENUM(NFS4CLNT_SESSION_RESET);
+TRACE_DEFINE_ENUM(NFS4CLNT_LEASE_CONFIRM);
+TRACE_DEFINE_ENUM(NFS4CLNT_SERVER_SCOPE_MISMATCH);
+TRACE_DEFINE_ENUM(NFS4CLNT_PURGE_STATE);
+TRACE_DEFINE_ENUM(NFS4CLNT_BIND_CONN_TO_SESSION);
+TRACE_DEFINE_ENUM(NFS4CLNT_MOVED);
+TRACE_DEFINE_ENUM(NFS4CLNT_LEASE_MOVED);
+TRACE_DEFINE_ENUM(NFS4CLNT_DELEGATION_EXPIRED);
+TRACE_DEFINE_ENUM(NFS4CLNT_RUN_MANAGER);
+TRACE_DEFINE_ENUM(NFS4CLNT_DELEGRETURN_RUNNING);
+
+#define show_nfs4_clp_state(state) \
+       __print_flags(state, "|", \
+               { NFS4CLNT_MANAGER_RUNNING,     "MANAGER_RUNNING" }, \
+               { NFS4CLNT_CHECK_LEASE,         "CHECK_LEASE" }, \
+               { NFS4CLNT_LEASE_EXPIRED,       "LEASE_EXPIRED" }, \
+               { NFS4CLNT_RECLAIM_REBOOT,      "RECLAIM_REBOOT" }, \
+               { NFS4CLNT_RECLAIM_NOGRACE,     "RECLAIM_NOGRACE" }, \
+               { NFS4CLNT_DELEGRETURN,         "DELEGRETURN" }, \
+               { NFS4CLNT_SESSION_RESET,       "SESSION_RESET" }, \
+               { NFS4CLNT_LEASE_CONFIRM,       "LEASE_CONFIRM" }, \
+               { NFS4CLNT_SERVER_SCOPE_MISMATCH, \
+                                               "SERVER_SCOPE_MISMATCH" }, \
+               { NFS4CLNT_PURGE_STATE,         "PURGE_STATE" }, \
+               { NFS4CLNT_BIND_CONN_TO_SESSION, \
+                                               "BIND_CONN_TO_SESSION" }, \
+               { NFS4CLNT_MOVED,               "MOVED" }, \
+               { NFS4CLNT_LEASE_MOVED,         "LEASE_MOVED" }, \
+               { NFS4CLNT_DELEGATION_EXPIRED,  "DELEGATION_EXPIRED" }, \
+               { NFS4CLNT_RUN_MANAGER,         "RUN_MANAGER" }, \
+               { NFS4CLNT_DELEGRETURN_RUNNING, "DELEGRETURN_RUNNING" })
+
+TRACE_EVENT(nfs4_state_mgr,
+               TP_PROTO(
+                       const struct nfs_client *clp
+               ),
+
+               TP_ARGS(clp),
+
+               TP_STRUCT__entry(
+                       __field(unsigned long, state)
+                       __string(hostname, clp->cl_hostname)
+               ),
+
+               TP_fast_assign(
+                       __entry->state = clp->cl_state;
+                       __assign_str(hostname, clp->cl_hostname)
+               ),
+
+               TP_printk(
+                       "hostname=%s clp state=%s", __get_str(hostname),
+                       show_nfs4_clp_state(__entry->state)
+               )
+)
+
+TRACE_EVENT(nfs4_state_mgr_failed,
+               TP_PROTO(
+                       const struct nfs_client *clp,
+                       const char *section,
+                       int status
+               ),
+
+               TP_ARGS(clp, section, status),
+
+               TP_STRUCT__entry(
+                       __field(unsigned long, error)
+                       __field(unsigned long, state)
+                       __string(hostname, clp->cl_hostname)
+                       __string(section, section)
+               ),
+
+               TP_fast_assign(
+                       __entry->error = status;
+                       __entry->state = clp->cl_state;
+                       __assign_str(hostname, clp->cl_hostname);
+                       __assign_str(section, section);
+               ),
+
+               TP_printk(
+                       "hostname=%s clp state=%s error=%ld (%s) section=%s",
+                       __get_str(hostname),
+                       show_nfs4_clp_state(__entry->state), -__entry->error,
+                       show_nfsv4_errors(__entry->error), __get_str(section)
+
+               )
+)
+
 TRACE_EVENT(nfs4_xdr_status,
                TP_PROTO(
                        const struct xdr_stream *xdr,