All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chuck Lever <chuck.lever@oracle.com>
To: bfields@fieldses.org
Cc: linux-nfs@vger.kernel.org, linux-rdma@vger.kernel.org
Subject: [PATCH v1 05/16] svcrdma: Create a generic tracing class for displaying xdr_buf layout
Date: Thu, 27 Feb 2020 19:30:59 -0500	[thread overview]
Message-ID: <158284985994.38468.11081309957716392757.stgit@seurat29.1015granger.net> (raw)
In-Reply-To: <158284930886.38468.17045380766660946827.stgit@seurat29.1015granger.net>

This class can be used to create trace points in either the RPC
client or RPC server paths. It simply displays the length of each
part of an xdr_buf, which is useful to determine that the transport
and XDR codecs are operating correctly.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 include/trace/events/sunrpc.h |   43 +++++++++++++++++++++++++++++++++++++++++
 net/sunrpc/svc_xprt.c         |    6 +++++-
 net/sunrpc/xprt.c             |    4 ++--
 3 files changed, 50 insertions(+), 3 deletions(-)

diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h
index ee993575d2fa..1577223add43 100644
--- a/include/trace/events/sunrpc.h
+++ b/include/trace/events/sunrpc.h
@@ -14,6 +14,49 @@
 #include <linux/net.h>
 #include <linux/tracepoint.h>
 
+DECLARE_EVENT_CLASS(xdr_buf_class,
+	TP_PROTO(
+		const struct xdr_buf *xdr
+	),
+
+	TP_ARGS(xdr),
+
+	TP_STRUCT__entry(
+		__field(const void *, head_base)
+		__field(size_t, head_len)
+		__field(const void *, tail_base)
+		__field(size_t, tail_len)
+		__field(unsigned int, page_len)
+		__field(unsigned int, msg_len)
+	),
+
+	TP_fast_assign(
+		__entry->head_base = xdr->head[0].iov_base;
+		__entry->head_len = xdr->head[0].iov_len;
+		__entry->tail_base = xdr->tail[0].iov_base;
+		__entry->tail_len = xdr->tail[0].iov_len;
+		__entry->page_len = xdr->page_len;
+		__entry->msg_len = xdr->len;
+	),
+
+	TP_printk("head=[%p,%zu] page=%u tail=[%p,%zu] len=%u",
+		__entry->head_base, __entry->head_len, __entry->page_len,
+		__entry->tail_base, __entry->tail_len, __entry->msg_len
+	)
+);
+
+#define DEFINE_XDRBUF_EVENT(name)					\
+		DEFINE_EVENT(xdr_buf_class, name,			\
+				TP_PROTO(				\
+					const struct xdr_buf *xdr	\
+				),					\
+				TP_ARGS(xdr))
+
+DEFINE_XDRBUF_EVENT(xprt_sendto);
+DEFINE_XDRBUF_EVENT(xprt_recvfrom);
+DEFINE_XDRBUF_EVENT(svc_recvfrom);
+DEFINE_XDRBUF_EVENT(svc_sendto);
+
 TRACE_DEFINE_ENUM(RPC_AUTH_OK);
 TRACE_DEFINE_ENUM(RPC_AUTH_BADCRED);
 TRACE_DEFINE_ENUM(RPC_AUTH_REJECTEDCRED);
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
index de3c077733a7..081564449e98 100644
--- a/net/sunrpc/svc_xprt.c
+++ b/net/sunrpc/svc_xprt.c
@@ -802,6 +802,8 @@ static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt)
 			len = svc_deferred_recv(rqstp);
 		else
 			len = xprt->xpt_ops->xpo_recvfrom(rqstp);
+		if (len > 0)
+			trace_svc_recvfrom(&rqstp->rq_arg);
 		rqstp->rq_stime = ktime_get();
 		rqstp->rq_reserved = serv->sv_max_mesg;
 		atomic_add(rqstp->rq_reserved, &xprt->xpt_reserved);
@@ -912,8 +914,10 @@ int svc_send(struct svc_rqst *rqstp)
 	if (test_bit(XPT_DEAD, &xprt->xpt_flags)
 			|| test_bit(XPT_CLOSE, &xprt->xpt_flags))
 		len = -ENOTCONN;
