nfsd: track the main opcode for callbacks
authorJeff Layton <jlayton@kernel.org>
Mon, 26 Aug 2024 12:50:12 +0000 (08:50 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Fri, 20 Sep 2024 23:31:03 +0000 (19:31 -0400)
Keep track of the "main" opcode for the callback, and display it in the
tracepoint. This makes it simpler to discern what's happening when there
is more than one callback in flight.

The one special case is the CB_NULL RPC. That's not a CB_COMPOUND
opcode, so designate the value 0 for that.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4layouts.c
fs/nfsd/nfs4proc.c
fs/nfsd/nfs4state.c
fs/nfsd/state.h
fs/nfsd/trace.h

index 4f3072b5979a6e3cf0f6a90ca32d39fa790c8e9c..fbfddd3c4c943c34aa3991328eacb5759e311cc4 100644 (file)
@@ -740,6 +740,7 @@ static const struct nfsd4_callback_ops nfsd4_cb_layout_ops = {
        .prepare        = nfsd4_cb_layout_prepare,
        .done           = nfsd4_cb_layout_done,
        .release        = nfsd4_cb_layout_release,
+       .opcode         = OP_CB_LAYOUTRECALL,
 };
 
 static bool
index fc68af7570801722c2a31b6c29767ac3bad03b42..963a02e179a0a4f8a8973e0355dd5db7516cb710 100644 (file)
@@ -1622,7 +1622,8 @@ static int nfsd4_cb_offload_done(struct nfsd4_callback *cb,
 
 static const struct nfsd4_callback_ops nfsd4_cb_offload_ops = {
        .release = nfsd4_cb_offload_release,
-       .done = nfsd4_cb_offload_done
+       .done = nfsd4_cb_offload_done,
+       .opcode = OP_CB_OFFLOAD,
 };
 
 static void nfsd4_init_copy_res(struct nfsd4_copy *copy, bool sync)
index 070fdf60334f81f90e5c9738bec73abd57057e89..d349e3308899137d7acd537159e903741de92ce9 100644 (file)
@@ -400,6 +400,7 @@ static const struct nfsd4_callback_ops nfsd4_cb_notify_lock_ops = {
        .prepare        = nfsd4_cb_notify_lock_prepare,
        .done           = nfsd4_cb_notify_lock_done,
        .release        = nfsd4_cb_notify_lock_release,
+       .opcode         = OP_CB_NOTIFY_LOCK,
 };
 
 /*
@@ -3083,11 +3084,13 @@ nfsd4_cb_getattr_release(struct nfsd4_callback *cb)
 static const struct nfsd4_callback_ops nfsd4_cb_recall_any_ops = {
        .done           = nfsd4_cb_recall_any_done,
        .release        = nfsd4_cb_recall_any_release,
+       .opcode         = OP_CB_RECALL_ANY,
 };
 
 static const struct nfsd4_callback_ops nfsd4_cb_getattr_ops = {
        .done           = nfsd4_cb_getattr_done,
        .release        = nfsd4_cb_getattr_release,
+       .opcode         = OP_CB_GETATTR,
 };
 
 static void nfs4_cb_getattr(struct nfs4_cb_fattr *ncf)
@@ -5215,6 +5218,7 @@ static const struct nfsd4_callback_ops nfsd4_cb_recall_ops = {
        .prepare        = nfsd4_cb_recall_prepare,
        .done           = nfsd4_cb_recall_done,
        .release        = nfsd4_cb_recall_release,
+       .opcode         = OP_CB_RECALL,
 };
 
 static void nfsd_break_one_deleg(struct nfs4_delegation *dp)
index ec4559ecd193b28852911fdf851f5d910db31723..79c743c01a47bb1d91130708b65b75b92c697aae 100644 (file)
@@ -79,6 +79,7 @@ struct nfsd4_callback_ops {
        void (*prepare)(struct nfsd4_callback *);
        int (*done)(struct nfsd4_callback *, struct rpc_task *);
        void (*release)(struct nfsd4_callback *);
+       uint32_t opcode;
 };
 
 /*
index 77bbd23aa150c79f48365898d139a943c02dbc6e..411927eaca1eaaadd0c23709fca3f4403bb5b672 100644 (file)
@@ -1553,6 +1553,19 @@ TRACE_EVENT(nfsd_cb_setup_err,
                __entry->error)
 );
 
+/* Not a real opcode, but there is no 0 operation. */
+#define _CB_NULL       0
+
+#define show_nfsd_cb_opcode(val)                                       \
+       __print_symbolic(val,                                           \
+               { _CB_NULL,                     "CB_NULL" },            \
+               { OP_CB_GETATTR,                "CB_GETATTR" },         \
+               { OP_CB_RECALL,                 "CB_RECALL" },          \
+               { OP_CB_LAYOUTRECALL,           "CB_LAYOUTRECALL" },    \
+               { OP_CB_RECALL_ANY,             "CB_RECALL_ANY" },      \
+               { OP_CB_NOTIFY_LOCK,            "CB_NOTIFY_LOCK" },     \
+               { OP_CB_OFFLOAD,                "CB_OFFLOAD" })
+
 DECLARE_EVENT_CLASS(nfsd_cb_lifetime_class,
        TP_PROTO(
                const struct nfs4_client *clp,
@@ -1563,6 +1576,7 @@ DECLARE_EVENT_CLASS(nfsd_cb_lifetime_class,
                __field(u32, cl_boot)
                __field(u32, cl_id)
                __field(const void *, cb)
+               __field(unsigned long, opcode)
                __field(bool, need_restart)
                __sockaddr(addr, clp->cl_cb_conn.cb_addrlen)
        ),
@@ -1570,14 +1584,15 @@ DECLARE_EVENT_CLASS(nfsd_cb_lifetime_class,
                __entry->cl_boot = clp->cl_clientid.cl_boot;
                __entry->cl_id = clp->cl_clientid.cl_id;
                __entry->cb = cb;
+               __entry->opcode = cb->cb_ops ? cb->cb_ops->opcode : _CB_NULL;
                __entry->need_restart = cb->cb_need_restart;
                __assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr,
                                  clp->cl_cb_conn.cb_addrlen)
        ),
-       TP_printk("addr=%pISpc client %08x:%08x cb=%p%s",
-               __get_sockaddr(addr), __entry->cl_boot, __entry->cl_id,
-               __entry->cb, __entry->need_restart ?
-                       " (need restart)" : " (first try)"
+       TP_printk("addr=%pISpc client %08x:%08x cb=%p%s opcode=%s",
+               __get_sockaddr(addr), __entry->cl_boot, __entry->cl_id, __entry->cb,
+               __entry->need_restart ?  " (need restart)" : " (first try)",
+               show_nfsd_cb_opcode(__entry->opcode)
        )
 );