On Wed, 2022-10-05 at 10:56 -0400, Chuck Lever wrote: > Revocation is an exceptional event. Generate a trace record when it > occurs so that other activity can be triggered. > > Example: > > nfsd-1104 [005] 1912.002544: nfsd_stid_revoke: client 633c9343:4e82788d stateid 00000003:00000001 ref=2 type=DELEG > > Trace infrastructure is provided for subsequent additional tracing > related to nfs4_stid activity. > > Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> > --- > fs/nfsd/nfs4state.c | 2 ++ > fs/nfsd/trace.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 57 insertions(+) > > diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c > index 06499b9481a6..349302afa7eb 100644 > --- a/fs/nfsd/nfs4state.c > +++ b/fs/nfsd/nfs4state.c > @@ -1404,6 +1404,8 @@ static void revoke_delegation(struct nfs4_delegation *dp) > > WARN_ON(!list_empty(&dp->dl_recall_lru)); > > + trace_nfsd_stid_revoke(&dp->dl_stid); > + > if (clp->cl_minorversion) { > dp->dl_stid.sc_type = NFS4_REVOKED_DELEG_STID; > refcount_inc(&dp->dl_stid.sc_count); > diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h > index 4921144880d3..23fb39c957af 100644 > --- a/fs/nfsd/trace.h > +++ b/fs/nfsd/trace.h > @@ -561,6 +561,61 @@ DEFINE_EVENT(nfsd_stateseqid_class, nfsd_##name, \ > DEFINE_STATESEQID_EVENT(preprocess); > DEFINE_STATESEQID_EVENT(open_confirm); > > +TRACE_DEFINE_ENUM(NFS4_OPEN_STID); > +TRACE_DEFINE_ENUM(NFS4_LOCK_STID); > +TRACE_DEFINE_ENUM(NFS4_DELEG_STID); > +TRACE_DEFINE_ENUM(NFS4_CLOSED_STID); > +TRACE_DEFINE_ENUM(NFS4_REVOKED_DELEG_STID); > +TRACE_DEFINE_ENUM(NFS4_CLOSED_DELEG_STID); > +TRACE_DEFINE_ENUM(NFS4_LAYOUT_STID); > + > +#define show_stid_type(x) \ > + __print_flags(x, "|", \ > + { NFS4_OPEN_STID, "OPEN" }, \ > + { NFS4_LOCK_STID, "LOCK" }, \ > + { NFS4_DELEG_STID, "DELEG" }, \ > + { NFS4_CLOSED_STID, "CLOSED" }, \ > + { NFS4_REVOKED_DELEG_STID, "REVOKED" }, \ > + { NFS4_CLOSED_DELEG_STID, "CLOSED_DELEG" }, \ > + { NFS4_LAYOUT_STID, "LAYOUT" }) > + > +DECLARE_EVENT_CLASS(nfsd_stid_class, > + TP_PROTO( > + const struct nfs4_stid *stid > + ), > + TP_ARGS(stid), > + TP_STRUCT__entry( > + __field(unsigned long, sc_type) > + __field(int, sc_count) > + __field(u32, cl_boot) > + __field(u32, cl_id) > + __field(u32, si_id) > + __field(u32, si_generation) > + ), > + TP_fast_assign( > + const stateid_t *stp = &stid->sc_stateid; > + > + __entry->sc_type = stid->sc_type; > + __entry->sc_count = refcount_read(&stid->sc_count); > + __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; > + ), > + TP_printk("client %08x:%08x stateid %08x:%08x ref=%d type=%s", > + __entry->cl_boot, __entry->cl_id, > + __entry->si_id, __entry->si_generation, > + __entry->sc_count, show_stid_type(__entry->sc_type) > + ) > +); > + > +#define DEFINE_STID_EVENT(name) \ > +DEFINE_EVENT(nfsd_stid_class, nfsd_stid_##name, \ > + TP_PROTO(const struct nfs4_stid *stid), \ > + TP_ARGS(stid)) > + > +DEFINE_STID_EVENT(revoke); > + > DECLARE_EVENT_CLASS(nfsd_clientid_class, > TP_PROTO(const clientid_t *clid), > TP_ARGS(clid), > > Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx>