Merge tag 'nfsd-5.8' of git://linux-nfs.org/~bfields/linux
Pull nfsd updates from Bruce Fields: "Highlights: - Keep nfsd clients from unnecessarily breaking their own delegations. Note this requires a small kthreadd addition. The result is Tejun Heo's suggestion (see link), and he was OK with this going through my tree. - Patch nfsd/clients/ to display filenames, and to fix byte-order when displaying stateid's. - fix a module loading/unloading bug, from Neil Brown. - A big series from Chuck Lever with RPC/RDMA and tracing improvements, and lay some groundwork for RPC-over-TLS" Link: https://lore.kernel.org/r/1588348912-24781-1-git-send-email-bfields@redhat.com * tag 'nfsd-5.8' of git://linux-nfs.org/~bfields/linux: (49 commits) sunrpc: use kmemdup_nul() in gssp_stringify() nfsd: safer handling of corrupted c_type nfsd4: make drc_slab global, not per-net SUNRPC: Remove unreachable error condition in rpcb_getport_async() nfsd: Fix svc_xprt refcnt leak when setup callback client failed sunrpc: clean up properly in gss_mech_unregister() sunrpc: svcauth_gss_register_pseudoflavor must reject duplicate registrations. sunrpc: check that domain table is empty at module unload. NFSD: Fix improperly-formatted Doxygen comments NFSD: Squash an annoying compiler warning SUNRPC: Clean up request deferral tracepoints NFSD: Add tracepoints for monitoring NFSD callbacks NFSD: Add tracepoints to the NFSD state management code NFSD: Add tracepoints to NFSD's duplicate reply cache SUNRPC: svc_show_status() macro should have enum definitions SUNRPC: Restructure svc_udp_recvfrom() SUNRPC: Refactor svc_recvfrom() SUNRPC: Clean up svc_release_skb() functions SUNRPC: Refactor recvfrom path dealing with incomplete TCP receives SUNRPC: Replace dprintk() call sites in TCP receive path ...
This commit is contained in:
@@ -1279,38 +1279,42 @@ TRACE_EVENT(xprtrdma_leaked_rep,
|
||||
** Server-side RPC/RDMA events
|
||||
**/
|
||||
|
||||
DECLARE_EVENT_CLASS(svcrdma_xprt_event,
|
||||
DECLARE_EVENT_CLASS(svcrdma_accept_class,
|
||||
TP_PROTO(
|
||||
const struct svc_xprt *xprt
|
||||
const struct svcxprt_rdma *rdma,
|
||||
long status
|
||||
),
|
||||
|
||||
TP_ARGS(xprt),
|
||||
TP_ARGS(rdma, status),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(const void *, xprt)
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
__field(long, status)
|
||||
__string(addr, rdma->sc_xprt.xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->xprt = xprt;
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
__entry->status = status;
|
||||
__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("xprt=%p addr=%s",
|
||||
__entry->xprt, __get_str(addr)
|
||||
TP_printk("addr=%s status=%ld",
|
||||
__get_str(addr), __entry->status
|
||||
)
|
||||
);
|
||||
|
||||
#define DEFINE_XPRT_EVENT(name) \
|
||||
DEFINE_EVENT(svcrdma_xprt_event, svcrdma_xprt_##name, \
|
||||
TP_PROTO( \
|
||||
const struct svc_xprt *xprt \
|
||||
), \
|
||||
TP_ARGS(xprt))
|
||||
#define DEFINE_ACCEPT_EVENT(name) \
|
||||
DEFINE_EVENT(svcrdma_accept_class, svcrdma_##name##_err, \
|
||||
TP_PROTO( \
|
||||
const struct svcxprt_rdma *rdma, \
|
||||
long status \
|
||||
), \
|
||||
TP_ARGS(rdma, status))
|
||||
|
||||
DEFINE_XPRT_EVENT(accept);
|
||||
DEFINE_XPRT_EVENT(fail);
|
||||
DEFINE_XPRT_EVENT(free);
|
||||
DEFINE_ACCEPT_EVENT(pd);
|
||||
DEFINE_ACCEPT_EVENT(qp);
|
||||
DEFINE_ACCEPT_EVENT(fabric);
|
||||
DEFINE_ACCEPT_EVENT(initdepth);
|
||||
DEFINE_ACCEPT_EVENT(accept);
|
||||
|
||||
TRACE_DEFINE_ENUM(RDMA_MSG);
|
||||
TRACE_DEFINE_ENUM(RDMA_NOMSG);
|
||||
@@ -1355,7 +1359,7 @@ TRACE_EVENT(svcrdma_decode_rqst,
|
||||
show_rpcrdma_proc(__entry->proc), __entry->hdrlen)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svcrdma_decode_short,
|
||||
TRACE_EVENT(svcrdma_decode_short_err,
|
||||
TP_PROTO(
|
||||
unsigned int hdrlen
|
||||
),
|
||||
@@ -1399,7 +1403,8 @@ DECLARE_EVENT_CLASS(svcrdma_badreq_event,
|
||||
);
|
||||
|
||||
#define DEFINE_BADREQ_EVENT(name) \
|
||||
DEFINE_EVENT(svcrdma_badreq_event, svcrdma_decode_##name,\
|
||||
DEFINE_EVENT(svcrdma_badreq_event, \
|
||||
svcrdma_decode_##name##_err, \
|
||||
TP_PROTO( \
|
||||
__be32 *p \
|
||||
), \
|
||||
@@ -1583,28 +1588,117 @@ DECLARE_EVENT_CLASS(svcrdma_dma_map_class,
|
||||
DEFINE_SVC_DMA_EVENT(dma_map_page);
|
||||
DEFINE_SVC_DMA_EVENT(dma_unmap_page);
|
||||
|
||||
TRACE_EVENT(svcrdma_dma_map_rwctx,
|
||||
TRACE_EVENT(svcrdma_dma_map_rw_err,
|
||||
TP_PROTO(
|
||||
const struct svcxprt_rdma *rdma,
|
||||
unsigned int nents,
|
||||
int status
|
||||
),
|
||||
|
||||
TP_ARGS(rdma, status),
|
||||
TP_ARGS(rdma, nents, status),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(int, status)
|
||||
__field(unsigned int, nents)
|
||||
__string(device, rdma->sc_cm_id->device->name)
|
||||
__string(addr, rdma->sc_xprt.xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->status = status;
|
||||
__entry->nents = nents;
|
||||
__assign_str(device, rdma->sc_cm_id->device->name);
|
||||
__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s device=%s status=%d",
|
||||
__get_str(addr), __get_str(device), __entry->status
|
||||
TP_printk("addr=%s device=%s nents=%u status=%d",
|
||||
__get_str(addr), __get_str(device), __entry->nents,
|
||||
__entry->status
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svcrdma_no_rwctx_err,
|
||||
TP_PROTO(
|
||||
const struct svcxprt_rdma *rdma,
|
||||
unsigned int num_sges
|
||||
),
|
||||
|
||||
TP_ARGS(rdma, num_sges),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, num_sges)
|
||||
__string(device, rdma->sc_cm_id->device->name)
|
||||
__string(addr, rdma->sc_xprt.xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->num_sges = num_sges;
|
||||
__assign_str(device, rdma->sc_cm_id->device->name);
|
||||
__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s device=%s num_sges=%d",
|
||||
__get_str(addr), __get_str(device), __entry->num_sges
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svcrdma_page_overrun_err,
|
||||
TP_PROTO(
|
||||
const struct svcxprt_rdma *rdma,
|
||||
const struct svc_rqst *rqst,
|
||||
unsigned int pageno
|
||||
),
|
||||
|
||||
TP_ARGS(rdma, rqst, pageno),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, pageno)
|
||||
__field(u32, xid)
|
||||
__string(device, rdma->sc_cm_id->device->name)
|
||||
__string(addr, rdma->sc_xprt.xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->pageno = pageno;
|
||||
__entry->xid = __be32_to_cpu(rqst->rq_xid);
|
||||
__assign_str(device, rdma->sc_cm_id->device->name);
|
||||
__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s device=%s xid=0x%08x pageno=%u", __get_str(addr),
|
||||
__get_str(device), __entry->xid, __entry->pageno
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svcrdma_small_wrch_err,
|
||||
TP_PROTO(
|
||||
const struct svcxprt_rdma *rdma,
|
||||
unsigned int remaining,
|
||||
unsigned int seg_no,
|
||||
unsigned int num_segs
|
||||
),
|
||||
|
||||
TP_ARGS(rdma, remaining, seg_no, num_segs),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, remaining)
|
||||
__field(unsigned int, seg_no)
|
||||
__field(unsigned int, num_segs)
|
||||
__string(device, rdma->sc_cm_id->device->name)
|
||||
__string(addr, rdma->sc_xprt.xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->remaining = remaining;
|
||||
__entry->seg_no = seg_no;
|
||||
__entry->num_segs = num_segs;
|
||||
__assign_str(device, rdma->sc_cm_id->device->name);
|
||||
__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s device=%s remaining=%u seg_no=%u num_segs=%u",
|
||||
__get_str(addr), __get_str(device), __entry->remaining,
|
||||
__entry->seg_no, __entry->num_segs
|
||||
)
|
||||
);
|
||||
|
||||
|
@@ -14,6 +14,39 @@
|
||||
#include <linux/net.h>
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
TRACE_DEFINE_ENUM(SOCK_STREAM);
|
||||
TRACE_DEFINE_ENUM(SOCK_DGRAM);
|
||||
TRACE_DEFINE_ENUM(SOCK_RAW);
|
||||
TRACE_DEFINE_ENUM(SOCK_RDM);
|
||||
TRACE_DEFINE_ENUM(SOCK_SEQPACKET);
|
||||
TRACE_DEFINE_ENUM(SOCK_DCCP);
|
||||
TRACE_DEFINE_ENUM(SOCK_PACKET);
|
||||
|
||||
#define show_socket_type(type) \
|
||||
__print_symbolic(type, \
|
||||
{ SOCK_STREAM, "STREAM" }, \
|
||||
{ SOCK_DGRAM, "DGRAM" }, \
|
||||
{ SOCK_RAW, "RAW" }, \
|
||||
{ SOCK_RDM, "RDM" }, \
|
||||
{ SOCK_SEQPACKET, "SEQPACKET" }, \
|
||||
{ SOCK_DCCP, "DCCP" }, \
|
||||
{ SOCK_PACKET, "PACKET" })
|
||||
|
||||
/* This list is known to be incomplete, add new enums as needed. */
|
||||
TRACE_DEFINE_ENUM(AF_UNSPEC);
|
||||
TRACE_DEFINE_ENUM(AF_UNIX);
|
||||
TRACE_DEFINE_ENUM(AF_LOCAL);
|
||||
TRACE_DEFINE_ENUM(AF_INET);
|
||||
TRACE_DEFINE_ENUM(AF_INET6);
|
||||
|
||||
#define rpc_show_address_family(family) \
|
||||
__print_symbolic(family, \
|
||||
{ AF_UNSPEC, "AF_UNSPEC" }, \
|
||||
{ AF_UNIX, "AF_UNIX" }, \
|
||||
{ AF_LOCAL, "AF_LOCAL" }, \
|
||||
{ AF_INET, "AF_INET" }, \
|
||||
{ AF_INET6, "AF_INET6" })
|
||||
|
||||
DECLARE_EVENT_CLASS(xdr_buf_class,
|
||||
TP_PROTO(
|
||||
const struct xdr_buf *xdr
|
||||
@@ -1024,6 +1057,17 @@ TRACE_EVENT(svc_recv,
|
||||
show_rqstp_flags(__entry->flags))
|
||||
);
|
||||
|
||||
TRACE_DEFINE_ENUM(SVC_GARBAGE);
|
||||
TRACE_DEFINE_ENUM(SVC_SYSERR);
|
||||
TRACE_DEFINE_ENUM(SVC_VALID);
|
||||
TRACE_DEFINE_ENUM(SVC_NEGATIVE);
|
||||
TRACE_DEFINE_ENUM(SVC_OK);
|
||||
TRACE_DEFINE_ENUM(SVC_DROP);
|
||||
TRACE_DEFINE_ENUM(SVC_CLOSE);
|
||||
TRACE_DEFINE_ENUM(SVC_DENIED);
|
||||
TRACE_DEFINE_ENUM(SVC_PENDING);
|
||||
TRACE_DEFINE_ENUM(SVC_COMPLETE);
|
||||
|
||||
#define svc_show_status(status) \
|
||||
__print_symbolic(status, \
|
||||
{ SVC_GARBAGE, "SVC_GARBAGE" }, \
|
||||
@@ -1167,28 +1211,54 @@ DEFINE_EVENT(svc_rqst_status, svc_send,
|
||||
{ (1UL << XPT_KILL_TEMP), "XPT_KILL_TEMP"}, \
|
||||
{ (1UL << XPT_CONG_CTRL), "XPT_CONG_CTRL"})
|
||||
|
||||
TRACE_EVENT(svc_xprt_create_err,
|
||||
TP_PROTO(
|
||||
const char *program,
|
||||
const char *protocol,
|
||||
struct sockaddr *sap,
|
||||
const struct svc_xprt *xprt
|
||||
),
|
||||
|
||||
TP_ARGS(program, protocol, sap, xprt),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(long, error)
|
||||
__string(program, program)
|
||||
__string(protocol, protocol)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->error = PTR_ERR(xprt);
|
||||
__assign_str(program, program);
|
||||
__assign_str(protocol, protocol);
|
||||
memcpy(__entry->addr, sap, sizeof(__entry->addr));
|
||||
),
|
||||
|
||||
TP_printk("addr=%pISpc program=%s protocol=%s error=%ld",
|
||||
__entry->addr, __get_str(program), __get_str(protocol),
|
||||
__entry->error)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svc_xprt_do_enqueue,
|
||||
TP_PROTO(struct svc_xprt *xprt, struct svc_rqst *rqst),
|
||||
|
||||
TP_ARGS(xprt, rqst),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(struct svc_xprt *, xprt)
|
||||
__field(int, pid)
|
||||
__field(unsigned long, flags)
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->xprt = xprt;
|
||||
__entry->pid = rqst? rqst->rq_task->pid : 0;
|
||||
__entry->flags = xprt->xpt_flags;
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("xprt=%p addr=%s pid=%d flags=%s",
|
||||
__entry->xprt, __get_str(addr),
|
||||
__entry->pid, show_svc_xprt_flags(__entry->flags))
|
||||
TP_printk("addr=%s pid=%d flags=%s", __get_str(addr),
|
||||
__entry->pid, show_svc_xprt_flags(__entry->flags))
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(svc_xprt_event,
|
||||
@@ -1197,25 +1267,55 @@ DECLARE_EVENT_CLASS(svc_xprt_event,
|
||||
TP_ARGS(xprt),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(struct svc_xprt *, xprt)
|
||||
__field(unsigned long, flags)
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->xprt = xprt;
|
||||
__entry->flags = xprt->xpt_flags;
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("xprt=%p addr=%s flags=%s",
|
||||
__entry->xprt, __get_str(addr),
|
||||
show_svc_xprt_flags(__entry->flags))
|
||||
TP_printk("addr=%s flags=%s", __get_str(addr),
|
||||
show_svc_xprt_flags(__entry->flags))
|
||||
);
|
||||
|
||||
DEFINE_EVENT(svc_xprt_event, svc_xprt_no_write_space,
|
||||
TP_PROTO(struct svc_xprt *xprt),
|
||||
TP_ARGS(xprt));
|
||||
#define DEFINE_SVC_XPRT_EVENT(name) \
|
||||
DEFINE_EVENT(svc_xprt_event, svc_xprt_##name, \
|
||||
TP_PROTO( \
|
||||
struct svc_xprt *xprt \
|
||||
), \
|
||||
TP_ARGS(xprt))
|
||||
|
||||
DEFINE_SVC_XPRT_EVENT(no_write_space);
|
||||
DEFINE_SVC_XPRT_EVENT(close);
|
||||
DEFINE_SVC_XPRT_EVENT(detach);
|
||||
DEFINE_SVC_XPRT_EVENT(free);
|
||||
|
||||
TRACE_EVENT(svc_xprt_accept,
|
||||
TP_PROTO(
|
||||
const struct svc_xprt *xprt,
|
||||
const char *service
|
||||
),
|
||||
|
||||
TP_ARGS(xprt, service),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
__string(protocol, xprt->xpt_class->xcl_name)
|
||||
__string(service, service)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
__assign_str(protocol, xprt->xpt_class->xcl_name)
|
||||
__assign_str(service, service);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s protocol=%s service=%s",
|
||||
__get_str(addr), __get_str(protocol), __get_str(service)
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svc_xprt_dequeue,
|
||||
TP_PROTO(struct svc_rqst *rqst),
|
||||
@@ -1223,24 +1323,20 @@ TRACE_EVENT(svc_xprt_dequeue,
|
||||
TP_ARGS(rqst),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(struct svc_xprt *, xprt)
|
||||
__field(unsigned long, flags)
|
||||
__field(unsigned long, wakeup)
|
||||
__string(addr, rqst->rq_xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->xprt = rqst->rq_xprt;
|
||||
__entry->flags = rqst->rq_xprt->xpt_flags;
|
||||
__entry->wakeup = ktime_to_us(ktime_sub(ktime_get(),
|
||||
rqst->rq_qtime));
|
||||
__assign_str(addr, rqst->rq_xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("xprt=%p addr=%s flags=%s wakeup-us=%lu",
|
||||
__entry->xprt, __get_str(addr),
|
||||
show_svc_xprt_flags(__entry->flags),
|
||||
__entry->wakeup)
|
||||
TP_printk("addr=%s flags=%s wakeup-us=%lu", __get_str(addr),
|
||||
show_svc_xprt_flags(__entry->flags), __entry->wakeup)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svc_wake_up,
|
||||
@@ -1265,21 +1361,18 @@ TRACE_EVENT(svc_handle_xprt,
|
||||
TP_ARGS(xprt, len),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(struct svc_xprt *, xprt)
|
||||
__field(int, len)
|
||||
__field(unsigned long, flags)
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->xprt = xprt;
|
||||
__entry->len = len;
|
||||
__entry->flags = xprt->xpt_flags;
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("xprt=%p addr=%s len=%d flags=%s",
|
||||
__entry->xprt, __get_str(addr),
|
||||
TP_printk("addr=%s len=%d flags=%s", __get_str(addr),
|
||||
__entry->len, show_svc_xprt_flags(__entry->flags))
|
||||
);
|
||||
|
||||
@@ -1313,27 +1406,221 @@ DECLARE_EVENT_CLASS(svc_deferred_event,
|
||||
TP_ARGS(dr),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(const void *, dr)
|
||||
__field(u32, xid)
|
||||
__string(addr, dr->xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dr = dr;
|
||||
__entry->xid = be32_to_cpu(*(__be32 *)(dr->args +
|
||||
(dr->xprt_hlen>>2)));
|
||||
__assign_str(addr, dr->xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s xid=0x%08x", __get_str(addr), __entry->xid)
|
||||
TP_printk("addr=%s dr=%p xid=0x%08x", __get_str(addr), __entry->dr,
|
||||
__entry->xid)
|
||||
);
|
||||
|
||||
#define DEFINE_SVC_DEFERRED_EVENT(name) \
|
||||
DEFINE_EVENT(svc_deferred_event, svc_##name##_deferred, \
|
||||
DEFINE_EVENT(svc_deferred_event, svc_defer_##name, \
|
||||
TP_PROTO( \
|
||||
const struct svc_deferred_req *dr \
|
||||
), \
|
||||
TP_ARGS(dr))
|
||||
|
||||
DEFINE_SVC_DEFERRED_EVENT(drop);
|
||||
DEFINE_SVC_DEFERRED_EVENT(revisit);
|
||||
DEFINE_SVC_DEFERRED_EVENT(queue);
|
||||
DEFINE_SVC_DEFERRED_EVENT(recv);
|
||||
|
||||
TRACE_EVENT(svcsock_new_socket,
|
||||
TP_PROTO(
|
||||
const struct socket *socket
|
||||
),
|
||||
|
||||
TP_ARGS(socket),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, type)
|
||||
__field(unsigned long, family)
|
||||
__field(bool, listener)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->type = socket->type;
|
||||
__entry->family = socket->sk->sk_family;
|
||||
__entry->listener = (socket->sk->sk_state == TCP_LISTEN);
|
||||
),
|
||||
|
||||
TP_printk("type=%s family=%s%s",
|
||||
show_socket_type(__entry->type),
|
||||
rpc_show_address_family(__entry->family),
|
||||
__entry->listener ? " (listener)" : ""
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svcsock_marker,
|
||||
TP_PROTO(
|
||||
const struct svc_xprt *xprt,
|
||||
__be32 marker
|
||||
),
|
||||
|
||||
TP_ARGS(xprt, marker),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, length)
|
||||
__field(bool, last)
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->length = be32_to_cpu(marker) & RPC_FRAGMENT_SIZE_MASK;
|
||||
__entry->last = be32_to_cpu(marker) & RPC_LAST_STREAM_FRAGMENT;
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s length=%u%s", __get_str(addr),
|
||||
__entry->length, __entry->last ? " (last)" : "")
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(svcsock_class,
|
||||
TP_PROTO(
|
||||
const struct svc_xprt *xprt,
|
||||
ssize_t result
|
||||
),
|
||||
|
||||
TP_ARGS(xprt, result),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(ssize_t, result)
|
||||
__field(unsigned long, flags)
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->result = result;
|
||||
__entry->flags = xprt->xpt_flags;
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s result=%zd flags=%s", __get_str(addr),
|
||||
__entry->result, show_svc_xprt_flags(__entry->flags)
|
||||
)
|
||||
);
|
||||
|
||||
#define DEFINE_SVCSOCK_EVENT(name) \
|
||||
DEFINE_EVENT(svcsock_class, svcsock_##name, \
|
||||
TP_PROTO( \
|
||||
const struct svc_xprt *xprt, \
|
||||
ssize_t result \
|
||||
), \
|
||||
TP_ARGS(xprt, result))
|
||||
|
||||
DEFINE_SVCSOCK_EVENT(udp_send);
|
||||
DEFINE_SVCSOCK_EVENT(udp_recv);
|
||||
DEFINE_SVCSOCK_EVENT(udp_recv_err);
|
||||
DEFINE_SVCSOCK_EVENT(tcp_send);
|
||||
DEFINE_SVCSOCK_EVENT(tcp_recv);
|
||||
DEFINE_SVCSOCK_EVENT(tcp_recv_eagain);
|
||||
DEFINE_SVCSOCK_EVENT(tcp_recv_err);
|
||||
DEFINE_SVCSOCK_EVENT(data_ready);
|
||||
DEFINE_SVCSOCK_EVENT(write_space);
|
||||
|
||||
TRACE_EVENT(svcsock_tcp_recv_short,
|
||||
TP_PROTO(
|
||||
const struct svc_xprt *xprt,
|
||||
u32 expected,
|
||||
u32 received
|
||||
),
|
||||
|
||||
TP_ARGS(xprt, expected, received),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, expected)
|
||||
__field(u32, received)
|
||||
__field(unsigned long, flags)
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->expected = expected;
|
||||
__entry->received = received;
|
||||
__entry->flags = xprt->xpt_flags;
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s flags=%s expected=%u received=%u",
|
||||
__get_str(addr), show_svc_xprt_flags(__entry->flags),
|
||||
__entry->expected, __entry->received
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svcsock_tcp_state,
|
||||
TP_PROTO(
|
||||
const struct svc_xprt *xprt,
|
||||
const struct socket *socket
|
||||
),
|
||||
|
||||
TP_ARGS(xprt, socket),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, socket_state)
|
||||
__field(unsigned long, sock_state)
|
||||
__field(unsigned long, flags)
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->socket_state = socket->state;
|
||||
__entry->sock_state = socket->sk->sk_state;
|
||||
__entry->flags = xprt->xpt_flags;
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s state=%s sk_state=%s flags=%s", __get_str(addr),
|
||||
rpc_show_socket_state(__entry->socket_state),
|
||||
rpc_show_sock_state(__entry->sock_state),
|
||||
show_svc_xprt_flags(__entry->flags)
|
||||
)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(svcsock_accept_class,
|
||||
TP_PROTO(
|
||||
const struct svc_xprt *xprt,
|
||||
const char *service,
|
||||
long status
|
||||
),
|
||||
|
||||
TP_ARGS(xprt, service, status),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(long, status)
|
||||
__string(service, service)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->status = status;
|
||||
__assign_str(service, service);
|
||||
memcpy(__entry->addr, &xprt->xpt_local, sizeof(__entry->addr));
|
||||
),
|
||||
|
||||
TP_printk("listener=%pISpc service=%s status=%ld",
|
||||
__entry->addr, __get_str(service), __entry->status
|
||||
)
|
||||
);
|
||||
|
||||
#define DEFINE_ACCEPT_EVENT(name) \
|
||||
DEFINE_EVENT(svcsock_accept_class, svcsock_##name##_err, \
|
||||
TP_PROTO( \
|
||||
const struct svc_xprt *xprt, \
|
||||
const char *service, \
|
||||
long status \
|
||||
), \
|
||||
TP_ARGS(xprt, service, status))
|
||||
|
||||
DEFINE_ACCEPT_EVENT(accept);
|
||||
DEFINE_ACCEPT_EVENT(getpeername);
|
||||
|
||||
DECLARE_EVENT_CLASS(cache_event,
|
||||
TP_PROTO(
|
||||
@@ -1368,6 +1655,86 @@ DEFINE_CACHE_EVENT(cache_entry_update);
|
||||
DEFINE_CACHE_EVENT(cache_entry_make_negative);
|
||||
DEFINE_CACHE_EVENT(cache_entry_no_listener);
|
||||
|
||||
DECLARE_EVENT_CLASS(register_class,
|
||||
TP_PROTO(
|
||||
const char *program,
|
||||
const u32 version,
|
||||
const int family,
|
||||
const unsigned short protocol,
|
||||
const unsigned short port,
|
||||
int error
|
||||
),
|
||||
|
||||
TP_ARGS(program, version, family, protocol, port, error),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, version)
|
||||
__field(unsigned long, family)
|
||||
__field(unsigned short, protocol)
|
||||
__field(unsigned short, port)
|
||||
__field(int, error)
|
||||
__string(program, program)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->version = version;
|
||||
__entry->family = family;
|
||||
__entry->protocol = protocol;
|
||||
__entry->port = port;
|
||||
__entry->error = error;
|
||||
__assign_str(program, program);
|
||||
),
|
||||
|
||||
TP_printk("program=%sv%u proto=%s port=%u family=%s error=%d",
|
||||
__get_str(program), __entry->version,
|
||||
__entry->protocol == IPPROTO_UDP ? "udp" : "tcp",
|
||||
__entry->port, rpc_show_address_family(__entry->family),
|
||||
__entry->error
|
||||
)
|
||||
);
|
||||
|
||||
#define DEFINE_REGISTER_EVENT(name) \
|
||||
DEFINE_EVENT(register_class, svc_##name, \
|
||||
TP_PROTO( \
|
||||
const char *program, \
|
||||
const u32 version, \
|
||||
const int family, \
|
||||
const unsigned short protocol, \
|
||||
const unsigned short port, \
|
||||
int error \
|
||||
), \
|
||||
TP_ARGS(program, version, family, protocol, \
|
||||
port, error))
|
||||
|
||||
DEFINE_REGISTER_EVENT(register);
|
||||
DEFINE_REGISTER_EVENT(noregister);
|
||||
|
||||
TRACE_EVENT(svc_unregister,
|
||||
TP_PROTO(
|
||||
const char *program,
|
||||
const u32 version,
|
||||
int error
|
||||
),
|
||||
|
||||
TP_ARGS(program, version, error),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, version)
|
||||
__field(int, error)
|
||||
__string(program, program)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->version = version;
|
||||
__entry->error = error;
|
||||
__assign_str(program, program);
|
||||
),
|
||||
|
||||
TP_printk("program=%sv%u error=%d",
|
||||
__get_str(program), __entry->version, __entry->error
|
||||
)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_SUNRPC_H */
|
||||
|
||||
#include <trace/define_trace.h>
|
||||
|
Reference in New Issue
Block a user