NFSD: Replace dprintks in nfsd4_cb_sequence_done()
authorChuck Lever <chuck.lever@oracle.com>
Fri, 26 Jan 2024 17:45:48 +0000 (12:45 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Fri, 1 Mar 2024 14:12:14 +0000 (09:12 -0500)
Improve observability of backchannel session operation.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4callback.c
fs/nfsd/trace.h

index 3bff14241b3cc51745b480408e66adc4f327e09a..78d9939cf4b093a92678724fa48aa33462f4aaa6 100644 (file)
@@ -1165,6 +1165,8 @@ static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback
        if (!cb->cb_holds_slot)
                goto need_restart;
 
+       /* This is the operation status code for CB_SEQUENCE */
+       trace_nfsd_cb_seq_status(task, cb);
        switch (cb->cb_seq_status) {
        case 0:
                /*
@@ -1210,13 +1212,10 @@ static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback
                break;
        default:
                nfsd4_mark_cb_fault(cb->cb_clp, cb->cb_seq_status);
-               dprintk("%s: unprocessed error %d\n", __func__,
-                       cb->cb_seq_status);
        }
-
        nfsd41_cb_release_slot(cb);
-       dprintk("%s: freed slot, new seqid=%d\n", __func__,
-               clp->cl_cb_session->se_cb_seq_nr);
+
+       trace_nfsd_cb_free_slot(task, cb);
 
        if (RPC_SIGNALLED(task))
                goto need_restart;
index 38d11b43779c77173e59011f261a513ff86565fb..c134c755ae5d1ecf040c2b494da37a9ad027c689 100644 (file)
@@ -9,8 +9,10 @@
 #define _NFSD_TRACE_H
 
 #include <linux/tracepoint.h>
+#include <linux/sunrpc/clnt.h>
 #include <linux/sunrpc/xprt.h>
 #include <trace/misc/nfs.h>
+#include <trace/misc/sunrpc.h>
 
 #include "export.h"
 #include "nfsfh.h"
@@ -1440,6 +1442,86 @@ TRACE_EVENT(nfsd_cb_setup_err,
                __entry->error)
 );
 
+TRACE_EVENT(nfsd_cb_seq_status,
+       TP_PROTO(
+               const struct rpc_task *task,
+               const struct nfsd4_callback *cb
+       ),
+       TP_ARGS(task, cb),
+       TP_STRUCT__entry(
+               __field(unsigned int, task_id)
+               __field(unsigned int, client_id)
+               __field(u32, cl_boot)
+               __field(u32, cl_id)
+               __field(u32, seqno)
+               __field(u32, reserved)
+               __field(int, tk_status)
+               __field(int, seq_status)
+       ),
+       TP_fast_assign(
+               const struct nfs4_client *clp = cb->cb_clp;
+               const struct nfsd4_session *session = clp->cl_cb_session;
+               const struct nfsd4_sessionid *sid =
+                       (struct nfsd4_sessionid *)&session->se_sessionid;
+
+               __entry->task_id = task->tk_pid;
+               __entry->client_id = task->tk_client ?
+                                    task->tk_client->cl_clid : -1;
+               __entry->cl_boot = sid->clientid.cl_boot;
+               __entry->cl_id = sid->clientid.cl_id;
+               __entry->seqno = sid->sequence;
+               __entry->reserved = sid->reserved;
+               __entry->tk_status = task->tk_status;
+               __entry->seq_status = cb->cb_seq_status;
+       ),
+       TP_printk(SUNRPC_TRACE_TASK_SPECIFIER
+               " sessionid=%08x:%08x:%08x:%08x tk_status=%d seq_status=%d\n",
+               __entry->task_id, __entry->client_id,
+               __entry->cl_boot, __entry->cl_id,
+               __entry->seqno, __entry->reserved,
+               __entry->tk_status, __entry->seq_status
+       )
+);
+
+TRACE_EVENT(nfsd_cb_free_slot,
+       TP_PROTO(
+               const struct rpc_task *task,
+               const struct nfsd4_callback *cb
+       ),
+       TP_ARGS(task, cb),
+       TP_STRUCT__entry(
+               __field(unsigned int, task_id)
+               __field(unsigned int, client_id)
+               __field(u32, cl_boot)
+               __field(u32, cl_id)
+               __field(u32, seqno)
+               __field(u32, reserved)
+               __field(u32, slot_seqno)
+       ),
+       TP_fast_assign(
+               const struct nfs4_client *clp = cb->cb_clp;
+               const struct nfsd4_session *session = clp->cl_cb_session;
+               const struct nfsd4_sessionid *sid =
+                       (struct nfsd4_sessionid *)&session->se_sessionid;
+
+               __entry->task_id = task->tk_pid;
+               __entry->client_id = task->tk_client ?
+                                    task->tk_client->cl_clid : -1;
+               __entry->cl_boot = sid->clientid.cl_boot;
+               __entry->cl_id = sid->clientid.cl_id;
+               __entry->seqno = sid->sequence;
+               __entry->reserved = sid->reserved;
+               __entry->slot_seqno = session->se_cb_seq_nr;
+       ),
+       TP_printk(SUNRPC_TRACE_TASK_SPECIFIER
+               " sessionid=%08x:%08x:%08x:%08x new slot seqno=%u\n",
+               __entry->task_id, __entry->client_id,
+               __entry->cl_boot, __entry->cl_id,
+               __entry->seqno, __entry->reserved,
+               __entry->slot_seqno
+       )
+);
+
 TRACE_EVENT_CONDITION(nfsd_cb_recall,
        TP_PROTO(
                const struct nfs4_stid *stid