nfsd: track the main opcode for callbacks

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>
This commit is contained in:
Jeff Layton 2024-08-26 08:50:12 -04:00 committed by Chuck Lever
parent e8581a9124
commit c1c9f3ea74
5 changed files with 27 additions and 5 deletions

View File

@ -740,6 +740,7 @@ static const struct nfsd4_callback_ops nfsd4_cb_layout_ops = {
.prepare = nfsd4_cb_layout_prepare, .prepare = nfsd4_cb_layout_prepare,
.done = nfsd4_cb_layout_done, .done = nfsd4_cb_layout_done,
.release = nfsd4_cb_layout_release, .release = nfsd4_cb_layout_release,
.opcode = OP_CB_LAYOUTRECALL,
}; };
static bool static bool

View 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 = { static const struct nfsd4_callback_ops nfsd4_cb_offload_ops = {
.release = nfsd4_cb_offload_release, .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) static void nfsd4_init_copy_res(struct nfsd4_copy *copy, bool sync)

View File

@ -400,6 +400,7 @@ static const struct nfsd4_callback_ops nfsd4_cb_notify_lock_ops = {
.prepare = nfsd4_cb_notify_lock_prepare, .prepare = nfsd4_cb_notify_lock_prepare,
.done = nfsd4_cb_notify_lock_done, .done = nfsd4_cb_notify_lock_done,
.release = nfsd4_cb_notify_lock_release, .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 = { static const struct nfsd4_callback_ops nfsd4_cb_recall_any_ops = {
.done = nfsd4_cb_recall_any_done, .done = nfsd4_cb_recall_any_done,
.release = nfsd4_cb_recall_any_release, .release = nfsd4_cb_recall_any_release,
.opcode = OP_CB_RECALL_ANY,
}; };
static const struct nfsd4_callback_ops nfsd4_cb_getattr_ops = { static const struct nfsd4_callback_ops nfsd4_cb_getattr_ops = {
.done = nfsd4_cb_getattr_done, .done = nfsd4_cb_getattr_done,
.release = nfsd4_cb_getattr_release, .release = nfsd4_cb_getattr_release,
.opcode = OP_CB_GETATTR,
}; };
static void nfs4_cb_getattr(struct nfs4_cb_fattr *ncf) 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, .prepare = nfsd4_cb_recall_prepare,
.done = nfsd4_cb_recall_done, .done = nfsd4_cb_recall_done,
.release = nfsd4_cb_recall_release, .release = nfsd4_cb_recall_release,
.opcode = OP_CB_RECALL,
}; };
static void nfsd_break_one_deleg(struct nfs4_delegation *dp) static void nfsd_break_one_deleg(struct nfs4_delegation *dp)

View File

@ -79,6 +79,7 @@ struct nfsd4_callback_ops {
void (*prepare)(struct nfsd4_callback *); void (*prepare)(struct nfsd4_callback *);
int (*done)(struct nfsd4_callback *, struct rpc_task *); int (*done)(struct nfsd4_callback *, struct rpc_task *);
void (*release)(struct nfsd4_callback *); void (*release)(struct nfsd4_callback *);
uint32_t opcode;
}; };
/* /*

View File

@ -1553,6 +1553,19 @@ TRACE_EVENT(nfsd_cb_setup_err,
__entry->error) __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, DECLARE_EVENT_CLASS(nfsd_cb_lifetime_class,
TP_PROTO( TP_PROTO(
const struct nfs4_client *clp, const struct nfs4_client *clp,
@ -1563,6 +1576,7 @@ DECLARE_EVENT_CLASS(nfsd_cb_lifetime_class,
__field(u32, cl_boot) __field(u32, cl_boot)
__field(u32, cl_id) __field(u32, cl_id)
__field(const void *, cb) __field(const void *, cb)
__field(unsigned long, opcode)
__field(bool, need_restart) __field(bool, need_restart)
__sockaddr(addr, clp->cl_cb_conn.cb_addrlen) __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_boot = clp->cl_clientid.cl_boot;
__entry->cl_id = clp->cl_clientid.cl_id; __entry->cl_id = clp->cl_clientid.cl_id;
__entry->cb = cb; __entry->cb = cb;
__entry->opcode = cb->cb_ops ? cb->cb_ops->opcode : _CB_NULL;
__entry->need_restart = cb->cb_need_restart; __entry->need_restart = cb->cb_need_restart;
__assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr, __assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr,
clp->cl_cb_conn.cb_addrlen) clp->cl_cb_conn.cb_addrlen)
), ),
TP_printk("addr=%pISpc client %08x:%08x cb=%p%s", TP_printk("addr=%pISpc client %08x:%08x cb=%p%s opcode=%s",
__get_sockaddr(addr), __entry->cl_boot, __entry->cl_id, __get_sockaddr(addr), __entry->cl_boot, __entry->cl_id, __entry->cb,
__entry->cb, __entry->need_restart ? __entry->need_restart ? " (need restart)" : " (first try)",
" (need restart)" : " (first try)" show_nfsd_cb_opcode(__entry->opcode)
) )
); );