Replace a dprintk call site. The new tracepoint can be left enabled persistently to capture problems. Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> --- include/trace/events/sunrpc.h | 30 ++++++++++++++++++++++++++++++ net/sunrpc/svc.c | 3 +-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h index 804912b26abb..85459c40eb35 100644 --- a/include/trace/events/sunrpc.h +++ b/include/trace/events/sunrpc.h @@ -1716,6 +1716,36 @@ TRACE_EVENT(svc_decode_prog_mismatch_err, ) ); +TRACE_EVENT(svc_decode_proc_unavail_err, + TP_PROTO( + const struct svc_rqst *rqst, + const struct svc_program *progp + ), + + TP_ARGS(rqst, progp), + + TP_STRUCT__entry( + __field(u32, procedure) + __field(u32, version) + __string(progname, progp->pg_name) + __string(addr, rqst->rq_xprt ? + rqst->rq_xprt->xpt_remotebuf : "(null)") + ), + + TP_fast_assign( + __entry->version = rqst->rq_vers; + __entry->procedure = rqst->rq_proc; + __assign_str(progname, progp->pg_name) + __assign_str(addr, rqst->rq_xprt ? + rqst->rq_xprt->xpt_remotebuf : "(null)"); + ), + + TP_printk("addr=%s %sv%u procedure=%u", + __get_str(addr), __get_str(progname), + __entry->version, __entry->procedure + ) +); + DECLARE_EVENT_CLASS(svc_rqst_event, TP_PROTO( diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index 66e46d7755e9..a0f37e89393f 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c @@ -1414,8 +1414,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv) goto sendit; err_bad_proc: - svc_printk(rqstp, "unknown procedure (%d)\n", rqstp->rq_proc); - + trace_svc_decode_proc_unavail_err(rqstp, progp); serv->sv_stats->rpcbadfmt++; svc_putnl(resv, RPC_PROC_UNAVAIL); goto sendit;