SUNRPC: Add trace event that reports reply page vector alignment
We don't want READ payloads that are partially in the head iovec and in the page buffer because this requires pull-up, which can be expensive. The NFS/RPC client tries hard to predict the size of the head iovec so that the incoming READ data payload lands only in the page vector, but it doesn't always get it right. To help diagnose such problems, add a trace point in the logic that decodes READ-like operations that reports whether pull-up is being done. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:

committed by
Anna Schumaker

parent
5582863f45
commit
7be9cea360
@@ -321,6 +321,65 @@ TRACE_EVENT(rpc_xdr_overflow,
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(rpc_xdr_alignment,
|
||||
TP_PROTO(
|
||||
const struct xdr_stream *xdr,
|
||||
size_t offset,
|
||||
unsigned int copied
|
||||
),
|
||||
|
||||
TP_ARGS(xdr, offset, copied),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, task_id)
|
||||
__field(unsigned int, client_id)
|
||||
__field(int, version)
|
||||
__field(size_t, offset)
|
||||
__field(unsigned int, copied)
|
||||
__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, len)
|
||||
__string(progname,
|
||||
xdr->rqst->rq_task->tk_client->cl_program->name)
|
||||
__string(procedure,
|
||||
xdr->rqst->rq_task->tk_msg.rpc_proc->p_name)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
const struct rpc_task *task = xdr->rqst->rq_task;
|
||||
|
||||
__entry->task_id = task->tk_pid;
|
||||
__entry->client_id = task->tk_client->cl_clid;
|
||||
__assign_str(progname,
|
||||
task->tk_client->cl_program->name)
|
||||
__entry->version = task->tk_client->cl_vers;
|
||||
__assign_str(procedure, task->tk_msg.rpc_proc->p_name)
|
||||
|
||||
__entry->offset = offset;
|
||||
__entry->copied = copied;
|
||||
__entry->head_base = xdr->buf->head[0].iov_base,
|
||||
__entry->head_len = xdr->buf->head[0].iov_len,
|
||||
__entry->page_len = xdr->buf->page_len,
|
||||
__entry->tail_base = xdr->buf->tail[0].iov_base,
|
||||
__entry->tail_len = xdr->buf->tail[0].iov_len,
|
||||
__entry->len = xdr->buf->len;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"task:%u@%u %sv%d %s offset=%zu copied=%u xdr=[%p,%zu]/%u/[%p,%zu]/%u\n",
|
||||
__entry->task_id, __entry->client_id,
|
||||
__get_str(progname), __entry->version, __get_str(procedure),
|
||||
__entry->offset, __entry->copied,
|
||||
__entry->head_base, __entry->head_len,
|
||||
__entry->page_len,
|
||||
__entry->tail_base, __entry->tail_len,
|
||||
__entry->len
|
||||
)
|
||||
);
|
||||
|
||||
/*
|
||||
* First define the enums in the below macros to be exported to userspace
|
||||
* via TRACE_DEFINE_ENUM().
|
||||
|
Reference in New Issue
Block a user