-	else
+	else {
+		trace_svc_sendto(xb);
 		len = xprt->xpt_ops->xpo_sendto(rqstp);
+	}
 	mutex_unlock(&xprt->xpt_mutex);
 	trace_svc_send(rqstp, len);
 	svc_xprt_release(rqstp);
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
index 1aafe8d3f3f4..30989d9b61a0 100644
--- a/net/sunrpc/xprt.c
+++ b/net/sunrpc/xprt.c
@@ -1117,9 +1117,8 @@ void xprt_complete_rqst(struct rpc_task *task, int copied)
 	struct rpc_rqst *req = task->tk_rqstp;
 	struct rpc_xprt *xprt = req->rq_xprt;
 
-	dprintk("RPC: %5u xid %08x complete (%d bytes received)\n",
-			task->tk_pid, ntohl(req->rq_xid), copied);
 	trace_xprt_complete_rqst(xprt, req->rq_xid, copied);
+	trace_xprt_recvfrom(&req->rq_rcv_buf);
 
 	xprt->stat.recvs++;
 
@@ -1462,6 +1461,7 @@ xprt_request_transmit(struct rpc_rqst *req, struct rpc_task *snd_task)
 	 */
 	req->rq_ntrans++;
 
+	trace_xprt_sendto(&req->rq_snd_buf);
 	connect_cookie = xprt->connect_cookie;
 	status = xprt->ops->send_request(req);
 	if (status != 0) {


  parent reply	other threads:[~2020-02-28  0:31 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-28  0:30 [PATCH v1 00/16] NFS/RDMA server patches maybe for v5.7 Chuck Lever
2020-02-28  0:30 ` [PATCH v1 01/16] nfsd: Fix NFSv4 READ on RDMA when using readv Chuck Lever
2020-02-28  0:30 ` [PATCH v1 02/16] NFSD: Clean up nfsd4_encode_readv Chuck Lever
2020-02-28  0:30 ` [PATCH v1 03/16] svcrdma: Fix double svc_rdma_send_ctxt_put() in an error path Chuck Lever
2020-02-28  0:30 ` [PATCH v1 04/16] SUNRPC: Add xdr_pad_size() helper Chuck Lever
2020-02-28  0:30 ` Chuck Lever [this message]
2020-02-28 22:02   ` Fwd: [PATCH v1 05/16] svcrdma: Create a generic tracing class for displaying xdr_buf layout Chuck Lever
2020-02-28  0:31 ` [PATCH v1 06/16] svcrdma: Remove svcrdma_cm_event() trace point Chuck Lever
2020-02-28  0:31 ` [PATCH v1 07/16] svcrdma: Use struct xdr_stream to decode ingress transport headers Chuck Lever
2020-02-28  0:31 ` [PATCH v1 08/16] svcrdma: De-duplicate code that locates Write and Reply chunks Chuck Lever
2020-02-28  0:31 ` [PATCH v1 09/16] svcrdma: Update synopsis of svc_rdma_send_reply_chunk() Chuck Lever
2020-02-28  0:31 ` [PATCH v1 10/16] svcrdma: Update synopsis of svc_rdma_map_reply_msg() Chuck Lever
2020-02-28  0:31 ` [PATCH v1 11/16] svcrdma: Update synopsis of svc_rdma_send_reply_msg() Chuck Lever
2020-02-28  0:31 ` [PATCH v1 12/16] svcrdma: Rename svcrdma_encode trace points in send routines Chuck Lever
2020-02-28  0:31 ` [PATCH v1 13/16] SUNRPC: Add encoders for list item discriminators Chuck Lever
2020-02-28  0:32 ` [PATCH v1 14/16] svcrdma: Refactor chunk list encoders Chuck Lever
2020-02-28  0:32 ` [PATCH v1 15/16] svcrdma: Fix double sync of transport header buffer Chuck Lever
2020-02-28  0:32 ` [PATCH v1 16/16] svcrdma: Avoid DMA mapping small RPC Replies Chuck Lever

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=158284985994.38468.11081309957716392757.stgit@seurat29.1015granger.net \
    --to=chuck.lever@oracle.com \
    --cc=bfields@fieldses.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.