On Thu, 2025-07-31 at 15:44 -0400, Mike Snitzer wrote: > Transform nfsd_read_vector_dio trace event into nfsd_analyze_dio_class > and use it to create nfsd_analyze_read_dio and nfsd_analyze_write_dio > trace events. > > This prepares for nfsd_vfs_write() to also make use of it when > handling misaligned WRITEs. > > Signed-off-by: Mike Snitzer <snitzer@xxxxxxxxxx> > --- > fs/nfsd/trace.h | 52 ++++++++++++++++++++++++++++++++++++------------- > fs/nfsd/vfs.c | 11 ++++++----- > 2 files changed, 44 insertions(+), 19 deletions(-) > > diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h > index 55055482f8a84..4173bd9344b6b 100644 > --- a/fs/nfsd/trace.h > +++ b/fs/nfsd/trace.h > @@ -473,25 +473,29 @@ DEFINE_NFSD_IO_EVENT(write_done); > DEFINE_NFSD_IO_EVENT(commit_start); > DEFINE_NFSD_IO_EVENT(commit_done); > > -TRACE_EVENT(nfsd_read_vector_dio, > +DECLARE_EVENT_CLASS(nfsd_analyze_dio_class, > TP_PROTO(struct svc_rqst *rqstp, > struct svc_fh *fhp, > u64 offset, > u32 len, > - loff_t start, > - loff_t start_extra, > - loff_t end, > - loff_t end_extra), > - TP_ARGS(rqstp, fhp, offset, len, start, start_extra, end, end_extra), > + loff_t start, > + ssize_t start_len, > + loff_t middle, > + ssize_t middle_len, > + loff_t end, > + ssize_t end_len), > + TP_ARGS(rqstp, fhp, offset, len, start, start_len, middle, middle_len, end, end_len), > TP_STRUCT__entry( > __field(u32, xid) > __field(u32, fh_hash) > __field(u64, offset) > __field(u32, len) > __field(loff_t, start) > - __field(loff_t, start_extra) > + __field(ssize_t, start_len) > + __field(loff_t, middle) > + __field(ssize_t, middle_len) > __field(loff_t, end) > - __field(loff_t, end_extra) > + __field(ssize_t, end_len) > ), > TP_fast_assign( > __entry->xid = be32_to_cpu(rqstp->rq_xid); > @@ -499,16 +503,36 @@ TRACE_EVENT(nfsd_read_vector_dio, > __entry->offset = offset; > __entry->len = len; > __entry->start = start; > - __entry->start_extra = start_extra; > + __entry->start_len = start_len; > + __entry->middle = middle; > + __entry->middle_len = middle_len; > __entry->end = end; > - __entry->end_extra = end_extra; > + __entry->end_len = end_len; > ), > - TP_printk("xid=0x%08x fh_hash=0x%08x offset=%llu len=%u start=%llu+%llu end=%llu-%llu", > + TP_printk("xid=0x%08x fh_hash=0x%08x offset=%llu len=%u start=%llu+%lu middle=%llu+%lu end=%llu+%lu", > __entry->xid, __entry->fh_hash, > __entry->offset, __entry->len, > - __entry->start, __entry->start_extra, > - __entry->end, __entry->end_extra) > -); > + __entry->start, __entry->start_len, > + __entry->middle, __entry->middle_len, > + __entry->end, __entry->end_len) > +) > + > +#define DEFINE_NFSD_ANALYZE_DIO_EVENT(name) \ > +DEFINE_EVENT(nfsd_analyze_dio_class, nfsd_analyze_##name##_dio, \ > + TP_PROTO(struct svc_rqst *rqstp, \ > + struct svc_fh *fhp, \ > + u64 offset, \ > + u32 len, \ > + loff_t start, \ > + ssize_t start_len, \ > + loff_t middle, \ > + ssize_t middle_len, \ > + loff_t end, \ > + ssize_t end_len), \ > + TP_ARGS(rqstp, fhp, offset, len, start, start_len, middle, middle_len, end, end_len)) > + > +DEFINE_NFSD_ANALYZE_DIO_EVENT(read); > +DEFINE_NFSD_ANALYZE_DIO_EVENT(write); > > DECLARE_EVENT_CLASS(nfsd_err_class, > TP_PROTO(struct svc_rqst *rqstp, > diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c > index 46189020172fb..35c29b8ade9c3 100644 > --- a/fs/nfsd/vfs.c > +++ b/fs/nfsd/vfs.c > @@ -1094,7 +1094,7 @@ static bool nfsd_analyze_read_dio(struct svc_rqst *rqstp, struct svc_fh *fhp, > struct nfsd_read_dio *read_dio) > { > const u32 dio_blocksize = nf->nf_dio_read_offset_align; > - loff_t orig_end = offset + len; > + loff_t middle_end, orig_end = offset + len; > > if (WARN_ONCE(!nf->nf_dio_mem_align || !nf->nf_dio_read_offset_align, > "%s: underlying filesystem has not provided DIO alignment info\n", > @@ -1133,10 +1133,11 @@ static bool nfsd_analyze_read_dio(struct svc_rqst *rqstp, struct svc_fh *fhp, > } > > /* Show original offset and count, and how it was expanded for DIO */ > - trace_nfsd_read_vector_dio(rqstp, fhp, offset, len, > - read_dio->start, read_dio->start_extra, > - read_dio->end, read_dio->end_extra); > - > + middle_end = read_dio->end - read_dio->end_extra; > + trace_nfsd_analyze_read_dio(rqstp, fhp, offset, len, > + read_dio->start, read_dio->start_extra, > + offset, (middle_end - offset), > + middle_end, read_dio->end_extra); > return true; > } > Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx>