On Wed, Aug 30, 2023 at 04:46:59PM -0700, Dai Ngo wrote: > Add trace points on destination server to track inter and intra > server copy operations. > > Signed-off-by: Dai Ngo <dai.ngo@xxxxxxxxxx> > --- > fs/nfsd/nfs4proc.c | 12 +++++-- > fs/nfsd/trace.h | 89 ++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 99 insertions(+), 2 deletions(-) > > diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c > index 62f6aba6140b..9a780559073f 100644 > --- a/fs/nfsd/nfs4proc.c > +++ b/fs/nfsd/nfs4proc.c > @@ -1760,6 +1760,7 @@ static int nfsd4_do_async_copy(void *data) > struct nfsd4_copy *copy = (struct nfsd4_copy *)data; > __be32 nfserr; > > + trace_nfsd4_copy_do_async(copy); Nice addition to our observability of COPY operations! Only comment is we have no other tracepoints named "nfsd4_yada" so I feel it would be better if these were all renamed "nfsd_yada". > if (nfsd4_ssc_is_inter(copy)) { > struct file *filp; > > @@ -1800,17 +1801,23 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, > > copy->cp_clp = cstate->clp; > if (nfsd4_ssc_is_inter(copy)) { > + trace_nfsd4_copy_inter(copy); > if (!inter_copy_offload_enable || nfsd4_copy_is_sync(copy)) { > status = nfserr_notsupp; > goto out; > } > status = nfsd4_setup_inter_ssc(rqstp, cstate, copy); > - if (status) > + if (status) { > + trace_nfsd4_copy_done(copy, status); > return nfserr_offload_denied; > + } > } else { > + trace_nfsd4_copy_intra(copy); > status = nfsd4_setup_intra_ssc(rqstp, cstate, copy); > - if (status) > + if (status) { > + trace_nfsd4_copy_done(copy, status); > return status; > + } > } > > memcpy(©->fh, &cstate->current_fh.fh_handle, > @@ -1847,6 +1854,7 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, > copy->nf_dst->nf_file, true); > } > out: > + trace_nfsd4_copy_done(copy, status); > release_copy_files(copy); > return status; > out_err: > diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h > index 803904348871..6256a77c95c9 100644 > --- a/fs/nfsd/trace.h > +++ b/fs/nfsd/trace.h > @@ -1863,6 +1863,95 @@ TRACE_EVENT(nfsd_end_grace, > ) > ); > > +#ifdef CONFIG_NFS_V4_2 > +DECLARE_EVENT_CLASS(nfsd4_copy_class, > + TP_PROTO( > + const struct nfsd4_copy *copy > + ), > + TP_ARGS(copy), > + TP_STRUCT__entry( > + __field(bool, intra) > + __field(bool, async) > + __field(u32, src_cl_boot) > + __field(u32, src_cl_id) > + __field(u32, src_so_id) > + __field(u32, src_si_generation) > + __field(u32, dst_cl_boot) > + __field(u32, dst_cl_id) > + __field(u32, dst_so_id) > + __field(u32, dst_si_generation) > + __field(u64, src_cp_pos) > + __field(u64, dst_cp_pos) > + __field(u64, cp_count) > + __sockaddr(addr, sizeof(struct sockaddr_in6)) > + ), > + TP_fast_assign( > + const stateid_t *src_stp = ©->cp_src_stateid; > + const stateid_t *dst_stp = ©->cp_dst_stateid; > + > + __entry->intra = test_bit(NFSD4_COPY_F_INTRA, ©->cp_flags); > + __entry->async = !test_bit(NFSD4_COPY_F_SYNCHRONOUS, ©->cp_flags); > + __entry->src_cl_boot = src_stp->si_opaque.so_clid.cl_boot; > + __entry->src_cl_id = src_stp->si_opaque.so_clid.cl_id; > + __entry->src_so_id = src_stp->si_opaque.so_id; > + __entry->src_si_generation = src_stp->si_generation; > + __entry->dst_cl_boot = dst_stp->si_opaque.so_clid.cl_boot; > + __entry->dst_cl_id = dst_stp->si_opaque.so_clid.cl_id; > + __entry->dst_so_id = dst_stp->si_opaque.so_id; > + __entry->dst_si_generation = dst_stp->si_generation; > + __entry->src_cp_pos = copy->cp_src_pos; > + __entry->dst_cp_pos = copy->cp_dst_pos; > + __entry->cp_count = copy->cp_count; > + __assign_sockaddr(addr, ©->cp_clp->cl_addr, > + sizeof(struct sockaddr_in6)); > + ), > + TP_printk("client=%pISpc intra=%d async=%d " > + "src_stateid[si_generation:0x%x cl_boot:0x%x cl_id:0x%x so_id:0x%x] " > + "dst_stateid[si_generation:0x%x cl_boot:0x%x cl_id:0x%x so_id:0x%x] " > + "cp_src_pos=%llu cp_dst_pos=%llu cp_count=%llu", > + __get_sockaddr(addr), __entry->intra, __entry->async, > + __entry->src_si_generation, __entry->src_cl_boot, > + __entry->src_cl_id, __entry->src_so_id, > + __entry->dst_si_generation, __entry->dst_cl_boot, > + __entry->dst_cl_id, __entry->dst_so_id, > + __entry->src_cp_pos, __entry->dst_cp_pos, __entry->cp_count > + ) > +); > + > +#define DEFINE_COPY_EVENT(name) \ > +DEFINE_EVENT(nfsd4_copy_class, nfsd4_copy_##name, \ > + TP_PROTO(const struct nfsd4_copy *copy), \ > + TP_ARGS(copy)) > + > +DEFINE_COPY_EVENT(inter); > +DEFINE_COPY_EVENT(intra); > +DEFINE_COPY_EVENT(do_async); > + > +TRACE_EVENT(nfsd4_copy_done, > + TP_PROTO( > + const struct nfsd4_copy *copy, > + __be32 status > + ), > + TP_ARGS(copy, status), > + TP_STRUCT__entry( > + __field(int, status) > + __field(bool, intra) > + __field(bool, async) > + __sockaddr(addr, sizeof(struct sockaddr_in6)) > + ), > + TP_fast_assign( > + __entry->status = be32_to_cpu(status); > + __entry->intra = test_bit(NFSD4_COPY_F_INTRA, ©->cp_flags); > + __entry->async = !test_bit(NFSD4_COPY_F_SYNCHRONOUS, ©->cp_flags); > + __assign_sockaddr(addr, ©->cp_clp->cl_addr, > + sizeof(struct sockaddr_in6)); > + ), > + TP_printk("addr=%pISpc status=%d intra=%d async=%d ", > + __get_sockaddr(addr), __entry->status, __entry->intra, __entry->async > + ) > +); > +#endif /* CONFIG_NFS_V4_2 */ > + > #endif /* _NFSD_TRACE_H */ > > #undef TRACE_INCLUDE_PATH > -- > 2.39.3 > -- Chuck Lever